Compilation & langages formels · L3 · Section 8/8
Ressources
Progression
#Ressources - Compilation & WASM
Comment utiliser cette page: chaque chapitre du module produit un artefact vérifiable (tokens, AST, IR, module WAT). Après un chapitre, refaites l'artefact de mémoire, puis confrontez-le à un outil réel ou à une référence ci-dessous. Ces liens ne se lisent pas en ligne droite: on les ouvre quand une question précise se pose (« que fait exactement local.set ? », « à quoi ressemble la section binaire des exports ? »).
#Références
- Spécification WebAssembly (webassembly.github.io/spec/core/): la source de vérité sur les sections binaires, la validation et la sémantique. Pour ce module, le chapitre sur la structure du langage suffit; gardez le reste comme dictionnaire.
- MDN WebAssembly (developer.mozilla.org/fr/docs/WebAssembly): chargement et instanciation côté navigateur, API JavaScript (
WebAssembly.instantiate,Instance,exports), limites mémoire. - Crafting Interpreters (Robert Nystrom, gratuit en ligne): un compilateur complet écrit sous vos yeux. Les chapitres Scanning et Compiling Expressions reprennent, en plus riche, le pipeline des pages Lexing et Parsing de ce module.
- Engineering a Compiler (Cooper et Torczon): pour aller au-delà du module (SSA, allocation de registres, optimisations intermédiaires).
#Outils
- WABT (WebAssembly Binary Toolkit):
wat2wasmetwasm2watconvertissent texte et binaire,wasm-validatevérifie un module sans l'exécuter,wasm-objdumpaffiche les sections. C'est l'outillage minimal pour travailler hors navigateur. - Runtimes:
wasmtime run --invoke main module.wasmetwasmer run module.wasmexécutent un module et renvoient le résultat des fonctions exportées. Testez-y les modules WAT écrits dans la page WebAssembly. - Emscripten (emscripten.org): compile du C/C++ vers WASM avec sa colle JavaScript; utile pour comparer ce qu'un vrai compilateur émet face à un module écrit à la main.
- Compiler Explorer (godbolt.org): même fonction source, plusieurs langues et backends côte à côte; sélectionnez un compilateur avec sortie WebAssembly pour voir le coût réel de chaque construction.
#Sur la plateforme
- Chapitres du module:
lexing,parsing,ast,codegen,wasm,limits. Chacun contient un playground Python exécutable qui rejoue l'étape sur le même langage Expr. - La démo WASM de la page d'introduction instancie un vrai module binaire dans le navigateur: servez-vous-en comme oracle quand vous écrivez vos propres modules.
- Annales corrigées: les sujets d'examen de l'UE Compilation de L3 (Université Nice Sophia Antipolis, puis Université Côte d'Azur, cours de Sid Touati). Neuf exercices corrigés en détail: description lex d'un analyseur de log, structures de types d'un mini-C, attributs yacc, vérifications d'erreurs, algorithme de Sethi-Ullman (arbre, registres, code trois adresses, spills), traduction dirigée par la syntaxe, grammaire des expressions postfixées.
#Exercice de vérification rapide
Prédisez le résultat de main, sans exécuter, puis vérifiez avec wat2wasm + wasmtime, ou dans le playground de la page WebAssembly du module:
1(module2 (func (export "main") (result i32)3 i32.const 74 i32.const 35 i32.sub))Correction: la pile reçoit 7 puis 3; i32.sub dépile deux valeurs et pousse la première moins la seconde, donc 4. Si vous avez répondu -4, relisez l'ordre des opérandes: en notation postfixe le second élément poussé est l'opérande droit.