Low Level Virtual Machine |
辞書:電算用語の基礎知識 ローカルアプリ一般編 (PNAPLLI) |
読み:ローレベルバーチャルマシーン |
外語:LLVM: Low Level Virtual Machine |
品詞:固有名詞 |
様々なプログラミング言語において、最適化が可能なように設計された、コンパイラーの基盤。
|
仕様 |
概要 |
Low Level Virtual Machine(以下、LLVM)は「VM」という語を含むが、実際にはVM(仮想計算機)ではなく、コンパイラーのバックエンドを構築するためのフレームワークである。
CやC++などの言語を処理するためのフロントエンドが作成する中間言語を受け取り、最適化を実施しつつ、各アーキテクチャー用のネイティブコード(x86、x86-64、ARMアーキテクチャなど)を出力する機能を有する。
従って、言語だけでなく、アーキテクチャーからも独立している。
仕様 |
フロントエンド |
現在のC、C++、Objective-Cの公式なフロントエンドはclangで、LLVM 2.6から正式採用された。
初期には、幾つかのフロントエンドが開発中だった。
例えば、GCC 4.xから作られたフロントエンドllvm-gccを使うことで、C、C++、FORTRAN、Objective-C、Ada、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は、処理の段階に応じて複数の中間言語(中間表現)を持ち、高級言語に近い高レベルな中間言語から、機械語に近い低レベルな中間言語にまで変換される。
clangがプログラミング言語を解析し、変換した独自の抽象構文木の情報。
ASTはツリーで、かつコンテクストを保有している。
LLVMの中心となる中間表現(IR)で、静的単一代入(SSA)形式となっている。
この段階で最適化(大規模な変換)が可能なように設計されている。
BitCodeでは、ASTが保有していたコンテキストは失われている。ループ構文は失われ、展開されている。
llcが内部で使用する中間言語の一つ。
llcが内部で使用する中間言語の一つ。
アセンブリ言語に変換することを目的とした中間言語であり、1命令ごとの粒度は小さく、BitCodeよりも更に低レベルの言語である。
コンパイルの流れ |
特徴 |
関連プロジェクト |
LLVMを利用したプロジェクトで、公式サイトに記載のあるもの(新しい順)。
上記の他に、次のようなものもある/あった。
アーキテクチャ |
LLVM 3.5の時点で主たる対応オペレーティングシステムは次の通り(アーキテクチャーごとの対応は後述)。
LLVM 3.5の時点で主たる対応アーキテクチャーとされているものは次の通り。
以下は、おそらく実験的な段階のもの。
以下は、過去にコードジェネレーターが存在したが最新版ではなくなっている環境。
Z80用の実装llvm-z80の開発を目指すプロジェクトも確認されている。
これがもし完成すれば、MSX-DOSなどで動作するソフトウェアをC++やObjective-Cを使って開発することが可能になることを意味する。
昨今の需要となるスマートフォン開発などでは、以下の環境やCPUが未対応である。
Dalvikのバイナリを出力できれば、Android NDKなどを使わずともAndroidアプリケーションをC++やObjective-Cを使って開発することが可能になる。
補足 |
ライセンス |
「University of Illinois/NCSA Open Source License」というライセンスが採用されている。
著作権表示を消してはならない、という当たり前のことが規定されているだけで、その内容はBSDライセンスに近く配布に殆ど制限がない。GPLのような、余計な義務が一切ないのが特徴である。
ここから、GCCの代替としてLLVMに注目が集まるようになった。
GPL排除との関連 |
従来使われてきたGCCはGPLだが、このライセンスは業務開発には全く向いていないものであった。これがGPLv3になると更に業務開発に向かなくなり、多くのオープンソース界隈が反発した。
OpenBSDやFreeBSDなどのBSD陣営も同様で、Linuxと違って業務用途で広く使われているこれらオペレーティングシステムはGPLv3ツールを同梱するわけにはいかなかったため、他のコンパイラーへの移行が進められるようになった。FreeBSDは、その候補としてclang/llvmを選択した。
clangは瞬く間に成長を遂げ、GCCをあっという間に追い越してしまった。
バージョン |
沿革 |
これより↑は予定
以下リリース済み
LLVM 3.6 |
LLVM 3.5 |
LLVM 3.4 |
LLVM 3.3 |
LLVM 3.2 |
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サブシステムに対してモジュール情報を送る際に使われる。
現時点では、Objective-CのABI情報のエンコードに用いられている。
これにより、型のサイズを返さない命令を持つプラットフォーム上で、0のビットを数える際に最適化されたコードが生成可能となる。
最終段で、実際にコードを生成するコード生成器が大幅に改善され、VLIWアーキテクチャー用のビルドに対応するための基盤が搭載された。まずはHexagonをターゲットとして実装されている。
X86ターゲット、ARMターゲット、MIPSターゲット、PTXターゲットなど様々なターゲット向けの処理が改善された。
ARMなどへの対応も注目されているが、x86への対応も大幅に改良されている。
ARMターゲットの新機能は以下のとおりである。
A32とT32(Thumb-1とThumb-2命令)に完全対応。
CPU拡張命令として、VFPv2、VFPv3、NEONに対応している。
リンク |
通信用語の基礎知識検索システム WDIC Explorer Ver 7.04a (27-May-2022) Search System : Copyright © Mirai corporation Dictionary : Copyright © WDIC Creators club |