【えるえるぶいえむ】

LLVM とは?

最終更新:
💡 いろんな言語とCPUをつなぐ「共通の翻訳エンジン」だよ

コンパイラや関連ツールを作るための、再利用可能なオープンソースの技術群。共通の中間表現LLVM IR、最適化処理、各ターゲット向けのコード生成などを提供する。

📌 このページのポイント
中間表現を介して、共通部品を再利用する 言語側 共通の処理 出力先の例 LLVM IR 中間表現 ⚙ 共有できる 最適化処理 Clang(C/C++) フロントエンド x86 コード生成 Swift フロントエンド Arm コード生成 Rust フロントエンド WebAssembly コード生成 言語・ターゲット固有の対応も必要
LLVMを使うコンパイラの模式図。矢印は中間表現への変換と、最適化・コード生成の流れを示す。全言語がすべての出力先へ自動で対応するという意味ではない。
ひよこ ひよこ
LLVMは、何をしてくれるの?
ペンギン先生 ペンギン先生
いろんな言語のコンパイラが使える共通の部品を提供するよ。LLVMのCoreには、LLVM IRを扱う最適化処理と、ターゲット向けのコード生成などがある。LLVMというプロジェクトには関連するツールも含まれるんだ。
ひよこ ひよこ
言語ごとの変換の仕組みは、いらなくなる?
ペンギン先生 ペンギン先生
言語の文法や意味を扱ってLLVM IRへ変換するフロントエンドなどは必要だよ。その先の最適化やコード生成の多くを共有できるけれど、言語や出力先に固有の対応まで全部なくなるわけではないんだ。
ひよこ ひよこ
LLVM IRは、CPUに依存しないアセンブリなの?
ペンギン先生 ペンギン先生
実機の命令そのものではなく、型などを持つ低水準の中間表現だよ。ただし対象のデータ配置などの情報も含むので、完全にCPUやターゲットから独立した表現と言い切ると誤解になるんだ。
ひよこ ひよこ
どんなコンパイラが使っているの?
ペンギン先生 ペンギン先生
C/C++などを扱うClang、Swift、Rustのコンパイラが例だよ。Rustの資料ではLLVMが通常のバックエンドとして説明されている。出力先にはCPU向けのコードだけでなくWebAssemblyもあるけれど、対応は使うコンパイラやターゲットによるんだ。
ひよこ ひよこ
Virtual Machineという名前なら、実行環境なの?
ペンギン先生 ペンギン先生
初期の名前はLow Level Virtual Machineだったけれど、現在のLLVMは略語ではないよ。名前だけから、プログラムを動かす仮想マシンそのものだとは考えず、コンパイラやツールを作る技術群として捉えるといいね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「LLVM」って出てきたら「いろんな言語のコンパイラが共通で使う変換・最適化の基盤」と思えればだいたいOK!
📖 おまけ:英語の意味
「Low Level Virtual Machine」 = 低水準仮想マシン
💬 開発初期の名残でこの名前が付いたけど、今は仮想マシンという枠を超えたコンパイラ基盤全体を指す言葉になっているんだよ。

参考資料

← 用語集にもどる