BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース LLVM 2.8 がリリース

LLVM 2.8 がリリース

ブックマーク

原文(投稿日:2010/10/07)へのリンク

LLVM チームは昨日,次世代 C/C++ コンパイラ,オプティマイザ,ランタイムを含む仮想マシンインフラストラクチャである LLVM 2.8 をリリースした。

LLVM の実体は C,Objective-C,C++ コンパイルの実行手段を形成するプロジェクトの集合体である。コンパイルそのものを実行するのは Clang で,これまで C と Objective-C がコンパイル可能であった。C++ のサポートは LLVM 2.7 で追加されていたが,今回の LLVM 2.8 から C++ アプリケーションの標準ライブラリ libc++ が加えられて,完全な C++ の仕様を備えるようになった。かっての gdb の置き換えとして,新たな LLDB デバッガも提供されるが,一方でコンパイラの使用するパーザとソースコードツールは変更されない。LLDB は少し前のバージョンから提供されていたが,リリースとしては今回の LLVM 2.8 が最初となる。

GPL 下でリリースされているモノリシックなコンパイラである GCC とは違って,LLVM はよりモジュール化されたツールファミリであり,GPL よりも寛容な BSD ライセンス の恩恵によって商用ツールへの組み込みも可能になっている。その結果,Apple の Xcode のようなアプリケーションでも Clang がサポートされ,gcc を用いる他のアプリケーションに対しての高速化を実現している。さらに AST (Abstract Syntax Tree,抽象構文木) を他のツールからも参照できるため,ソースコードの構造とコンパイルされたコードとの対応に関して,IDEがより詳細な情報を取得できるのだ。

さらにモジュールアーキテクチャによって,ソースコードを走査して潜在的バグを指摘する Clang 静的アナライザや,プログラム内で発生するイベント列を識別可能なシンボリック仮想マシンである Klee などのツールが実現されている。この Klee は特徴のひとつとして,バグを検出した場合に,そのフィックス作業が完了したことを証明するテストケースをプログラム的に生成する機能を備えている。

C言語がすべてではない

最後に,LLVM プロジェクトは C言語とその派生言語のためだけのものではない。フロントエンドパーザの基本にはシンボリックな命令セット – 移植性を持ったアセンブリコード – があって,サポート対象マシンアーキテクチャのいずれにも変換可能である。これによって,どのパーザやトランスレータでも,LLVM ファミリがサポートするすべてのプラットフォームで使用可能な同一のアセンブリコードを生成できる,という利点が得られる。

それだけではない。最適化がソースレベルではなくアセンブリコードのレベルで動作するため,LLVM IR にコンパイルされる言語すべてが実行時最適化の恩恵を自動的に受けられるのだ。LLVM IR を直接翻訳するランタイムも用意されている。インタプリタ言語では最初にこれを利用して,その後で JIT の実行によってアプリケーションの特定部分を最適化する,という手法が選択できる。

LLVM は,JVM と CLR の共通ランタイムを提供する VMKit,その他の言語のランタイムですでに使用されている。同じく今日バージョン 2.8 をリリースした Mono ランタイムでは,実行時最適化のため JIT として LLVM をサポートしている (mon-llvm を指定する)。その他のランタイムとしては,Ruby on LLVMMacRubyUnladen Swallow などがある。また Clam AV でも,効率的なウィルススキャンを実行するため,内部的に LLVM が使用されている。

コードが LLVM IR にコンパイルされる様子を Web 上のデモで確認することができる。さらに詳細な情報は LLVM ブログその他の資料で確認してほしい。

この記事に星をつける

おすすめ度
スタイル

BT