/* Fonction récursive en Tiger */
let
    function fact(n : int) : int =
        if n = 0
        then 1
        else n * fact(n - 1)
in
    print_int(fact(10))
end
S6 - 2025 6 semaines Équipe de 4

Tiger

Conception d'un compilateur pédagogique, de l'analyse du langage Tiger à sa traduction en représentation intermédiaire LLVM

C++20 Re/Flex & Bison LLVM IR Autotools Design Patterns

Le projet en quelques mots

Ce projet consistait à construire un compilateur pour Tiger, un langage conçu pour l'apprentissage. Un compilateur joue le rôle de traducteur : il lit le code écrit par un développeur, vérifie qu'il est cohérent, signale les erreurs, puis le transforme progressivement en instructions exploitables par l'ordinateur. En équipe, nous avons complété chaque étape de cette chaîne afin de comprendre ce qui se passe entre l'écriture d'un programme et son exécution.

≈14K
Lignes de code
4
Contributeurs
60+
Tests écrits
6
Semaines

Pipeline du Compilateur

📝

Scanner

Tokenisation avec Re/Flex

🌳

Parser

Grammaire GLR avec Bison

🌿

AST

Représentation et visitors

🔗

Binding

Portées et identifiants

🏷️

Typage

Vérification sémantique

🔄

Desugaring

Simplification de l'AST

Escapes

Variables capturées

λ

LLVM IR

Traduction intermédiaire

Chronologie du Projet

Présentation de Tiger

Découverte du langage, du compilateur et de son architecture

03/03/2025

Scanner, Parser et AST

Analyse lexicale, grammaire et construction de l'arbre syntaxique

10/03/2025

Bindings

Scoped map, gestion des portées et résolution des identifiants

19/03/2025

Type Checking

Vérification des expressions, déclarations, records et tableaux

26/03/2025

Traduction LLVM

Transformation de l'AST typé en représentation intermédiaire LLVM

07/04/2025

Extensions et Finalisation

Garbage collector, debugger et consolidation de la suite de tests

14/04/2025

Architecture en Couches

Frontend
// Grammaire Bison et construction de l'AST
%glr-parser
exp:
    INT { $$ = make_IntExp(@$, $1); }
  | exp "+" exp { $$ = make_OpExp(@$, $1, ast::OpExp::Oper::add, $3); }
;
Middle-end
// Visitors pour l'analyse sémantique
class Binder : public ast::DefaultVisitor {
    void operator()(ast::SimpleVar& e) override;
};

class TypeChecker : public ast::DefaultVisitor {
    const Type* type(ast::Typable& e);
};
Backend
// Traduction de l'AST vers LLVM IR
class Translator : public ast::DefaultConstVisitor {
    llvm::Value* translate(const ast::Ast& node);
    llvm::IRBuilder<> builder_;
};

Défis Techniques

01

Portées et Identifiants

Mise en place d'un scoped map et d'un binder pour relier chaque utilisation à sa déclaration, tout en respectant les différents espaces de noms du langage.

02

Système de Types

Vérification des expressions, fonctions, records, tableaux et valeurs nil. Les erreurs sémantiques sont collectées et rattachées aux emplacements du code source.

03

Mémoire et Closures

Analyse d'échappement des variables capturées et gestion des liens statiques lors de la traduction LLVM, complétées par l'intégration d'un garbage collector.

04

Tests et Débogage

Développement en équipe d'une suite de tests dédiée, ajout d'un debugger et utilisation des représentations textuelles de l'AST et de LLVM IR pour diagnostiquer les erreurs.

Synthèse du Projet

Travail réalisé

À partir d'une base pédagogique constituée de code à compléter, l'équipe a développé les différentes étapes du compilateur : analyse lexicale et syntaxique, construction de l'AST, résolution des identifiants, vérification des types, analyse d'échappement et traduction vers LLVM IR. Le travail a également inclus l'écriture des tests, ainsi que l'intégration d'un garbage collector et d'un debugger.

Ce que le projet m'a apporté

Ce projet m'a permis de comprendre concrètement le fonctionnement d'une chaîne de compilation et les interactions entre ses différentes étapes. Il m'a aussi appris à évoluer dans une base de code C++ conséquente, à appliquer des design patterns comme Visitor, Factory et Singleton, à diagnostiquer des erreurs sur plusieurs couches et à travailler en équipe.

Projet précédent 42sh Tous les projets Projet suivant JWS