LLVM プロジェクトは、モジュール式で再利用可能なコンパイラとツールチェーン技術の集まりです。その名前にもかかわらず、LLVM は従来の仮想マシンとはほとんど関係がありません。名前「LLVM」自体も頭字語ではありません。プロジェクトのフルネームです。
LLVM は静的と動的な両方の任意のプログラミング言語のコンパイルをサポートできる、最新の SSA ベースのコンパイル戦略を提供することを目的とした、調査プロジェクトとしてイリノイ大学の University of Illinois で始まりました。それ以来、LLVM は、サブプロジェクトから構成される傘プロジェクトに成長し、その多くは幅広い 商用およびオープンソース プロジェクトによって運用に使用されており、学術研究 で広く使用されています。LLVM プロジェクトのコードは 「LLVM 例外付き Apache 2.0 ライセンス」 の下でライセンスされています。
LLVM の主なサブプロジェクトは次のとおりです。
LLVM Core ライブラリは、オプティマイザ と合わせて、最新でソースおよびターゲットに依存しないもの、ならびに多くの一般的な CPU (あまり一般的でないものも!) に合わせた Clang はすばらしく高速なコンパイルの実現、非常に有用なエラーと警告メッセージを提供し、優れたソースレベルツールを構築するためのプラットフォームを提供することを目的とする「LLVM ネイティブ」の C/C++/Objective-C コンパイラです。Clang スタティックアナライザーとclang-tidyはコード内のバグを自動的に検出するツールで、Clang フロントエンドを C/C++ コードのパース用のライブラリとして使用して構築できるツールの種類を説明する素晴らしい例です。
LLDBプロジェクトは、LLVM と Clang によって提供されるライブラリを基盤として構築され、優れたネイティブデバッガーを提供します。Clang AST と式パーサー、LLVM JIT、LLVM ディスアセンブラなどを使用して、「すぐに機能する」エクスペリエンスを提供します。また、GDB よりもはるかに高速で、メモリの効率も優れています。
libc++およびlibc++ ABIプロジェクトは、C++ 標準ライブラリの標準に準拠した高性能な実装を提供します。これには、C++11 および C++14 の完全サポートが含まれます。
compiler-rtプロジェクトは、「__fixunsdfdi"およびその他の呼び出しなど、ターゲットがコア IR 操作を実装するためのネイティブ命令の短いシーケンスを持たない場合に生成される低レベルのコードジェネレータサポートルーチンの調整された実装を提供します。また、AddressSanitizer、ThreadSanitizer、MemorySanitizer、DataFlowSanitizerなどの動的テストツール用のランタイムライブラリの実装も提供します。
MLIRサブプロジェクトは、再利用可能で拡張可能なコンパイラインフラストラクチャを構築するための新しいアプローチです。MLIR は、ソフトウェアのフラグメンテーションに対処し、異種ハードウェアのコンパイルを改善し、ドメイン固有のコンパイラの構築にかかるコストを大幅に削減し、既存のコンパイラの接続を支援することを目的としています。
OpenMPサブプロジェクトは、Clang の OpenMP 実装で使用するためのOpenMPランタイムを提供します。
pollyプロジェクトは、多面体モデルを使用して、キャッシュ局所性の最適化、自動並列化、ベクトル化のスイートを実装します。
libclcプロジェクトは、OpenCL 標準ライブラリを実装することを目的としています。
kleeプロジェクトは、「記号的仮想マシン」を実装します。これは定理証明を使用してプログラム内のすべての動的パスを評価して、バグを検出し、関数のプロパティを証明します。klee の主な機能は、バグを検出した場合にテストケースを生成できることです。
LLDプロジェクトは新しいリンカーです。これはシステムリンカーのドロップイン置換であり、はるかに高速に動作します。
BOLT プロジェクトは、リンク後のオプティマイザーです。サンプリングプロファイラによって収集された実行プロファイルに基づいてアプリケーションのコードレイアウトを最適化することで改善を実現します。
LLVM の公式サブプロジェクトに加えて、LLVM の構成要素をさまざまなタスクに使用している広範なプロジェクトがあります。これらの外部プロジェクトを通して、LLVM を使用して Ruby、Python、Haskell、Rust、D、PHP、Pure、Lua、Julia、その他の多数の言語をコンパイルできます。LLVM の主な強みは、汎用性、柔軟性、再利用性です。そのため、Lua などの埋め込み言語を軽量 JIT コンパイルすることから、大規模スーパーコンピュータ用の Fortran コードをコンパイルすることに至るまで、非常に多様なさまざまなタスクに使用されています。
他のすべてと同じように、LLVM には優れた低レベルツールを作成することに興味を持っている、広く親しみやすいコミュニティがあります。参加することに興味がある場合は、まず LLVM ブログ をざっと読んで、LLVM ディスカース に参加するとよいでしょう。パッチを送信する方法、コミットアクセスを取得する方法、著作権およびライセンストピックに関する情報については、LLVM 開発者ポリシー を参照してください。