Low Level Virtual Machine
読み:ローレベルバーチャルマシーン
外語:LLVM: Low Level Virtual Machine

 様々なプログラミング言語において、最適化が可能なように設計された、コンパイラーの基盤。
目次

仕様

概要
 Low Level Virtual Machine(以下、LLVM)は「VM」という語を含むが、実際にはVM(仮想計算機)ではなく、コンパイラーのバックエンドを構築するためのフレームワークである。
 CやC++などの言語を処理するためのフロントエンドが作成する中間言語を受け取り、最適化を実施しつつ、各アーキテクチャー用のネイティブコード(x86x86-64ARMアーキテクチャなど)を出力する機能を有する。
 従って、言語だけでなく、アーキテクチャーからも独立している。

仕様

フロントエンド
 現在のCC++Objective-Cの公式なフロントエンドはclangで、LLVM 2.6から正式採用された。
 初期には、幾つかのフロントエンドが開発中だった。
 例えば、GCC 4.xから作られたフロントエンドllvm-gccを使うことで、CC++FORTRANObjective-CAda、Dの各言語に対応できた。但しllvm-gccはLLVM 2.9を対応の最後とし、LLVM 3.0以降ではサポートされなくなった。
 LLVMに注目が集まり始めると、LLVMをバックエンドに、GPLではないコンパイラーを作ろうという動きが現われはじめ、C、Objective-C、C++に対応しAppleが全力を投入して開発したフロントエンドclangが、圧倒的な資金力と開発力でGCCを凌駕し、LLVMの公式なフロントエンドとなった。
 ちなみにAppleがclangに本気を出したのは、GCCにおけるObjective-C対応に不満を持っていたためで、LLVMという既にかなりの水準にある基盤を用いて新たなコンパイラーclangを作ることに全力を注いだ「おこぼれ」を、一般のユーザーはありがたく拝領することとなったものである。

中間言語
 LLVMは、処理の段階に応じて複数の中間言語(中間表現)を持ち、高級言語に近い高レベルな中間言語から、機械語に近い低レベルな中間言語にまで変換される。

コンパイルの流れ
  1. フロントエンドが言語を処理し、BitCodeを出力する
    1. 字句解析、構文解析等を実施し、ASTに変換する
    2. ASTをBitCodeに変換する
  2. opt(オプティマイザー)がBitCodeを読み込み、最適化し、BitCodeを出力する
    1. モジュールレベルでの最適化
    2. CallGraphSCCレベルでの最適化
    3. ファンクションレベルでの最適化
    4. ループレベルでの最適化
    5. BasicBlockレベルでの最適化
  3. llvm-ldが複数のBitCodeを読み込み、最適化し、一つのBitCodeを出力する
    1. 一つのモジュールに統合する
    2. モジュール内で、link time optimization(lto)を実施する
  4. llcがBitCodeを読み込み、最適化し、プラットフォーム固有のアセンブリ言語を出力する

特徴

関連プロジェクト
 LLVMを利用したプロジェクトで、公式サイトに記載のあるもの(新しい順)。
 上記の他に、次のようなものもある/あった。

アーキテクチャ

主な実装
 LLVM 3.5の時点で主たる対応オペレーティングシステムは次の通り(アーキテクチャーごとの対応は後述)。
 LLVM 3.5の時点で主たる対応アーキテクチャーとされているものは次の通り。
 以下は、おそらく実験的な段階のもの。

過去の実装
 以下は、過去にコードジェネレーターが存在したが最新版ではなくなっている環境。

その他の実装

未対応
 昨今の需要となるスマートフォン開発などでは、以下の環境やCPUが未対応である。
 Dalvikのバイナリを出力できれば、Android NDKなどを使わずともAndroidアプリケーションをC++Objective-Cを使って開発することが可能になる。

補足

ライセンス
 「University of Illinois/NCSA Open Source License」というライセンスが採用されている。
 著作権表示を消してはならない、という当たり前のことが規定されているだけで、その内容はBSDライセンスに近く配布に殆ど制限がない。GPLのような、余計な義務が一切ないのが特徴である。
 ここから、GCCの代替としてLLVMに注目が集まるようになった。

GPL排除との関連
 従来使われてきたGCCはGPLだが、このライセンスは業務開発には全く向いていないものであった。これがGPLv3になると更に業務開発に向かなくなり、多くのオープンソース界隈が反発した。
 OpenBSDFreeBSDなどのBSD陣営も同様で、Linuxと違って業務用途で広く使われているこれらオペレーティングシステムはGPLv3ツールを同梱するわけにはいかなかったため、他のコンパイラーへの移行が進められるようになった。FreeBSDは、その候補としてclang/llvmを選択した。
 clangは瞬く間に成長を遂げ、GCCをあっという間に追い越してしまった。

バージョン

沿革
 これより↑は予定
 以下リリース済み

LLVM 3.6

改良点

LLVM 3.6を用いた外部のプロジェクト

LLVM 3.5

LLVM 3.4

LLVM 3.3

改良点

補足

LLVM 3.2

改良点

LLVM IRの改良
 LLVM IR(中間表現)は新たなターゲットへの対応のため、新機能が追加された。

コード生成器
 X86-32とX86-64ターゲットでは、AVX2向けのコード最適化などの改良がなされた。
 ARMターゲットでは、Apple A6 'Swift' CPU向けのサポートと性能改善がなされた。
 今回は、MIPSターゲットとPowerPCターゲットの改良が多く、さらにPTX/NVPTXターゲットについては書き直された。

LLVM 3.1

改良点
 LLVM 3.1で、多くの改良が施された。

LLVM IRの改良
 LLVM IR(中間表現)は新たなターゲットへの対応のため、新機能が追加された。

コード生成器
 最終段で、実際にコードを生成するコード生成器が大幅に改善され、VLIWアーキテクチャー用のビルドに対応するための基盤が搭載された。まずはHexagonをターゲットとして実装されている。
 X86ターゲット、ARMターゲット、MIPSターゲット、PTXターゲットなど様々なターゲット向けの処理が改善された。

X86ターゲットの改良
 ARMなどへの対応も注目されているが、x86への対応も大幅に改良されている。

ARMターゲットの改良
 ARMターゲットの新機能は以下のとおりである。

再検索