4 ポイント 投稿者 miniex 2025-11-11 | まだコメントはありません。 | WhatsAppで共有

こんにちは。知人が最近コンパイラバックエンドを開発したのですが、かなり興味深かったので共有します。

  1. プロジェクト紹介

Laminaは、LLVMのような重い依存関係なしに、SSAベースのIRから直接ネイティブコードを生成する、マルチアーキテクチャ対応のコンパイラバックエンドです。x86_64、AArch64、RISC-V、WebAssemblyを1つのIRでサポートします。

簡単なDSLや実験的な言語を作るたびにLLVMをビルドし、数GB級の依存関係を管理するのはあまりに重いと感じたそうです。そこで、「IRを入れたらアセンブリが出てくる軽量なものを1つ作ってみよう」という発想で始めたとのことです。

  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を提供します。
型安全に制御フローやメモリ演算を表現できるそうです。

  1. 現在の状態

基本的な算術演算、条件分岐やループのような制御フロー、非再帰関数呼び出し、簡単な最適化が動作します。

プロダクションレディではありませんが、トイ言語やDSLのバックエンドとして試してみるには十分とのことです。

  1. 使用ワークフロー

おおよそ次のように使うそうです:

  1. ソース言語をパースしてASTを作る
  2. IRBuilderでASTをLamina IRに変換
  3. Laminaが最適化し、ターゲットごとのネイティブコードを生成

IR生成の部分さえしっかり書けば、あとはLaminaが自動で処理してくれます。

  1. まとめ

個人的には、「コンパイラバックエンドを作る」というのはとても遠い話のように感じていたのですが、知人が実際に作っているのを見ると不思議なものですね。

もちろんLLVMレベルの成熟度や最適化ではありませんが、気軽な実験や教育用途にはかなり良さそうです。

私も実際にlaminaを通してオム・ジュンシク言語コンパイラを開発してみました。

興味のある方は一度見てみてもよいかもしれません!

まだコメントはありません。

まだコメントはありません。