L’arbre d’AP2 devient des octets pour une petite machine à pile. Quatre
ateliers se suivent : définir les instructions et leur format binaire, produire
ce code et l’exécuter sur une pile, donner des cases aux variables, puis
assembler les étiquettes et les sauts d’un case. Les arbres sont écrits à la
main dans les notebooks : votre parser d’AP2 n’a pas besoin d’être terminé.
Une cinquième étape, facultative et hors rendu, ajoute les appels de fonctions.
Nous commençons par quelques repères sur le processeur, mémoire adressée,
registres, PC, pile et cache, afin que chaque mot du TP ait été vu avant de
servir. Chaque étape alterne ensuite une courte explication, un essai dans
Livebook et une reprise entre nous. Juste avant chaque consigne, une slide
rappelle les formes Elixir que le notebook utilise, par ex. les motifs binaires,
with, les maps ou Enum.reduce, et le notebook les réexplique au moment où
elles servent. Vous recopiez votre propre code d’une étape à la suivante ;
aucun module n’est partagé automatiquement entre deux notebooks. Gardez vos
traces, vos contre-exemples et les raisons de vos corrections : ils comptent
autant que le code terminé.
En fin de séance, nous comparons la machine à l’interpréteur sur un même programme, puis nous regardons ce qu’un typeur saurait avant toute exécution : c’est le premier sujet d’approfondissement d’AP9.
Conservez vos étapes dans AP3/. Je préciserai en cours les notebooks à
terminer et le point d’arrêt attendu, selon notre avancement. Ce travail
rejoint le rendu du cycle AP1–AP3 au 6 décembre 2026 à 23 h 59. Les
prolongements non demandés restent facultatifs ; cf. Rendre un devoir.
Quand un bout de syntaxe vous manque, les chapitres 1 à 4 du poly
en donnent la forme avec un exemple.
Ouvrir les ateliers
1. Lire et écrire des instructions
Définissez un format binaire et distinguez opcode, opérande et adresse en octets.
Slides 12 à 19Elixir : motifs binaires <<…>>, byte_size/1 · poly, chap. 6.
2. Faire tourner une machine à pile
Suivez le compteur ordinal, la pile et la boucle lecture–décodage–exécution. Compilez un arbre arithmétique en postordre.
Slides 20 à 29Elixir : la pile est une liste, with · poly, chap. 3, 4 et 6.
3. Où ranger les variables ?
Associez les noms à des cases locales. Distinguez la table du compilateur des valeurs manipulées par la machine.
Slides 31 à 38Elixir : maps, Map.fetch/2, Map.put/3 · poly, chap. 6.
4. Assembler et prendre une branche
Résolvez les étiquettes en deux passes, calculez les adresses et compilez case avec deux sauts.
Slides 39 à 48Elixir : Enum.reduce/3 avec accumulateur, tuples comme étiquettes · poly, chap. 6.
