nebino

Compilateur vers C

Un compilateur d’un langage impératif vers C, enrichi d’un garbage collector par reference counting.

Contexte et rôle

Projet de compilation : produire, étape par étape, un programme C équivalent au programme source. J’ai implémenté les quatre étapes évaluées, puis l’extension garbage collector.

Architecture

Programme sourcelangage impératif
Lexer et parserconstruit l’AST
Pretty-printerréaffiche l’AST
Binderrésolution des noms
Type checkervérification des types
Générateur de codeémet le programme C
Reference countinggarbage collector du runtime
Chaque étape consomme le résultat de la précédente.

Les étapes

Lexer et parser
Analyse lexicale et syntaxique, construction de l’AST
Pretty-printer
Réaffichage de l’AST pour vérifier l’analyse
Binder et type checker
Résolution des noms et des portées, vérification des types
Génération de code
Production du code C
Garbage collector
Reference counting dans le code généré

Choix technique : le reference counting

Un objet est libéré dès que plus rien ne le référence, et la méthode s’insère simplement dans le code généré : un retain à chaque copie de pointeur, un release à chaque destruction. Contrepartie : comme toute méthode de ce type, elle ne récupère pas les cycles. L’article Reference counting détaille le principe et les pièges.

Difficultés

Les bugs les plus instructifs : erreurs de portée dans le binder, segfaults et doubles décrémentations de compteurs. Un retain oublié libère trop tôt, un release en double corrompt la mémoire : tout l’enjeu est de placer ces appels aux bons endroits.

Résultat

Étapes
Les quatre étapes évaluées sont complètes
Extension
Garbage collector par reference counting

Voir aussi : article sur le reference counting, tous les projets