Aller au contenu principal

Compilation & langages formels · L3 · Section 8/8

Ressources

Progression

Points d’expérience : XPSérie de jours consécutifs : · —Progression du module : — / —compris

#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): wat2wasm et wasm2wat convertissent texte et binaire, wasm-validate vérifie un module sans l'exécuter, wasm-objdump affiche les sections. C'est l'outillage minimal pour travailler hors navigateur.
  • Runtimes: wasmtime run --invoke main module.wasm et wasmer run module.wasm exé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:

watwat

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.