bar_1

contents_map

2014年5月12日月曜日

LLVM Overview 日本語訳

原文は、Chris Lattner さんによりメンテされている LLVM HP: The LLVM Compiler Infrastructure Project です。



LLVM プロジェクトは、モジュール式で再利用可能なコンパイラとツールチェイン技術群のひとつのコレクションです。名前によらず、LLVM は、伝統的なバーチャルマシンたちには、ほとんど関係ありません; むしろ それらをビルドするために使われる、役に立つライブラリ群をまさに提供します。名前 “LLVM” 自身は頭字語ではありません; これはプロジェクトのフルネームです (訳注: 以前は、Low-Level Virtual Machine の略、ということだったらしい。Wikipedia 参照のこと)。
LLVM は イリノイ大学研究プロジェクト として始まりました; モダンで、SSAベースのコンパイル戦略 ――任意のプログラム言語たちをスタティックとダイナミック、両方のコンパイル処理をサポートする能力をもつ―― を提供することを目指しています。その時から、LLVM は、多くのサブプロジェクトたちから成る、ひとつの傘プロジェクトに育ってきています; 学術研究 で広く使われるようになってきたことに加え、それらの多くは、商用やオープンソース のプロジェクトたちで、開発に使われるようになってきました。LLVM プロジェクトにおけるコードは、“UIUC” BSD スタイルのライセンスの下で、ライセンスされます。
LLVM のサブプロジェクトたちの目玉は:
  1. LLVM コア・ライブラリ群は、多くのポピュラーな CPU たち (あまり一般的でないものたちについても!) について、コード生成をサポート するとともに、モダンなソース= やターゲット=独立の オプティマイザ を提供します。これらのライブラリ群は、LLVM 中間表現 intermediate representation (“LLVM IR”) として知られる、ひとつの よく仕様化された コード表現で、ビルドされます。コアライブラリ群は よく文書化されていてLLVM をオプティマイザやコード・ジェネレータとして 使うことで、とくにあなた自身の言語を新しく開発する (またはすでにあるコンパイラを移植する) ことが容易です。
  2. Clang は、「LLVM ネイティブ」な C/C++/Objective-C コンパイラの一つで、驚くほど高速なコンパイラたち (例. デバッグ設定環境において Objective-C のコードをコンパイルするとき、GCC の約 3 倍の速さ)、きわめて使いやすい、エラーやワーニング・メッセージたちを提供し、すぐれたソースレベル・ツール群をビルドするためのプラットフォームを提供することを目的としています。Clang 静的アナライザ は、自動的にあなたのコードのバグたちを見つけるツールのひとつであり、これは C/C++ のコードをパースするためのライブラリのひとつとして、Clang フロントエンドを使って、ビルドすることを可能にする類のツールの、ひとつのすぐれた例です。
  3. dragonegg は、LLVM オプティマイザたちと GCC パーサ群を使ったコード・ジェネレータを、統合します。これにより、LLVM で、Ade, Fortran, そしてその他の GCC コンパイラ・フロントエンドによってサポートされている言語たちをコンパイルでき、Clang ではサポートされていない (OpenMP のような) C の機能にアクセスできます。
  4. LLDB プロジェクトは、LLVM や Clang によって提供されるライブラリ群の上でビルドされていて、すぐれたネイティブ・デバッガを提供するためのものです。Clang の ASTたちや式パーサ, LLVM JIT, LLVM 逆アセンブラ, などを使用していて、「正しく動く」ことを確認できるようにするためのものです。シンボルのローディングの点で、GDB よりも激しく高速でよりメモリ効率がよいものでもあります。
  5. libc++libc++ ABI プロジェクトたちは、C++11 のフル・サポートを含め、標準規格準拠と C++ 標準ライブラリのハイパフォーマンスな実装を提供しています。
  6. compiler-rt プロジェクトは、高度にチューンされた実装群を提供します。これは、”__fixunsdfdi” のような低レベルのコード・ジェネレータ・サポート・ルーチン群や、他の ――ひとつのターゲットがひとつの短いシーケンス (ひとつのコア IR オペレーションを実装するためのネイティブ命令群から構成される) を持たない場合に生成される―― 呼び出し群のようなものの、実装です。動的テスティング・ツール群のための AddressSanitizer, ThreadSanitizer, Memorysanitizer, そして DataFlowSanitizer のようなランタイム・ライブラリ群の実装群も、提供します。
  7. OpenMP サブプロジェクトは、Clang での OpenMP 実装とともに使用するための OpenMP ランタイムを提供します。
  8. vmkit プロジェクトは、LLVM 技術群上でビルドされた、Java と .NET バーチャルマシンたちの実装のひとつです。
  9. polly プロジェクトは、多面体モデルを使った自動並列性 (auto-parallelism) やベクター化 (vectorization) とあわせ、キャッシュ=配置性最適化 (cache-locality optimizations) のひとつのスイートを、実装します。
  10. libclc プロジェクトは、OpenCL 標準ライブラリを実装するためのものです。
  11. klee プロジェクトは、ひとつの「シンボリック・バーチャルマシン」を実装します; これは、定理証明器を使い、バグたちをみつけるための、また関数のプロパティを証明するための試みを行うことで、ひとつのプログラムを通して、すべての動的パスの評価しようとするためのものです。klee のメジャーな機能のひとつは、ひとつバグを検出したような場合に、テストケースを生成できる、というものです。
  12. SAFECode プロジェクトは、C/C++ プログラムたちのためのメモリセーフティ・コンパイラです。メモリセーフティ・エラーたち (例えば、バッファオーバーフロー) 実行時に検出するために、ランタイム・チェックたちをコードに取り付けます。ソフトウェアをセキュリティ攻撃たちから保護するのに使うことができますし、Valgrind のようなメモリセーフティ・エラーのデバッグ・ツールとしても使えます。
  13. lld プロジェクトは、clang/llvm のためのビルトイン・リンカのためのものです。現在は、clang は実行可能バイナリたちをつくるために、システムリンカを起動しなければなりません。
LLVM のオフィシャルなサブプロジェクトに加えて、さまざまなタスクのために LLVM のコンポーネントたちを使った、バラエティに富んだ他のプロジェクトたちもあります。これらの外部のプロジェクトたちを通して、あなたは LLVM を Ruby, Python, Haskel, Java, D, PHP, Pure, Lua, やその他たくさんの言語たちをコンパイルするのに使えます。LLVM の主要な強味は、多能性 versatility, 柔軟性 flexibility, 再利用性 reusability であり、これは異なったタスクのそのような広い多様性のために使われているということの理由です: Lua のような組込み言語たちの軽量の JIT コンパイルをすることから、大規模なスーパーコンピュータのために Fortran のコードをコンパイルすることまでです。
他のすべてと同じくらい、LLVM はひとつの幅広くフレンドリィなコミュニティをもっています; すぐれた低レベルのツール群を構築することに興味を持つ人々からなるコミュニティです。もしあなたが参加することに興味があれば、よい最初の場所は、LLVM ブログ をざっと見てみることや LLVM デベロッパー・メーリングリスト にサインアップしてみることです。パッチを送ったりコミットアクセス権を得たりする方法、コピーライトやライセンスのトピックの情報については、LLVM デベロッパー・ポリシー をごらんください。

0 件のコメント:

コメントを投稿

何かありましたら、どうぞ: