Skip to content

LLVMの概要

LLVMプロジェクトは、モジュール式で再利用可能なコンパイラとツールチェーン技術の集合体である。その名前とは裏腹に、LLVMは従来の仮想マシンとはほとんど関係がない。LLVMという名前自体は頭字語ではなく、プロジェクトの正式名称である。

LLVMはイリノイ大学の研究プロジェクトとして始まり、任意のプログラミング言語の静的コンパイルと動的コンパイルの両方をサポートできる、最新のSSAベースのコンパイル戦略を提供することを目標としていた。それ以来、LLVMは多くのサブプロジェクトからなる包括的なプロジェクトに成長し、その多くは学術研究だけでなく、さまざまな商用プロジェクトやオープンソースプロジェクトで実運用されている。LLVMプロジェクトのコードは、"Apache 2.0 License with LLVM exceptions"の下でライセンスされている。

LLVMの主なサブプロジェクトは以下の通り:

  1. LLVMコア・ライブラリは、ソースやターゲットに依存しない最新のオプティマイザと、多くの一般的なCPUに対応したコード生成を提供します(一般的でないCPUもあります!)。これらのライブラリは、LLVM中間表現("LLVM IR")として知られる、適切に指定されたコード表現を中心に構築されています。LLVMコア・ライブラリはよく文書化されており、LLVMをオプティマイザやコード生成器として使用するために、独自の言語を考案する(または既存のコンパイラを移植する)のは特に簡単です。

  2. Clangは "LLVMネイティブ" のC/C++/Objective-Cコンパイラで、驚くほど高速なコンパイル、非常に便利なエラーや警告のメッセージ、そして優れたソースレベルのツールを構築するためのプラットフォームを提供することを目指しています。Clang Static Analyzerとclang-tidyはコードのバグを自動的に見つけるツールで、C/C++コードを解析するライブラリとしてClangフロントエンドを使って構築できるツールの素晴らしい例です。

  3. LLDBプロジェクトは、LLVMとClangによって提供されるライブラリをベースにして、優れたネイティブ・デバッガを提供します。ClangのASTと式パーサー、LLVM JIT、LLVMディスアセンブラなどを使用し、「ただ動く」体験を提供します。また、シンボルをロードする際に、GDBよりもはるかに高速で、メモリ効率に優れています。

  4. libc++およびlibc++ ABIプロジェクトは、C++11およびC++14の完全サポートを含む、C++標準ライブラリの標準準拠かつ高性能な実装を提供する。

  5. compiler-rtプロジェクトは、"__fixunsdfdi "のような低レベル・コード・ジェネレータ・サポート・ルーチンの高度に調整された実装や、ターゲットがコアIR操作を実装するための短いネイティブ命令シーケンスを持たない場合に生成されるその他の呼び出しを提供する。また、AddressSanitizer、ThreadSanitizer、MemorySanitizer、DataFlowSanitizerなどの動的テスト・ツールのランタイム・ライブラリの実装も提供する。

  6. MLIRサブプロジェクトは、再利用可能で拡張可能なコンパイラ・インフラを構築するための新しいアプローチである。MLIRは、ソフトウェアの断片化に対処し、異種ハードウェア向けのコンパイルを改善し、ドメイン固有のコンパイラを構築するコストを大幅に削減し、既存のコンパイラ同士を接続する手助けをすることを目指している。

  7. OpenMPサブプロジェクトは、ClangのOpenMP実装で使用するOpenMPランタイムを提供します。

  8. pollyプロジェクトは、多面体モデルを使った自動並列化とベクトル化だけでなく、一連のキャッシュ・ローカリティ最適化を実装している。

  9. libclcプロジェクトは、OpenCL標準ライブラリの実装を目指している。

  10. kleeプロジェクトは「記号的仮想機械」を実装しており、バグを発見したり関数の特性を証明したりするために、定理証明器を用いてプログラムを通るすべての動的パスの評価を試みる。kleeの大きな特徴は、バグを検出した場合にテストケースを生成できることである。

  11. LLDプロジェクトは新しいリンカーだ。これはシステム・リンカーのドロップイン・リプレースメントであり、はるかに高速に動作する。

  12. BOLTプロジェクトは、ポストリンク・オプティマイザーである。サンプリング・プロファイラによって収集された実行プロファイルに基づいてアプリケーションのコード・レイアウトを最適化することで、改善を実現している。

LLVMの公式なサブプロジェクトに加え、LLVMのコンポーネントをさまざまなタスクに使用する多種多様なプロジェクトがあります。これらの外部プロジェクトを通じて、LLVMを使ってRuby、Python、Haskell、Rust、D、PHP、Pure、Lua、Julia、その他多くの言語をコンパイルすることができる。LLVMの大きな強みは、その多用途性、柔軟性、再利用性であり、Luaのような組み込み言語の軽量なJITコンパイルから、巨大なスーパーコンピュータ用のFortranコードのコンパイルまで、このように多種多様なタスクに使用されている理由である。

他のすべてと同様に、LLVMには優れた低レベル・ツールの構築に興味を持つ人々の広範でフレンドリーなコミュニティがある。もし参加することに興味があるなら、まずはLLVMブログに目を通し、LLVM Discourseに参加するのが良いだろう。パッチの送り方、コミット・アクセス、著作権やライセンスに関する情報については、LLVM Developer Policyをご覧ください。