Un jeu écrit en mots, joué en nombres
Un jeu de console est écrit par des gens, avec des mots qu'ils savent lire. Le processeur de la console ne lit pas ces mots. Il n'exécute que ses propres instructions, qui sont des nombres.
Il faut donc traduire le jeu. Il existe deux grandes façons de le faire, et ta machine du lab sait faire les deux.
À la fin de cette leçon
Remarque
Je peux expliquer en quoi un compilateur et un interpréteur diffèrent.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Code source | un programme tel que les gens l'écrivent | hello.c |
| Code machine | des instructions en nombres que le processeur exécute | |
| Traducteur | un programme qui change le code source en quelque chose d'exécutable | |
| Compilateur | un traducteur qui change tout le programme en code machine avant qu'il tourne | |
| Interpréteur | un traducteur qui lit et exécute le programme une instruction à la fois | |
| Lexème | un mot du programme : un nom, un nombre ou un signe |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Trois sortes de traducteurs
Un assembleur change l'assembleur en code machine, une instruction par ligne.
Un compilateur lit d'abord tout le programme. S'il trouve une faute, il s'arrête et la signale : rien ne tourne. Si tout va bien, il écrit un fichier de code machine qu'on peut lancer autant de fois qu'on veut.
Un interpréteur lit une instruction, l'exécute, puis lit la suivante.
Compilateur et interpréteur côte à côte
| Question | Compilateur | Interpréteur |
|---|---|---|
| Quand le programme est-il traduit ? | En entier, avant de tourner | Une instruction à la fois, pendant qu'il tourne |
| Un fichier programme est-il créé ? | Oui, il tourne ensuite sans compilateur | Non, il faut l'interpréteur à chaque fois |
| Quand une faute est-elle trouvée ? | Avant que rien ne tourne | Quand la ligne est atteinte |
| Lequel va le plus vite ? | En général le programme compilé | En général plus lent |
| Dans le lab | gcc | python3 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Avant de commencer
Remarque
Appuie sur Start the lab dans la barre en haut et attends que la machine soit prête. Chaque bouton Run tape sa commande dans le terminal, l'une après l'autre.
Va dans le dossier compiler
cd ~/compilerAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compile hello.c en programme
gcc hello.c -o helloAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lance le programme créé par gcc
./helloAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compile un programme qui a une faute
gcc -Wall -c scope.cAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un interpréteur trouve la faute tard
gcc a lu tout scope.c et l'a refusé. Il n'a créé aucun programme.
Écris maintenant un fichier Python de deux lignes. La première affiche un mot. La seconde utilise un nom, total, qui n'a jamais reçu de valeur. Regarde ce que fait Python.
Écris un fichier Python de deux lignes
printf 'print("debut")\nprint(total)\n' > tard.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lance-le avec l'interpréteur
python3 tard.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un compilateur travaille par étapes
L'analyse lexicale découpe les caractères en lexèmes et jette les espaces et les commentaires.
L'analyse syntaxique vérifie les lexèmes avec la grammaire du langage et construit un arbre du programme. La génération de code change l'arbre en code machine, et l'optimisation le rend plus petit ou plus rapide.
Écris une ligne de Python
echo 'print(6 * 8)' > calcul.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Découpe-la en lexèmes
python3 -m tokenize calcul.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent qu'un interpréteur ne traduit rien. Python change d'abord ton fichier en bytecode, des instructions simples pour sa propre machine. Le Run suivant le montre. Cherche 48 : Python a calculé 6 × 8 avant de lancer quoi que ce soit.
Affiche le bytecode
python3 -m dis calcul.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin : la calculatrice du lab
Le programme calc du lab est une calculatrice. Son analyseur lexical est fait par flex et son analyseur syntaxique par bison. Appuie sur Open terminal, tape make, puis echo "4 $ 4" | ./calc.
Elle affiche deux lignes. Laquelle vient de l'analyseur lexical, et laquelle de l'analyseur syntaxique ? Comment le sais-tu ?