par William Badiabantou

William a créé son premier langage chiffré en sixième pour communiquer avec sa copine. Il a créé son deuxième pour écrire un livre ("The invisible") racontant l’histoire d’une civilisation inspiré du manuscrit de Voynich, de Kryptos, et de plein d’autres langages.

Un langage, avant tout, c’est un moyen de communication. Un langage de programmation permet à un humain de communiquer avec un ordinateur. Le compilateur permet de transformer le langage de haut niveau (un flux de caractère) en langage de bas niveau. Le compilateur effectue un ensemble de transformation pour passer de l’un à l’autre.

Le front-end analyse le code source Le middle end optimise Le backend génère le langage bas-niveau.

Pour lire ce langage, il faut définir une grammaire (formes BNF ou EBNF).

Donc maintenant, on va écrire un compilateur, en Rust, évidement. Le projet s’appelle qhantoom et est disponible dans GitHub.

Les possibilités d’interprétation d’un langage sont multiples

On a donc

  • le tokenizer lit la chaîne de caractère et y associe des tokens
  • le parser génère l’AST à partir de ces tokens
  • l’analyzer contrôle les types définit dans l’AST et valide que les éléments sont bien compatibles
  • le code generator convertit l’AST ou une représentation intermédiaire en code exécutable (en tenant compte des scopes de déclaration des différentes variables)

Evidement, tout ça peut se faire en AOT (ahead of time) ou JIT (Just In Time)

William utilise cranelift pour effectuer ces opérations. Et on passe à la démo.

Cette démonstration nous montre un langage complet, pour lequel William dispose d’un repl, et d’un compilateur (offerts par cranelift). C’est vraiment séduisant.

En conclusion, il y a beaucoup de concepts à aborder, qui ont été fortement simplifiés par les travaux académiques. Et l’énergie follement chouette de William m’a beaucoup rappelé Xavier Van de Woestyne. Avec ce talk, on était vraiment dans le turfu !