Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Les bases de la compilation

La leçon complète est à lire ici. Créez un compte gratuit pour la pratiquer dans un labo en direct.

Labo de machine virtuelle11 min de lecture10 commandes

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.

Commande
cd ~/compiler

Affiché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.

Commande
gcc -E hello.c | tail -n 8

Affiché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.

Commande
gcc -S hello.c

Affiché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.

Commande
cat hello.s

Affiché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.

Commande
gcc -c hello.c

Affiché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.

Commande
gcc hello.o -o hello

Affiché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.

Commande
./hello

Affiché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.

Commande
gcc -Wall -c scope.c

Affiché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.

Commande
make

Affiché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.

Commande
echo "2 + 3 * 4" | ./calc

Affiché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.

À propos de ce labo et de sa source: Lab de compilation et d’architecture : gcc, flex, bison et RISC-V dans une VM

Vous enseignez à une classe ? Proposez ces leçons à vos élèves avec correction et un labo pour chaque élève.