#Compilation et langages formels: introduction
Ce module suit un fil conducteur unique: un petit langage d'expressions arithmétiques avec variables, noté Expr, qui traverse toutes les étapes du pipeline. Chaque page transforme le même artefact: le texte source devient une suite de tokens, puis un AST, puis une IR à pile, puis un module WebAssembly exécutable dans le navigateur.
Contexte pédagogique: niveau L3 (Valrose, UCA). Prérequis conseillés: expressions régulières et automates finis (module Langages formels), bases de Python ou JavaScript pour les ateliers, et notions d'architecture (pile, entiers 32 bits) pour la partie codegen.
#Le pipeline en une image
1source "2*(3+4)-5"2 │ lexing (page suivante)3 ▼4tokens NUM(2) * ( NUM(3) + NUM(4) ) - NUM(5)5 │ parsing6 ▼7AST ('-', ('*', 2, ('+', 3, 4)), 5)8 │ analyse sémantique / IR9 ▼10code pile push 2; push 3; push 4; add; mul; push 5; sub11 │ génération de code12 ▼13WASM i32.const 2 … i32.sub (module binaire exécutable)Chaque flèche est une fonction pure: même entrée, même sortie. C'est cette prévisibilité qui rend un compilateur testable maillon par maillon.
#Pourquoi ça sert
Comprendre le pipeline de compilation améliore la lecture des erreurs (un message « unexpected token » vient du parseur, un « type mismatch » de l'analyse sémantique, un « unreachable code » de l'IR). Les mêmes techniques construisent des linters, des formatters, des moteurs de templates et des outils de requête. WebAssembly illustre quant à lui comment une cible d'exécution moderne se conçoit: format binaire validé avant exécution, machine à pile typée, bac à sable sans accès disque ni réseau direct.
#Démo WebAssembly (f donne 42)
Le composant ci-dessous instancie un module WASM réel dans votre navigateur et appelle sa fonction exportée. Toute la chaîne décrite dans ce module aboutit à ce type d'artefact.
#Plan du module
- Lexing: du texte aux tokens, règles, priorités, plus long match.
- Parsing: grammaires EBNF, descente récursive, précédence et associativité.
- AST: représentation abstraite, positions source, évaluation avec environnement.
- Génération de code: IR à pile, codegen WASM, constant folding.
- WebAssembly: modèle d'exécution, WAT, cycles de vie d'un module.
- Limites: contraintes d'exécution côté navigateur, mémoire, sécurité.
Le langage Expr garde volontairement une grammaire minuscule pour que chaque page reste lisible; les exercices d'extension (identifiants, mots-clés, affectations) montrent comment la même architecture grandit sans être réécrite.