Terminale · Langages et programmation

Un programme est aussi une donnée

Le fichier qui contient votre programme peut être copié, téléchargé, affiché et analysé. Avant même de l’exécuter, un éditeur le traite comme une suite de caractères. Cette idée, apparemment simple, ouvre la porte aux interpréteurs, aux compilateurs et à la notion de machine universelle.

SofienAvec SofienIngénieur et enseignant en informatique
Dans ce chapitre

Un cap pour ce chapitre

Ce que vous saurez faire

  • Expliquer comment un programme devient l’entrée d’un autre.
  • Distinguer code source, traduction et exécution.
  • Suivre un interpréteur de mini-langage.
Les bases utiles pour commencer

Des caractères avec une signification possible

Le texte x = 3 peut être stocké dans un fichier ou dans une chaîne Python. Tant qu’un mécanisme ne l’interprète pas comme une instruction, il reste une donnée. L’éditeur peut compter ses caractères, appliquer une coloration ou rechercher le nom x sans réaliser l’affectation décrite.

Un fichier source possède donc plusieurs niveaux de lecture : des octets encodent des caractères ; ces caractères peuvent former des symboles et une structure reconnus par un langage ; un interpréteur ou une chaîne de compilation leur donne ensuite un rôle exécutable. Le même texte peut être valide dans un langage et invalide dans un autre.

Un éditeur peut donc modifier un programme sans l’exécuter, tout comme on corrige une recette sans cuisiner. Cette analogie distingue la représentation des actions de leur réalisation. Quand un interpréteur lit cette représentation, il applique une règle à un état et produit un nouvel état.

Interpréter une description

Un interpréteur reçoit une représentation de programme et en réalise les opérations selon les règles du langage. Construisons un mini-langage contenant seulement AVANCE n et TOURNE. AVANCE ajoute n à une position entière ; TOURNE inverse le sens du déplacement. La machine conserve une position et une direction : ces éléments forment son état.

À chaque instruction, l’interpréteur reconnaît la commande et met à jour cet état. Il doit aussi traiter les erreurs, par exemple une commande inconnue ou un nombre absent. Reconnaître le texte et réaliser son effet sont deux opérations distinctes. L’atelier utilise une liste fermée de commandes ; il n’exécute aucun code fourni librement.

Compiler pour produire une autre représentation

Un compilateur traduit un programme vers un langage cible, qui peut être du code machine ou une représentation intermédiaire. Le fichier produit pourra ensuite être exécuté par un environnement adapté. L’interprétation met plutôt l’accent sur l’exécution d’une représentation ; la compilation sur sa traduction. Des environnements réels combinent les deux.

Dire « Python est interprété » reste une simplification : une implémentation peut traduire le source en bytecode avant son exécution. La propriété fondamentale ici est que ces outils sont eux-mêmes des programmes qui manipulent d’autres programmes comme données. Changer la stratégie d’exécution ne modifie pas automatiquement le résultat spécifié d’un programme correct.

Raisonner sur les niveaux

Considérons source = "print(2 + 3)". La variable contient une chaîne ; afficher source écrit les caractères de l’expression, pas le nombre cinq. Il faudrait un traitement d’interprétation pour donner à cette chaîne le sens du programme décrit. Confondre les deux niveaux conduit à des prédictions d’exécution erronées.

Cette capacité à représenter les programmes comme des données explique qu’un ordinateur généraliste puisse télécharger un nouveau logiciel plutôt que changer de circuit pour chaque tâche. Elle rend aussi possibles des outils d’analyse, des tests automatisés et des transformations de code. Elle ne signifie pas qu’un programme puisse décider automatiquement toute propriété de tous les autres programmes.

source = "print(2 + 3)"
print(source)

Exemple suivi : rendre l’état explicite

Une petite machine commence à la position 0 dans la direction +1. Le programme AVANCE 2 ; TOURNE ; AVANCE 5 ; TOURNE ; AVANCE 1 produit les états successifs (2,+1), (2,-1), (-3,-1), (-3,+1), (-2,+1). Le premier nombre est la position ; le second multiplie la distance d’une avance. Une commande de rotation ne change donc pas la position. Ce tableau suffit à vérifier le programme sans déplacer un robot réel.

