Lamina: Ein Multi-Architektur-Compiler-Backend, das nativen Code ohne LLVM erzeugt
(github.com/SkuldNorniern)Hallo, ein Bekannter von mir hat vor Kurzem ein Compiler-Backend entwickelt, und ich fand es ziemlich interessant, daher teile ich es hier.
- Projektvorstellung
Lamina ist ein Multi-Architektur-Compiler-Backend, das ohne schwere Abhängigkeiten wie LLVM direkt aus SSA-basiertem IR nativen Code erzeugt. Es unterstützt x86_64, AArch64, RISC-V und WebAssembly über ein einziges IR.
Er meinte, dass es sich jedes Mal, wenn er eine einfache DSL oder eine experimentelle Sprache bauen wollte, viel zu schwer anfühlte, LLVM zu bauen und mehrere GB an Abhängigkeiten zu verwalten. Angefangen hat es mit der Idee: „Lass uns einfach etwas Leichtgewichtiges bauen, bei dem man nur IR hineingibt und Assembler herausbekommt.“
- Hauptmerkmale
▸ Keine externen Abhängigkeiten
Ohne LLVM oder Cranelift wird direkt von IR in Maschinencode umgewandelt.
Dadurch sind die Build-Zeiten kurz und die Verteilung einfach.
▸ SSA-basiertes IR
Durch die Static-Single-Assignment-Form lässt sich die Optimierungs-Pipeline sauber strukturieren.
▸ Explizites Speichermodell
Stack-/Heap-Allokationen werden auf IR-Ebene klar getrennt, wodurch die Speicheranalyse einfacher wird.
▸ Multi-Architektur
Unterstützung mehrerer Targets mit einem einzigen IR:
- x86_64 (Linux, macOS, Windows)
- AArch64/ARM64 (Linux, macOS, Windows)
- RISC-V (RV32/64/128)
- WebAssembly (32/64-Bit)
▸ IRBuilder API
Es wird eine API bereitgestellt, mit der sich IR in einem funktionalen Stil aufbauen lässt.
Damit lassen sich Kontrollfluss oder Speicheroperationen typsicher ausdrücken.
- Aktueller Stand
Grundlegende arithmetische Operationen, Kontrollfluss wie Bedingungen/Verzweigungen/Schleifen, nichtrekursive Funktionsaufrufe und einfache Optimierungen funktionieren bereits.
Noch nicht production-ready, aber zum Experimentieren mit Toy-Sprachen oder als DSL-Backend soll es bereits gut genug sein.
- Verwendungs-Workflow
Ungefähr so wird es verwendet:
- Die Quellsprache parsen und ein AST erstellen
- Das AST mit IRBuilder in Lamina IR umwandeln
- Lamina optimiert und erzeugt nativen Code für das jeweilige Target
Wenn der IR-Erzeugungsteil sauber geschrieben ist, übernimmt Lamina den Rest automatisch.
- Zum Schluss
Für mich persönlich klang „ein Compiler-Backend bauen“ immer nach etwas sehr Entferntem, daher fand ich es faszinierend zu sehen, dass mein Bekannter tatsächlich so etwas gebaut hat.
Natürlich hat es nicht die Reife oder Optimierung von LLVM, aber für leichtgewichtige Experimente oder für den Einsatz in der Lehre wirkt es ziemlich brauchbar.
Ich selbst habe über Lamina auch tatsächlich einen Compiler für die Eom Jun-sik-Sprache entwickelt.
Wer Interesse hat, kann es sich ja einmal ansehen!
Noch keine Kommentare.