Lab de compilation et d’architecture : gcc, flex, bison et RISC-V dans une VM
Ce lab donne à chaque élève sa propre machine Ubuntu, avec un vrai compilateur C et les outils qui l’entourent, ainsi qu’une chaîne RISC-V et un émulateur. Les élèves voient un programme passer par chaque étape de la compilation, construisent une petite calculatrice à partir d’un analyseur lexical et d’un analyseur syntaxique, et lancent un programme RISC-V alors que la machine n’est pas RISC-V. Rien n’est installé sur l’ordinateur de l’élève.
Ce que les élèves apprennent
Les quatre étapes d’une compilation : le prétraitement avec gcc -E, la compilation en assembleur avec gcc -S, l’assemblage en fichier objet avec gcc -c, puis l’édition de liens. La différence entre une erreur et un avertissement, grâce à gcc -Wall sur un programme qui utilise une variable hors de sa portée. Les lexèmes et la grammaire, avec une calculatrice construite avec flex et bison qui respecte l’ordre des opérations.
Les registres, les instructions et les appels système, avec cinq lignes d’assembleur RISC-V qui additionnent deux nombres et laissent le résultat comme code de sortie. Les instructions vues comme des nombres, lues avec objdump. L’intérêt d’un cache, avec un programme qui additionne un tableau ligne par ligne puis colonne par colonne et chronomètre chaque passage. Et le compteur ordinal, en avançant instruction par instruction dans gdb.
Ce que contient la machine
gcc, make, binutils, gdb, flex, bison, python3 et file, tous issus de l’archive d’Ubuntu. Un compilateur et un assembleur croisés pour RISC-V, riscv64-linux-gnu-gcc et -as, et qemu-user, dont qemu-riscv64 lance un programme RISC-V sur le processeur de la VM.
Dans le dossier compiler : hello.c, un petit programme avec une macro et une fonction ; scope.c, avec une variable jamais utilisée et une autre utilisée là où elle n’existe pas ; et calc.l, calc.y et un Makefile pour la calculatrice. Dans le dossier arch : add.s, le programme RISC-V, et loop.c, la mesure du cache.
Le lancer dans votre navigateur
Les labs VM se donnent comme une tâche de lab dans un module, et l’exemple se trouve sur la page du lab. La machine est petite : un processeur, 1 Go de mémoire et 10 Go de disque, ce qui suffit largement pour des programmes de quelques lignes.
- Ajouter le lab. Dans un module que vous enseignez, ajoutez une tâche et choisissez la carte « Lab VM Ubuntu ». La page affiche une courte description de la machine au lieu d’un fichier compose.
- Partir de l’exemple. La page propose des labs prêts à l’emploi pour commencer. Choisissez Compilers and computer architecture (compilation et architecture des ordinateurs). Utiliser un exemple remplace le texte, et « Annuler » rétablit le vôtre.
- Publier et démarrer votre propre copie. Publiez, puis « Démarrer ». Le script d’installation du lab installe les compilateurs et les outils à partir de l’archive d’Ubuntu et dépose les programmes dans le dossier personnel au premier démarrage de la VM, en quelques minutes.
- Ouvrir le terminal. Ouvrez son terminal et lisez README.md dans le dossier personnel : il liste les programmes des dossiers compiler et arch. Ouvrez ensuite Compilers Basics.
Une leçon de base sur ce lab
Il y a deux courtes leçons, chacune faite dans ce lab : Compilers Basics et Computer Architecture Basics. Chacune se suffit à elle-même, commence dans son propre dossier, et comporte une accroche, un objectif « Je peux », des mots-clés, une mise en route, une vérification après chaque idée et une vérification finale.
Un bouton Exécuter tape sa commande dans le terminal de la VM et montre ce qui s’est affiché. gdb attend ce que l’on tape ensuite : il est donc marqué « Tape ceci », et l’élève le tape dans le terminal.
En classe
Le lab ne note rien : il convient à un premier TP de compilation ou d’architecture, à une démonstration sur l’écran de l’enseignant, ou à une séance avant un devoir écrit en Python.
- Le distribuer. Attribuez le lab et les leçons comme n’importe quelle tâche, avec une date limite si vous le souhaitez. Chaque élève a sa propre VM, conservée d’une séance à l’autre.
- Les regarder travailler. Le terminal à côté d’une leçon est celui de l’élève : vous pouvez le regarder ou en prendre la main depuis la liste de la classe pendant qu’il tape.
- Noter vous-même si vous voulez une note. Le lab n’a pas de script de vérification. Si vous voulez un rendu, demandez quelque chose de court, comme les deux temps affichés par loop et une phrase qui explique leur différence.
La définition sur GitHub
Le fichier est la définition complète du lab, le texte même que la plateforme exécute : taille, script d’installation et README. Copiez-le et ajoutez-y un programme à vous pour faire un lab pour votre classe.
Questions fréquentes
- Le lab a-t-il besoin d’un processeur RISC-V ?
- Non. La VM tourne sur un processeur ordinaire, et qemu-riscv64 y exécute un programme RISC-V une instruction après l’autre. Le programme, l’assembleur et l’éditeur de liens sont de vrais outils RISC-V, et file désigne bien le programme comme RISC-V.
- Pourquoi l’assembleur produit par gcc -S est-il différent sur une autre machine ?
- gcc -S écrit l’assembleur du processeur sur lequel il tourne, qui peut être x86-64 ou Arm. La leçon le dit et demande de trouver l’appel à la fonction, qui s’écrit call sur l’un et bl sur l’autre.
- Les élèves peuvent-ils abîmer quelque chose ?
- Seulement leur propre copie. Si un élève casse la machine, il peut arrêter le lab et le redémarrer.
- Le lab de compilation et d’architecture est-il noté automatiquement ?
- Non. Il n’a pas de script de vérification, car les leçons sont l’activité. Donnez un petit rendu de votre choix, par exemple une courte tâche Python avec des tests cachés qui simule ce que le lab a montré.