Deux machines à la même position peuvent exécuter différemment la prochaine commande si leurs directions diffèrent. Conserver seulement la position perdrait une information nécessaire. On ajoute aussi un indice d’instruction pour savoir quelle commande lire ensuite. Programme, état et instruction courante ont donc des rôles distincts : la liste est une donnée stable, tandis que l’interpréteur actualise les variables d’état à chaque pas.

Exemple suivi : analyser sans lancer le programme

Un outil reçoit les trois lignes AVANCE 3, TOURNE, AVANCE 2. Il peut compter trois instructions, vérifier que les commandes appartiennent au vocabulaire et que les avances possèdent un argument numérique. Aucune de ces opérations n’oblige à calculer la position finale. Un autre outil peut traduire chaque instruction vers un format numérique convenu, par exemple une paire (code de commande, argument), puis enregistrer ces paires.

La traduction doit préserver le sens prévu : si le code 0 signifie avancer et le code 1 signifie tourner, le lecteur du format cible doit utiliser la même convention. On vérifie cette propriété sur plusieurs programmes, notamment deux rotations consécutives et une avance nulle. Une erreur de commande se détecte à la lecture ; un dépassement d’une zone peut n’apparaître qu’au cours de l’exécution. Cette séparation annonce le travail des compilateurs et interpréteurs sans exiger leur fonctionnement complet.

À vous de faire varier les choses

Observez l’état d’un mini-interpréteur

Choisissez un programme et le nombre d’instructions exécutées. TOURNE inverse la direction, AVANCE utilise cette direction.

Lire le résultat de l’expérience initiale

Position 1, direction négative.

Le programme est la liste de commandes ; l’état contient la position et la direction qui évoluent.

ÉtapeInstructionPositionDirection
0Départ0+1
1AVANCE 331
2TOURNE3-1
3AVANCE 21-1

Une même représentation de programme peut être affichée, analysée puis interprétée en suivant des règles explicites.

De la compréhension à l’autonomie

À vous de résoudre

Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.

Exercice 1 · Comprendre#

Lire ou exécuter ?

Que produit le programme affiché dans le cours : le nombre 5 ou le texte print(2 + 3) ? Justifiez.

Indice 1

Repérez les guillemets lors de l’affectation.

Indice 2

La fonction print reçoit la valeur contenue dans source.

Comprendre la correction

Il affiche le texte print(2 + 3). Les guillemets créent une chaîne ; le contenu de cette chaîne n’est pas automatiquement exécuté. L’addition appartient au texte stocké, pas à l’expression évaluée par la seconde ligne.

Exercice 2 · Appliquer#

Suivre un mini-langage

On part de position 0, direction positive. Exécutez AVANCE 3, TOURNE, AVANCE 2.

Indice 1

TOURNE change la direction sans déplacer.

Indice 2

La dernière avance se fait dans le sens négatif.

Comprendre la correction

Après AVANCE 3, la position vaut 3. TOURNE remplace la direction positive par négative sans changer la position. AVANCE 2 conduit alors à 1. Il faut conserver les deux composantes de l’état pour expliquer le résultat.

Exercice 3 · Distinguer#

Identifier une traduction

Un outil lit un fichier source et écrit un fichier dans un langage cible sans lancer le résultat. Réalise-t-il une compilation ou l’exécution du programme cible ?

Indice 1

Examinez ce que l’outil produit.

Indice 2

Traduire ne signifie pas lancer immédiatement.

Comprendre la correction

Il réalise une compilation : il transforme une représentation du programme en une autre. Le programme cible pourra être exécuté ensuite. Le compilateur s’exécute pendant cette transformation, mais ce n’est pas la même chose que lancer le programme qu’il produit.

Exercice 4 · Analyser#

Distinguer deux erreurs

