のようにスプラウトコア, LLVM は新しいものでも秘密のものでもありませんが、どちらも将来の可能性を覆い隠している厚い複雑さの層のために注目から隠れてきました。
WWDC で LLVM を探しています
繰り返しますが、LLVM のパンくずリストの追跡は、公開 WWDC スケジュールから始まります。火曜日のセッション「新しいコンパイラ技術と将来の方向性」では、次のような概要が詳しく説明されました。
「Xcode 3.1 では、Mac OS X 用の 2 つの新しいコンパイラ、GCC 4.2 と LLVM-GCC が導入されています。GCC 4.2 の新しいセキュリティとパフォーマンスの向上が、より優れたアプリケーションの作成にどのように役立つかを学びましょう。LLVM-GCC の革新性を理解し、最後に、将来のコンパイラ開発のプレビューを入手してください。」
その段落には発音できない単語がすべて大文字でたくさんあります、LOLBBQ。いくつかを抜き出して、概要が理解できるまで定義してみましょう。
GCC の紹介
アルファベット スープの最初の頭字語は GCC で、元々は GNU C コンパイラーでした。このプロジェクトは、Free Software Foundation の Richard Stallman によって 80 年代半ばに始まりました。ストールマン氏の急進的なアイデアは、販売ではなく共有されるソフトウェアを開発することであり、その意図は、コードに貢献したものはすべて、他の人も使用できる形式で渡されるという条件で、誰でも使用できるコードを提供することでした。
ストールマン氏は、AT&T の Unix の無料版の開発に取り組んでいました。Unix はすでに学界の標準オペレーティング システムになっていました。彼は核心部分から始めました。C 言語で何かを開発するには、その高レベルで移植可能な C ソース コードを、特定のプロセッサ アーキテクチャでの実行に適した機械語オブジェクト コードに変換する C コンパイラが必要です。
GCC は長年にわたる一連の進歩を経て、GNU Linux、BSD Unix、Mac OS X、およびさまざまな組み込みオペレーティング システムの標準コンパイラになりました。 GCC は、さまざまなプロセッサ アーキテクチャ ターゲットと高級言語ソースをサポートします。
Apple は、Leopard の Xcode 3.1 で GCC 4.0 および 4.2 の特殊バージョンを使用しています。これは、デスクトップ上の PowerPC ターゲットと Intel ターゲットの両方への Objective-C/C/C++ コードのコンパイルをサポートし、iPhone 上の ARM 開発をターゲットとするために GCC 4.0 を使用しています。
コンパイラ
コンパイラは、ソース コードの構築とデバッグおよび展開の間の開発ツールチェーンの部分を指します。コンパイルの最初のフェーズは、フロントエンドパーサー、ソース コードに対して初期の言語固有の構文とセマンティック分析を実行して、プログラムの内部表現を作成します。
コードはその後、オプティマイザこのフェーズでは、コードの冗長性や、最終バージョンに存在する必要のないデッドコードを削除するなどの作業を行うことで改善します。
のコードジェネレータ次に、フェーズは最適化されたコードを取得して出力プロセッサにマップします。その結果、人間が判読できないアセンブリ言語コードが生成されます。
のアセンブラフェーズは、アセンブリ言語コードを、ハードウェア プロセッサまたはソフトウェア仮想マシンによって解釈できるオブジェクト コードに変換します。
最終フェーズは、リンカ、オブジェクト コードと必要なライブラリ コードを組み合わせて、最終的な実行可能ファイルを作成します。
LLVM の紹介
現在、GCC は、Apple の Mac OS X IDE (統合開発環境) である Xcode 内でコードをコンパイルするためのすべてのフェーズを処理します。ただし、GCC の使用にはいくつかの欠点があります。
1 つは、GPL に基づいて提供されるということです。つまり、Apple は、IDE も GPL にしない限り、Xcode に直接統合することはできません。 Apple は、大規模な独自製品の一部としてオープン プロジェクトを拡張することに制限がない、BSD/MIT スタイルのオープン ソース ライセンシーを好みます。
もう1つは、GCCの一部が歯内で長くなっているということです。 LLVM は、ジャスト イン タイム コンパイル、ファイル間最適化 (さまざまな言語のコードをリンクし、ファイル境界を越えて最適化できる)、およびモジュール型コンパイラ アーキテクチャに重点を置き、コンパイラ部分がどのように機能するかを再考することを目指した最新のプロジェクトです。既存のコンパイラ ツールと適切に統合しながら、相互に依存関係がほとんどないコンポーネントを作成します。
LLVM は、Chris Lattner の研究プロジェクトとして 2000 年にイリノイ大学で開始されたばかりです。これは 2003 年にバージョン 1.0 としてリリースされました。Lattner は、Objective-C に関する質問を同社の objc 言語メーリング リストに投稿した後、Apple の注目を集めました。 Apple も 2005 年に LLVM プロジェクトに貢献し始め、その後、彼の仕事に資金を提供するために Lattner を雇いました。
Clang と LLVM-GCC
昨年リリースされたプロジェクトクランApple 主導の LLVM コンパイラ ツールのスタンドアロン実装として、メモリ使用量を抑えた高速コンパイル、表現力豊かな診断、モジュラー ライブラリ ベースのアーキテクチャ、Xcode などの IDE 内での緊密な統合を提供することを目的としており、これらはすべて BSD オープン ソース ライセンスの下で提供されます。 。
Objective C/C/C++ 用の初期の開発フロントエンド コード パーサーを使用する純粋な LLVM Clang プロジェクトに加えて、Apple は Lattner のコードに基づいて LLVM のコンポーネントを既存の GCC に統合する作業も開始しました。LLVM/GCC 統合提案。その結果、フロントエンド パーサーなどの GCC の成熟したコンポーネントを活用しながら、最新のコード オプティマイザーを含む LLVM の最も価値のあるコンポーネントを追加するハイブリッド システムが誕生しました。
LLVM-GCC として知られるこのプロジェクトは、LLVM のオプティマイザーとコード ジェネレーターを GCC に挿入し、標準の GCC コンポーネントには欠けている「積極的なループ、標準スカラー、プロシージャ間最適化とプロシージャ間分析」のための最新の手法を提供します。
LLVM-GCC は GCC と高い互換性を持つように設計されているため、開発者はワークフローに大幅な変更を加えることなく、新しいコンパイラに移行してコード最適化の恩恵を受けることができます。情報源によると、LLVM-GCC は GCC から出力されたコードよりも「一貫して 33% 高速に実行されるコードをコンパイルする」と報告されています。
Apple も LLVM を使用しています。OpenGLスタックLeopard では、仮想マシンの概念を活用しています。共通IRそのコードを解釈するための実際のシリコンを持たない Mac 上で OpenGL ハードウェア機能をエミュレートします。コードは代わりに CPU 上で解釈または JIT されます。
Apple は iPhone 開発でも LLVM を使用しています。プロジェクトのモジュラー アーキテクチャにより、Nokia の INdT による作業のおかげで LLVM 2.0 でサポートされるようになった ARM など、他のアーキテクチャのサポートを追加するのが簡単になるからです。
の上2ページ目の 2: LLVM と Apple のマルチコアの将来。改善のためにオープン。
LLVM は、マルチコアおよびマルチプロセッサの並列処理に関する Apple の継続的な戦略に組み込まれています。現在、CPU は物理的な限界に達しており、ギガヘルツを上げるだけではチップの高速化が妨げられています。 Intel のロードマップによれば、同社は現在、複数のコアを追加することで将来のパフォーマンスを向上させる計画を立てています。 Apple はすでにハイエンドの 8 コア Mac を出荷しており、Intel はプロセッサあたりのコア数を 2 桁に増やす計画を立てています。
これらのコアを活用するのは簡単ではありません。古典的な Mac OS と Windows のレガシー スパゲッティ コードは、10 年間の CPU の使用によって生のクロック速度が急速に向上することで高速化されましたが、将来の進歩は、マルチ コアを最大限に活用できる高効率のコードを生成することによってもたらされます。
スレッド スケジューリングの既存の方法では、複数のコア間で同期を保つのが難しく、最新のハードウェアの使用効率が低下します。 OpenCL や Grand Central Dispatch などの機能により、Snow Leopard はプロセッサ間の並列処理を管理し、最適化されたコードを GPU のコアにプッシュする機能を強化します。WWDC 2008: Mac OS X Snow Leopard の新機能。ただし、OS が並列タスクを効率的にスケジュールするには、コンパイラによってコードが並列処理用に明示的に最適化される必要があります。
改善の余地あり
LLVM は、高パフォーマンスのスケジューリングのためのコードを準備するための重要なツールになります。 Apple は LLVM プロジェクトへの最大の貢献者として、学界の研究者やスーパーコンピューター メーカー Cray を含む業界パートナーとともにコンパイラー技術の進歩に取り組んでいます。 Apple はまた、GCC のパフォーマンスを向上させ、機能を追加するために GCC に貢献しています。
どちらのプロジェクトもオープンソースであるため、会社が次に何をしようとしているのかのヒントを見つけるのは簡単です。コードのデバッグ、コンパイラの速度、出力コードの速度、悪意のあるバッファ オーバーフローの阻止に関連するセキュリティ機能、およびプロセッサ固有の最適化の機能強化がすべて連携して、より高品質のコードを作成します。
つまり、アプリケーションは今後も高速化され、開発者は時代遅れのコンパイラ テクノロジに時間を費やすことなく、追加できる価値に集中しやすくなります。
Apple にとって、独自の高度なコンパイラの専門知識に投資するということは、実行するソフトウェアを手動で調整しながら、Apple が PA Semi の買収で構築するモバイル SoC などの専用プロセッサを最適化できることも意味します。に記載されているように、Apple の PA 半買収がチップの歴史にどのように組み込まれるか。
さらに詳しい情報はこちらLLVM コンパイラ インフラストラクチャ プロジェクト。ラトナー氏は自身のプレゼンテーションのPDFも公開した。LLVM コンパイラ システム2007年のボッサカンファレンスにて。