Lamina: LLVMなしでネイティブコードを生成するマルチアーキテクチャ対応コンパイラバックエンド
(github.com/SkuldNorniern)こんにちは。知人が最近コンパイラバックエンドを開発したのですが、かなり興味深かったので共有します。
- プロジェクト紹介
Laminaは、LLVMのような重い依存関係なしに、SSAベースのIRから直接ネイティブコードを生成する、マルチアーキテクチャ対応のコンパイラバックエンドです。x86_64、AArch64、RISC-V、WebAssemblyを1つのIRでサポートします。
簡単なDSLや実験的な言語を作るたびにLLVMをビルドし、数GB級の依存関係を管理するのはあまりに重いと感じたそうです。そこで、「IRを入れたらアセンブリが出てくる軽量なものを1つ作ってみよう」という発想で始めたとのことです。
- 主な特徴
▸ 外部依存ゼロ
LLVMやCraneliftなしで、IRからマシンコードへ直接変換します。
ビルド時間も短く、配布も簡単です。
▸ SSAベースのIR
Static Single Assignment形式なので、最適化パイプラインをすっきり構成できます。
▸ 明示的なメモリモデル
スタック/ヒープ割り当てをIRレベルで明確に区別しており、メモリ解析が容易です。
▸ マルチアーキテクチャ
1つのIRで複数ターゲットをサポート:
- x86_64 (Linux, macOS, Windows)
- AArch64/ARM64 (Linux, macOS, Windows)
- RISC-V (RV32/64/128)
- WebAssembly (32/64-bit)
▸ IRBuilder API
関数型スタイルでIRを構築できるAPIを提供します。
型安全に制御フローやメモリ演算を表現できるそうです。
- 現在の状態
基本的な算術演算、条件分岐やループのような制御フロー、非再帰関数呼び出し、簡単な最適化が動作します。
プロダクションレディではありませんが、トイ言語やDSLのバックエンドとして試してみるには十分とのことです。
- 使用ワークフロー
おおよそ次のように使うそうです:
- ソース言語をパースしてASTを作る
- IRBuilderでASTをLamina IRに変換
- Laminaが最適化し、ターゲットごとのネイティブコードを生成
IR生成の部分さえしっかり書けば、あとはLaminaが自動で処理してくれます。
- まとめ
個人的には、「コンパイラバックエンドを作る」というのはとても遠い話のように感じていたのですが、知人が実際に作っているのを見ると不思議なものですね。
もちろんLLVMレベルの成熟度や最適化ではありませんが、気軽な実験や教育用途にはかなり良さそうです。
私も実際にlaminaを通してオム・ジュンシク言語コンパイラを開発してみました。
興味のある方は一度見てみてもよいかもしれません!
まだコメントはありません。