4 points par miniex 2025-11-11 | Aucun commentaire pour le moment. | Partager sur WhatsApp

Bonjour, une de mes connaissances a récemment développé un backend de compilateur, et comme je le trouve assez intéressant, je le partage ici.

  1. Présentation du projet

Lamina est un backend de compilateur multi-architecture qui génère directement du code natif à partir d’un IR basé sur SSA, sans dépendances lourdes comme LLVM. Il prend en charge x86_64, AArch64, RISC-V et WebAssembly avec un IR unique.

Il paraît qu’à chaque fois qu’il créait un DSL simple ou un langage expérimental, devoir compiler LLVM et gérer plusieurs Go de dépendances lui semblait beaucoup trop lourd. Il a donc commencé avec l’idée de « faire quelque chose de léger où il suffit d’injecter l’IR pour obtenir de l’assembleur ».

  1. Principales caractéristiques

▸ Zéro dépendance externe
Conversion directe de l’IR vers le code machine, sans LLVM ni Cranelift.
Le temps de build est court et le déploiement est simple.

▸ IR basé sur SSA
Grâce à sa forme Static Single Assignment, la composition du pipeline d’optimisation reste propre.

▸ Modèle mémoire explicite
Les allocations sur la pile et sur le tas sont clairement distinguées au niveau de l’IR, ce qui facilite l’analyse mémoire.

▸ Multi-architecture
Prise en charge de plusieurs cibles avec un seul IR :

  • x86_64 (Linux, macOS, Windows)
  • AArch64/ARM64 (Linux, macOS, Windows)
  • RISC-V (RV32/64/128)
  • WebAssembly (32/64-bit)

▸ API IRBuilder
Fournit une API permettant de construire l’IR dans un style fonctionnel.
Elle permet apparemment d’exprimer le contrôle de flux ou les opérations mémoire de façon type-safe.

  1. État actuel

Les opérations arithmétiques de base, le contrôle de flux comme les conditions/branchements/boucles, les appels de fonctions non récursifs et quelques optimisations fonctionnent déjà.

Ce n’est pas encore prêt pour la production, mais cela semblerait largement suffisant pour expérimenter avec un toy language ou comme backend de DSL.

  1. Workflow d’utilisation

L’utilisation ressemble globalement à ceci :

  1. parser le langage source pour construire un AST
  2. convertir l’AST en Lamina IR avec IRBuilder
  3. laisser Lamina optimiser puis générer le code natif pour la cible

À partir du moment où la génération d’IR est bien écrite, Lamina se charge du reste.

  1. Pour conclure.

Personnellement, « créer un backend de compilateur » me semblait être quelque chose de très lointain, donc voir quelqu’un que je connais en réaliser un pour de vrai m’a paru assez fascinant.

Bien sûr, on n’est pas au niveau de maturité ou d’optimisation de LLVM, mais pour faire des expérimentations légères ou pour un usage pédagogique, cela a l’air plutôt convaincant.

J’ai moi-même développé en pratique un compilateur de langage Eom Jun-sik via lamina.

Si le sujet vous intéresse, cela peut valoir le coup d’y jeter un œil !

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.