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
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