Une commande, quatre étapes
Tu tapes une seule commande, et un programme C devient quelque chose que la machine peut lancer. Cette commande cache quatre étapes. Quand une compilation échoue, l’erreur vient de l’une d’elles. Savoir laquelle a parlé te dit où chercher.
À la fin de cette leçon
Remarque
Je peux nommer les étapes par lesquelles un compilateur fait passer un programme.
Mots-clés
- Compilateur : un programme qui traduit le code source en instructions pour un processeur.
- Préprocesseur : la première étape, qui colle des fichiers et remplace des noms.
- Assembleur (le langage) : les instructions d’un processeur, écrites en mots.
- Éditeur de liens : la dernière étape, qui assemble des morceaux de code machine en un seul programme.
- Lexème (ou jeton) : un mot d’un programme, comme un nombre ou un signe.
- Analyseur syntaxique : la partie qui vérifie les lexèmes par rapport à la grammaire.
Pour commencer : ce que tu sais déjà
Remarque
Réponds dans ta tête. 1. Que fait cd ? 2. Qu’affiche cat ? 3. Que contient un fichier dont le nom finit par .c ? Tu as besoin de la troisième réponse tout de suite.
Avant de commencer
Remarque
Appuie sur Démarrer le lab dans la barre en haut de cette leçon. Ce lab est une machine Ubuntu entière, rien que pour toi : elle met un peu plus de temps à démarrer qu’un conteneur. Chaque bouton Exécuter tape sa commande dans le terminal de la machine, l’une après l’autre, dans la même session. Si l’un d’eux dit que la machine démarre encore, attends quelques secondes et appuie de nouveau. Quand la leçon dit Tape ceci, le programme attend que tu lui écrives : appuie sur Ouvrir le terminal dans la barre et tape toi-même.
Le préprocesseur colle et remplace
gcc -E s’arrête après la première étape et affiche ce qu’elle a produit. La ligne #include <stdio.h> est devenue des centaines de lignes, donc tail -n 8 n’en montre que la fin. Regarde main : le nom GREETING a disparu, et le texte de la macro est à sa place. Le commentaire a disparu lui aussi.
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.
gcc -E hello.c | tail -n 8Affiché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.
Vérifie
Astuce
Qu’est devenu GREETING ? Réponse : le préprocesseur l’a remplacé par son texte, avant même que le compilateur ne voie le programme.
Compiler, assembler, lier
gcc -S s’arrête après la compilation et écrit hello.s, le programme en assembleur pour le processeur de cette machine. Trouve-y square et main, et le call ou le bl qui appelle square. gcc -c va une étape plus loin et écrit hello.o, du code machine. Le dernier gcc le lie à la bibliothèque C, où se trouve printf, pour en faire un programme.
gcc -S hello.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.
cat hello.sAffiché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.
gcc -c hello.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.
gcc hello.o -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.
./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.
Une erreur fréquente
Attention
Beaucoup pensent qu’un compilateur transforme le C en programme d’un seul coup, et que toute erreur est donc une faute dans le code. Il y a quatre étapes. Une erreur comme undefined reference to suivi d’un nom vient de l’éditeur de liens : le code a bien été compilé, mais un morceau dont il a besoin n’a pas été donné à la dernière étape.
Vérifie
Astuce
Quelle commande s’arrête à l’assembleur, et laquelle écrit le fichier objet ? Réponse : gcc -S écrit hello.s, et gcc -c écrit hello.o.
Le compilateur vérifie aussi le sens
Un programme peut respecter toute la grammaire du C et ne rien vouloir dire. Dans scope.c, step est créée dans la boucle et utilisée après, là où elle n’existe plus. -Wall demande à gcc ses avertissements courants. Lis la réponse : une erreur, step n’est pas déclarée, qui arrête la compilation, et un avertissement, unused ne sert jamais.
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 analyseur lexical et un analyseur syntaxique à construire
calc.l indique à flex la forme de chaque lexème : un nombre, un signe ou une parenthèse. calc.y donne à bison la grammaire, et précise que * et / passent avant + et -. make lit le Makefile et lance bison, flex et gcc dans le bon ordre. La calculatrice affiche alors 14 pour le calcul, et non 20.
makeAffiché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.
echo "2 + 3 * 4" | ./calcAffiché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.
Vérification finale
Astuce
Réponds sans regarder en arrière. 1. Cite les quatre étapes dans l’ordre. 2. Quelle étape remplace une macro ? 3. Quelle partie transforme les caractères en lexèmes ? 4. Une variable inutilisée, est-ce une erreur ou un avertissement ? Réponses : prétraitement, compilation, assemblage, édition de liens ; le préprocesseur ; l’analyseur lexical, ici produit par flex ; un avertissement.
Pour les enseignants
Astuce
Cette leçon se fait dans un lab de type machine virtuelle : chaque élève a sa propre machine Ubuntu, et un bouton Exécuter tape dans son terminal et montre ce qui s’est affiché. Points clés : 1. Une compilation a quatre étapes : prétraitement, compilation, assemblage et édition de liens. 2. gcc -E, -S et -c s’arrêtent après chacune pour qu’on puisse la lire. 3. Un analyseur lexical produit des lexèmes, et un analyseur syntaxique les vérifie par rapport à une grammaire. Erreur fréquente : prendre une erreur de l’éditeur de liens pour une faute dans le code. Matériel : le lab et un navigateur. Conseil : mettez hello.c à côté de hello.s et demandez de retrouver chaque ligne de C dans l’assembleur. Le lab n’a pas de vérification et ne note rien ; donnez un travail à rendre de votre choix si vous voulez une note.