Dans notre mini-langage, SAUTE 4 n’existe pas. AVANCE 4 est valide mais fait dépasser une zone autorisée. Pourquoi ces défauts ne sont-ils pas de même nature ?

Indice 1

Le premier texte respecte-t-il le vocabulaire ?

Indice 2

Le second peut être compris même si son effet n’est pas souhaité.

Comprendre la correction

SAUTE est une commande inconnue : l’interpréteur ne peut pas lui attribuer une opération du langage. AVANCE 4 est compréhensible mais peut violer une contrainte d’usage ou la spécification du problème. Un programme syntaxiquement valide n’est donc pas nécessairement correct pour son objectif.

Exercice 5 · Problème de synthèse#

Problème : comparer deux états

Deux machines lisent AVANCE 4 ; TOURNE ; AVANCE 1. La première commence en (0,+1), la seconde en (0,-1). Tracez leurs états et comparez les positions finales. La connaissance du programme et de la position initiale suffit-elle sans la direction ?

Indice 1

Une avance ajoute la distance multipliée par la direction.

Indice 2

La rotation inverse le signe sans changer la position.

Comprendre la correction

La première passe par (4,+1), (4,-1), puis (3,-1). La seconde passe par (-4,-1), (-4,+1), puis (-3,+1). Les positions finales sont 3 et -3. Le même programme ne détermine pas un résultat sans état initial complet ; oublier la direction rend l’interprétation ambiguë.

Exercice 6 · Problème de synthèse#

Problème : lire une représentation

On stocke source = "AVANCE 2". Un outil A affiche la chaîne ; un outil B compte ses caractères ; un outil C interprète la commande à partir de (0,+1). Donnez les trois résultats, espaces inclus dans le comptage. Expliquez pourquoi seule l’opération C déplace la machine du modèle.

Indice 1

AVANCE contient six lettres.

Indice 2

Les guillemets délimitent la chaîne mais n’en font pas partie.

Comprendre la correction

A affiche AVANCE 2. B renvoie 8 : six lettres, un espace et un chiffre. C produit l’état (2,+1). Les trois outils reçoivent la même donnée mais appliquent des traitements différents. Le texte ne devient pas exécutable du seul fait qu’il ressemble à une commande ; un mécanisme doit lui donner ce rôle.

Exercice 7 · Problème de synthèse#

Problème : tester une traduction

Un format cible code AVANCE n par (0,n) et TOURNE par (1,0). Traduisez avancer 3, tourner, avancer 2. Un lecteur cible traite par erreur le code 1 comme une avance nulle. Quelle position finale produit-il ? Proposez un test minimal détectant l’erreur.

Indice 1

Avec la mauvaise interprétation, la direction ne change jamais.

Indice 2

Une rotation suivie d’une avance suffit pour faire diverger les résultats.

Comprendre la correction

La traduction est [(0,3),(1,0),(0,2)]. Le lecteur fautif atteint 5 au lieu de 1 puisqu’il avance deux fois dans le sens positif. Le programme TOURNE puis AVANCE 1 distingue déjà les versions : résultat attendu -1, résultat fautif +1 depuis la position zéro. Une traduction et son lecteur doivent partager une convention de sens.

Les erreurs qui méritent un détour

Exécuter mentalement toute chaîne ressemblant à du Python.
Une chaîne reste une donnée tant qu’aucun mécanisme ne lui donne ce rôle.
Croire que compiler prouve la correction.
Une traduction réussie ne vérifie pas toutes les attentes du problème.

La fiche à garder

L’essentiel à retenir

  • Un programme possède une représentation manipulable comme donnée.
  • Un interpréteur exécute selon des règles ; un compilateur traduit.
  • Validité d’une représentation et correction pour un besoin sont distinctes.

Cette notion au bac

Retrouvez ces idées dans un sujet complet, avec des indices, une correction expliquée et des ateliers.

Le prochain pas

Retrouver le catalogue de Terminale

Ce chapitre s’appuie sur le programme officiel de Terminale (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.