BSDCan2008、およびその直前に開催されたFreeBSD Developer Summitを通じて関係者がもっとも強い関心を持ったのは、もしかするとChris Lattner氏が担当したセッション「BSD licensed C++ compiler - LLVM and Clang: Next Generation Compiler Technology」だったかもしれない。同氏のセッションで初めてLLVM(Low Level Virtual Machine)について知ったという人も少なからずいたようだ。Lattner氏はLLVMのチーフアーキテクトであり、同技術を語るには適切な人物といえる。
モダンテクニックで開発されたマルチ言語コンパイラインフラ
LLVMはモダンなテクニックで開発されたコンパイラインフラストラクチャだ。プログラミング言語に依存しないモダンなオプティマイザとコードジェネレータを持ち、複数のプログラミング言語とアーキテクチャをサポートし、GCC互換フロントエンドllvm-gccを持っているという特徴がある。再利用可能なオプティマイザをさまざまなポイントで実行して最適化を行う。静的ビルドも動的ビルドもその組み合わせも可能だ。さらに特記すべきはllvm-gccフロントエンドを除いて、GPLではなくBSD Licenseで開発されているという点だ。
LLVM optimizer features used by llvm-gcc - BSDCan2008 Chris Lattner氏の発表資料より抜粋 |
Other LLVM features used by llvm-gcc - BSDCan2008 Chris Lattner氏の発表資料より抜粋 |
LLVM Link Time Optimization - BSDCan2008 Chris Lattner氏の発表資料より抜粋 |
OpenGL to LLVM: At runtime - BSDCan2008 Chris Lattner氏の発表資料より抜粋 |
既存のOSS C/C++/Objective Cコンパイラは古いコード生成技術に基づいており、JITやクロスファイルオプティマイザといったモダン技術を採用していないため、ほかのアプリケーションで再利用しにくく、さらにリリースごとに遅くなっているという状況にある。LLVMはモダンなテクニックを活用することでこうした状況を改善することに目的がおかれている。従来どおり静的にコンパイルすることもできるし、JITで動作させることにも対応している。
FreeBSDのメインコンパイラはGCCだが…
FreeBSDではメインのコンパイラにGCCを採用している。GCCはOSS C/C++コンパイラのメインストリームにあり、複数のアーキテクチャに対応している。今のところGCCをメインコンパイラとして採用するのはリーズナブルな選択肢だ。しかし、*BSDではコンパイラがGPLであることに抵抗を感じる向きもあり、GCCがGPLv3に移行した場合の影響を懸念する声もある。そのため、BSD Licenseや他ライセンスのC/C++コンパイラの模索も常に続けられている。
LLVMというコンパイラがあることは以前から知られており、すでにPorts Collection(devel/llvm)にも追加されている。野心的な目標を掲げていることが同プロジェクトページからよくわかるが、GCCが存在する中でそういったコンパイラの開発が可能なのか半信半疑であったり、そもそもGCC以外の候補をそれほど気にしていなかったという状況だったと言えるだろう。しかし、サイトのドキュメントを読むのと、実際に担当者から話を聞くのとでは、印象がだいぶ違ってくる。発表を聞く開発者はLLVMに大きな関心を持ったようだった。
LLVMの魅力は高速さ、上質さ、ライセンス、発展性
LLVMが魅力的なのは、BSD Licenseである以外にも、GCC 4.2のリプレースを目指したllvm-gccフロントエンドを用意しているところにある。簡単に言ってしまえば、gccをllvm-gccに変更するだけで入れ替えができる。しかも入れ替えるだけで最適化時間が30%ほど短縮されるほか、生成されるコードが5%から10%ほど優れたものになるという。
Carbon.h Parsing / Analysis Time - BSDCan2008 Chris Lattner氏の発表資料より抜粋 |
ProgreSQL Front-end Times - BSDCan2008 Chris Lattner氏の発表資料より抜粋 |
LLVMがGCC 4.2のリプレースを目的としたフロントエンドllvm-gccを持っているからといって、完璧にすべての互換性を実現しているわけではない。それにFreeBSDがLLVMへの移行に取り組んだとしても、その対応はすぐに終わるというものではないだろう。しかし、BSD Licenseであり、コンパイル性能も生成されるコードの質も良いということになれば、開発者が興味を惹かれないわけがない。
しかも、カーネルのみならず、Ports CollectionのビルドにLLVMを採用すればビルド時間を短縮できる可能性がある。OpenOffice.orgやKDE、Gnomeなど大規模アプリケーションが増える中、ビルド時間が短いうえに上質なコードを生成するコンパイラの存在は魅力的だ。ports committerにとってもLLVMは魅力的である。
GCCの代わりとなるか、今後の開発に注目
LLVMではGCC 4.2互換のフロントエンドではなく、独自のC/C++/Objective CフロントエンドとしてClangを持っている。GCCフロントエンドは遅いうえにメモリを大量に消費し、さらに最近のIDEが要求する機能に対応しきれないため、それらを解決したフロントエンドが必要という発想によるものだ。Clangはコンパイル時間がGCCよりも高速なうえにモダンなIDEや商用コードチェッカにも対応している。
さらにLLVMは、C/C++/Objective C以外の言語への発展も可能だ。多くのプログラミング言語ですでに実装された最適化技術が採用できるということになれば、LLVMの発展性の高さは魅力的なものだ。もちろんその間、GCCの開発も停滞しているわけではない。GNU binutilsの一部として新しいELFリンカ機能が登場するなど改善も続けられている。
ともあれ、LLVMは魅力的なコンパイルインフラとしての認識を広めつつあるようだ。直近でFreeBSDがLLVMを採用するとは思えないが、長期的に見た場合、LLVMへの移行も起こりうるということは抑えておくと良いだろう。