サイトマップ
ダウンロード! このサイトを検索 便利なリンク リリースメール 保守担当: llvm-adminチーム |
LLVMで構築されたプロジェクト
このページは、LLVMを使用して構築されたプロジェクトの不完全なリストであり、逆年代順にソートされています。このリストの目的は、様々なコースプロジェクトやその他の目的のためにLLVMで行われたことのいくつかを示し、将来のプロジェクトのアイデアの源として使用できるようにすることです。もう一つの良い場所は、LLVMを使用する発表論文や論文のリストです。 このページは、LLVMの現状を反映したり、特定のプロジェクトを他のプロジェクトよりも支持することを意図したものではありません。これは、様々な人々が行った努力のショーケースです。また、LLVMの機能がどのように時間とともに進化してきたかについても少し示しています。 このページへの新しい貢献を常に求めています。コースまたは出版物でLLVMを使用するプロジェクトに取り組んでいる場合は、ぜひお知らせください。また、あなたの作品もここに含めたいと思います。下記のようなエントリを添えて、LLVM-devメーリングリストにメールを送信してください。ソースコードは特に求めていません(通常のチャネルを通じてソースコードへの貢献は大歓迎ですが)、代わりにレポート、論文、プレゼンテーション、ポスターなど、あなたの仕事の「洗練された結果」を掲載したいと思います。
Dragoneggは、LLVMの最適化とコードジェネレータをGCCのパーサと統合します。これにより、LLVMはGCCコンパイラフロントエンドでサポートされているAda、Fortran、その他の言語をコンパイルし、ClangではサポートされていないC機能にアクセスできます。dragoneggウェブページを参照してください。 現在のMREはモノリシックです。新しい機能を提案したり、新しい言語を実行するためにそれらを再利用することは困難です。VMKitは、新しいMREの開発とMRE内で新しいメカニズムを試行するプロセスを容易にするライブラリです。VMKitは、MREの基本コンポーネントを提供します。JITコンパイラ、GC、およびスレッドマネージャです。vmkitウェブページを参照してください。 Gleison Mendonca、Breno Campos Ferreira Guimaraes、Péricles Alves、Marcio Machado Pereira、Guido Araéujo、Fernando Magno Quintao Pereiraによる。
Dawnプロジェクトのウェブページを参照してください。 OpenACCやOpenMPなどのディレクティブベースのプログラミングモデルは、並列アプリケーションの開発をサポートする有望な技術として今日台頭しています。これらのシステムにより、開発者は最小限の人間の介入でシーケンシャルプログラムを並列プログラムに変換できます。しかし、本番コードにプラグマを挿入することは、困難でエラーが発生しやすい作業であり、ターゲットプログラムに精通している必要があります。この困難は、開発者が自分で記述していないコードに注釈を付ける能力を制限します。この論文は、この問題の解決策における1つの基本的なコンポーネントを提供します。ソースコードで参照されるメモリ領域の境界を推論する静的プログラム分析を紹介します。このような境界により、並列化されたコードがGPUなどのアクセラレータデバイスで実行されることを目的とする場合に必要なデータ転送プリミティブを自動的に挿入できます。私たちのアイデアを検証するために、2つの異なるアーキテクチャ(NvidiaベースとQualcommベース)を使用して、Polybenchに適用しました。Polybenchのすべてのメモリアクセスの98%を正常に分析しました。この結果により、これらのベンチマークに自動アノテーションを挿入することができ、100倍以上の高速化を実現しました。 Zach DeVitoによる
Terraは、Luaに埋め込まれ、Luaによってメタプログラミングされるシステムプログラミング言語であり、条件付きコンパイル、型システム、名前空間、テンプレート/関数特殊化などの詳細は、他の言語では通常特別な構文です。TerraコードはLuaの構文と制御フロー構造を共有し、Lua関数を簡単に呼び出すことができ、その逆も可能です。JITコンパイラは実行時に使用できるため、ライブラリや埋め込みドメイン固有言語は、それを利用して、カスタム最適化による任意の高性能コードを動的に生成または自動調整できます。 Terraは既存のCコードとの下位互換性があり(そしてそれに埋め込むことができます)、同様に小さく、単相で、静的に型付けされた、手動メモリ管理によるコンパイル済み言語です。SIMD演算や、非一時的な書き込みやプリフェッチなどの低レベル機能も組み込みでサポートされています。Terraは、LuaJITとLLVMから独立して実行することもできます。実際、最終プログラムでLuaを必要としない場合は、Terraコードをオブジェクトファイル、共有ライブラリ、または実行可能ファイルに保存できます。 Codasip Ltd.による
Codasip Studioは、LLVMベースのC/C++コンパイラ生成を含む、アプリケーション固有命令セットプロセッサ(ASIP)設計のあらゆる側面を網羅する、高度に自動化された開発環境です。 CodAL(Codasipのプロセッサ記述言語)で記述されたプロセッサの高レベル記述から始めて、ユーザーは設計実装、検証環境、仮想システムプロトタイプ、および完全な再配布可能なプログラミング環境を生成できます。 Codasip Studioには、CodAL記述を分析し、ASIPプログラミングのための多数の拡張機能をサポートするLLVMバックエンドのソースを自動的に生成するコンパイラバックエンドジェネレータが含まれています。このように、ユーザーは数日で特定のアーキテクチャのための動作するC/C++コンパイラを生成できます。 Pony開発チームによる
Ponyは、オブジェクト指向、アクタモデル、機能安全、高性能プログラミング言語です。アクタをファーストクラス市民にすることでクラスモデルにアクタモデルを拡張することにより、並列処理の考え方重視しています。この言語は静的に型付けされ、型とメモリが安全であり、データ競合、キャッチされない例外、デッドロックがないという強力な保証が付属しています。Ponyは、世代や読み取りおよび書き込みバリアを必要とせずに、マークアンドスイープ型のガベージコレクタを実装します。「stop-the-world」ステップは必要ありません。アクタ間のメッセージパッシングはすべて因果的です。 smackersによる
SMACKは、入力LLVM中間表現(IR)プログラムで与えられたアサーションを検証する自動ソフトウェア検証ツールです。内部的には、SMACKはLLVM IRからBoogie中間検証言語(IVL)へのトランスレータです。Boogieをターゲットにすることで、検証、モデル検査、抽象解釈のアルゴリズムの実装を簡素化する標準的なプラットフォームを利用できます。 DiscoPoP(潜在的な並列処理の検出)は、シーケンシャルなC/C++プログラムにおける潜在的な並列処理を特定するのに役立つツールです。制御依存関係とデータ依存関係の両方を検出するためにコードを計装します。依存関係の上に一連の分析が構築され、潜在的な並列処理と並列パターンを調べます。計装はLLVMの助けを借りて行われます。DiscoPoPを呼び出すための新しいオプション「-dp」を含む修正版Clangも提供されています。 Jérôme Gorin(ARTEMIS/Institut Telecom/Telecom SudParis)、Mickaël Raulet、Matthieu Wipliez(IETR/INSA Rennes)による
Jade(Just-in-time Adaptive Decoder Engine)は、ビデオデコーダ構成のJust-in-timeコンパイルにLLVMを使用する汎用ビデオデコーダエンジンです。これらの構成は、MPEGリコンフィギュラブルビデオコーディング(RVC)委員会によって設計されています。MPEG RVC標準は、デコーダのストリームベースのデータフロー表現に基づいています。これは、RVC-CAL言語で記述された標準的なコーディングツールのライブラリと、デコーダのデータフロー構成(ブロック図)で構成されています。 Jadeプロジェクトは、Open RVC-CALコンパイラ(Orcc)の一部としてホストされており、ビデオコーディングツールのRVC-CAL標準ライブラリをLLVMアセンブリコードに変換するために必要です。 Crackは、スクリプト言語の開発の容易さとコンパイル済み言語のパフォーマンスを提供することを目指しています。この言語は、C++、Java、Pythonから概念を派生し、オブジェクト指向プログラミング、演算子のオーバーロード、強い型付けを組み込んでいます。 Rubiniusは、Rubyのための新しい仮想マシンです。LLVMを利用して、LLVMのJITを使用してRubyコードをマシンコードに動的にコンパイルします。 MacRubyは、Objective-C共通ランタイムとガベージコレクタ、CoreFoundationフレームワークなどのMac OS Xコアテクノロジー上に構築されたRubyの実装です。主にAppleによって開発されており、本格的なMac OS Xアプリケーションの作成を可能にすることを目的としています。 MacRubyは、Ruby式を最適化パス、JIT、AOTコンパイルするためにLLVMを使用します。また、ゼロコストDWARF例外を使用してRuby例外処理を実装します。 様々な貢献者による。
容易にポータブルなオープンソースのOpenCL実装を提供することに加え、poclのもう一つの主要な目標は、コンパイラ最適化によるOpenCLプログラムのパフォーマンス・ポータビリティの向上であり、ターゲット依存の手動最適化の必要性を減らすことです。 poclの重要な部分として、ワークグループのバリアが存在する場合でも、カーネルコンパイラを用いて複数のワークアイテムを静的に並列化するLLVMパスがあります。これにより、ワークグループ内の細粒度の静的並列処理を複数方法で静的に並列化できます。 Tampere University of TechnologyのCustomized Parallel Computingグループによる
TCEは、トランスポートトリガアーキテクチャ(TTA)に基づいた、カスタマイズされた露出データパスプロセッサを設計するためのツールセットです。 このツールセットは、C/C++プログラムから合成可能なVHDL/Verilogおよび並列プログラムバイナリに至るまで、完全な協調設計フローを提供します。プロセッサのカスタマイズポイントは、レジスタファイル、機能ユニット、サポートされる演算、および相互接続ネットワークを含みます。 TCEは、C/C++/OpenCL C言語のサポート、ターゲットに依存しない最適化、およびコード生成の一部にClangとLLVMを使用しています。設計されたプロセッサに対して「オンザフライ」で新しいLLVMベースのコードジェネレータを生成し、それらをランタイムライブラリとしてコンパイラバックエンドにロードすることで、コンパイラチェーンの大部分のターゲットごとの再コンパイルを回避します。 Gary Benson(Red Hat, USA)による
IcedTeaプロジェクトは、フリーソフトウェアのビルドツールのみを使用してOpenJDKをビルドするためのハーネスを提供し、OpenJDKのまだフリーではない部分を置き換えるために結成されました。時間の経過とともに、OpenJDKへの様々な拡張機能がIcedTeaに含まれるようになりました。 これらの拡張機能の1つがZeroです。OpenJDKはx86とSPARCプロセッサのみをサポートしていますが、Zeroはプロセッサに依存しないレイヤーであり、OpenJDKを任意のプロセッサでビルドして実行できます。Zeroには、プロセッサ依存のコードを導入することなくネイティブコード生成を提供するためにLLVMを使用するSharkと呼ばれるJITコンパイラが含まれています。 ZeroとSharkの開発はRed Hatによって資金提供されました。 Albert Graef、Johannes Gutenberg University Mainz(ドイツ)による
Pureは、項書き換えに基づいた代数的/関数型プログラミング言語です。プログラムは、式の記号的な評価に使用される方程式の集合です。Pureは、動的型付け、積極的および遅延評価、レキシカルクロージャ、衛生的なマクロシステム(項書き換えに基づく)、組み込みリストおよび行列サポート(リストおよび行列内包表記を含む)、そして使いやすいCインターフェースを提供します。インタプリタは、Pureプログラムを高速なネイティブコードにJITコンパイルするためにLLVMをバックエンドとして使用します。 一般的な代数的データ構造に加えて、PureはMATLABスタイルの行列も備えており、数値計算と信号処理を効率的にサポートします。Pureは現在主に数学アプリケーションを対象としていますが、汎用言語として設計されています。動的なインタプリタ環境とCインターフェースにより、多くのアプリケーション分野で関数型スクリプト言語のようなものとして使用できます。 LDC開発者による
Dは、Cのような構文と静的型付けを持つ言語です。効率性、制御、モデリング能力と、安全性およびプログラマの生産性を実際的に組み合わせます。Dは、コンパイル時関数実行(CTFE)やテンプレートメタプログラミングなどの強力な概念をサポートし、並行処理への革新的なアプローチを提供し、多くの古典的なパラダイムを提供します。 LDCコンパイラは、参照コンパイラからのフロントエンドとLLVMをバックエンドとして組み合わせて、効率的なネイティブコードを生成します。 このプロジェクトは、Javaのようなプログラミング言語のLLVMアセンブリコードを生成するコンパイラフロントエンドの開発について説明しています。これは、コンパイラに関するコースで使用され、JFlexやCupなどの一般的なツールを使用して、翻訳プロセスの連続する段階を段階的に設計および実装する方法を示しています。各段階で開発されたソースコードは公開されています。 Fernando PereiraとJens Palsberg、UCLAによる。
このプロジェクトでは、レジスタ割り当てをパズルの集合を解くこととして見ることができることを示しました。レジスタファイルをパズルボードとして、プログラム変数をパズルのピースとしてモデル化します。プリカラーリングとレジスタエイリアシングは自然に適合します。x86、SPARC V8、StrongARMなどのアーキテクチャでは、パズルを多項式時間で解くことができ、スピルのための単純なヒューリスティックをパズルソルバーに追加しました。SPEC CPU2000の場合、実装はLLVMで使用されている拡張版の線形スキャンと同程度の速度です。実装は、GeorgeとAppelの拡張版の最先端の反復レジスタ連結アルゴリズムにSmith、Ramsey、Hollowayによる拡張を追加したものと同等の品質のPentiumコードを生成します。 LLVMのレジスタアロケータの出力を検証するツールへのリンクを含むプロジェクトページ。 Faustリアルタイム信号処理システム
FAUSTは、リアルタイムオーディオ信号処理のためのコンパイル済み言語です。FAUSTという名前は、Functional AUdio STreamを表しています。そのプログラミングモデルは、関数型プログラミングとブロックダイアグラム合成という2つのアプローチを組み合わせたものです。FAUSTを、テキスト構文を持つ構造化ブロックダイアグラム言語と考えても構いません。このプロジェクトは、現在Faustが生成するC++クラスではなく、LLVM IRを直接生成するFaustの新しいバックエンドを開発することを目指しています。 (まだ開発中ですが)Faustコンパイラのライブラリバージョンを使用すると、開発者はFaust + LLVM JITを埋め込んで、Faustプラグインを動的に定義し、オンザフライでコンパイルし、実行できます。LLVM IRとツールは、「部分評価/特殊化」のような優れたバイトコード操作も可能にし、それについても調査されます。 アドビシステムズ株式会社による
画像処理に使用可能な計算リソースの効率的な使用は、Adobe Image Foundationプロジェクトの目標です。私たちの言語「Hydra」は、シングルステージとマルチステージの画像処理カーネルを記述するために使用され、その後コンパイルされて、より大きなアプリケーション内でターゲットマシン上で実行されます。その名前が示唆するように多くのヘッドを持つように、私たちのHydraはGPUまたはホストCPUで実行できます。AIFはCPUパスにLLVMを使用しています。 私たちのシステムを使用する最初のアドビアプリケーションは、近日発売予定のAfter Effects CS3です。labs.adobe.comにある公開ベータ版をお試しください。 Domagoj Babic、UBCによる。
Calystoは、スケーラブルなコンテキストおよびパスに依存するSSAベースの静的アサーションチェッカーです。他の静的チェッカーとは異なり、CalystoはSSAを直接分析します。つまり、元のコードだけでなく、コードのコンパイルに使用されたコンパイラのフロントエンド(SSA最適化を含む)もチェックします。SSAで静的チェックを行うことの利点は、言語の独立性と、チェックされたコードがソースコードよりも生成されたアセンブリに非常に近いという点です。 Calystoのスケーラビリティに貢献するいくつかの主な要因があります。
現在、Calystoはまだ開発段階にあり、最初の結果は有望です。最初の公開リリースは、2007年の秋頃になる可能性が最も高いです。SpearとCalystoが生成したベンチマークが利用可能です。 Fernando Pereira、UCLAによる。
レジスタ割り当て問題は、単一静的代入(SSA)形式のプログラムに制限されている場合、正確な多項式解を持ちます。驚くべきことですが、この主要な理論的成果はまだ経験的に裏付けられていません。LLVMコンパイラフレームワークを使用して、完全なSSAベースのレジスタアロケータを実装することが、このプロジェクトの内容です。レジスタアロケータの実装を簡素化し、生成されるコードの品質を向上させるターゲットプログラムの静的変換を実装しました。また、レジスタ連結とSSA削除を実行するための新しい手法についても説明します。割り当て手法を検証するために、手法のさまざまなバリエーションを、ここで説明されている、現代的で高度に調整された線形スキャンレジスタアロケータの拡張版と比較しました。提案されたアルゴリズムは、ターゲットアーキテクチャが少数のレジスタを提供する場合に、常に高速なコードを生成します。たとえば、汎用レジスタを4つ、予約レジスタを3つに制限した場合、平均9.2%の速度向上を達成しました。積極的な連結手法をアルゴリズムに追加することで、速度向上を最大13.0%に引き上げることができました。 このプロジェクトは、GoogleのSummer of Codeイニシアチブによってサポートされました。Fernando Pereiraは、番号218603-9のプロセスに基づいてCAPESから資金提供を受けています。 Michael O. McCracken、UCSDによる。
LENSプロジェクトは、プログラムの測定と動作の調査というタスクを改善することを目的としています。LENSは、プログラムの外部表現をXMLで定義し、ループ構造情報など、プログラム構造に基づいてアクセスできる有用な情報を格納します。 Lensは、XPathとLENS XMLドキュメント構造に基づいて、プログラムコンポーネントの柔軟な命名スキームを定義します。これにより、ユーザーとツールは統一されたインターフェースからプログラムの動作を選択的にクエリできます。ユーザーまたはツールはプログラムコンポーネントに関するさまざまな質問をすることができ、クエリを理解するツールであればどのようなツールでも回答できます。クエリ、メトリクス、プログラム構造はすべてLENSファイルに格納され、履歴比較と科学的記録保持をサポートするバージョン名でアノテーションされています。 コンパイラライターは、LENSを使用して、情報過多の表示や処理を心配することなく、プログラムの変換と分析の結果を簡単に公開できます。この機能は、LLVMを使用して実証されています。LENSはLLVMを2つの目的で使用します。1つ目は、LLVMパスを使用してXMLで初期のプログラム構造ファイルを生成することであり、2つ目は、LLVMパスがLENSファイルのクエリに簡単に応答できるようにするLLVMに組み込まれたインターフェースを使用して、コンパイラ情報の選択的クエリングの利点を示すことです。 ロスアラモス国立研究所による
Tridentは、Cで記述された浮動小数点アルゴリズムのコンパイラであり、再構成可能論理デバイスを対象とした回路のレジスタ転送レベルVHDL記述を生成します。Tridentは、従来のコンパイラ最適化とスケジューリング技術を使用して、並列処理とパイプラインループボディを自動的に抽出します。Tridentは、FPGA上の浮動小数点アルゴリズムの実験、分析、最適化のためのオープンフレームワークと、カスタム浮動小数点ライブラリを簡単に統合できる柔軟性も提供します。 Tridentは、LLVM C/C++フロントエンドを使用して入力言語を解析し、低レベルのプラットフォームに依存しないコードを生成します。 Asceniumは、ほとんどの命令をハードワイヤード速度で処理しながら、従来の高レベル言語をターゲットにする能力を維持する、きめ細かい継続的に再構成可能なプロセッサであり、ユーザーに「ハードウェアのパフォーマンスとソフトウェアの使いやすさ」を提供します。 Asceniumチームは、いくつかの理由からコードジェネレータへの入力としてLLVMバイトコードを好みます。
AsceniumのHOT CHIPS 17 プレゼンテーションでは、アーキテクチャとコンパイラについてより詳細に説明しています。 Tobias Nurmiranta
これは、Schemeで記述されたLLVM用の小型Schemeコンパイラです。自身をコンパイルして動作するのに十分な機能を備えています。 このコードは、「SICP(Structure and Interpretation of Computer Programs)」の5章にあるコードと非常によく似ていますが、明示的な制御評価器(仮想マシン)が既に備えているとSICPが想定している追加機能を実装している点が異なります。コンパイラの多くの機能は、Schemeのサブセットであるllvm-definesで実装されており、これらはLLVM関数にコンパイルされます。 LLVM可視化ツール(LLVM-TV)を使用して、LLVMフレームワークで記述された変換の効果を可視化できます。私たちの可視化は、変換間の単一の時点におけるコンパイルユニットの状態を反映しており、これらの保存された状態を「スナップショット」と呼んでいます。ユーザーは、プログラムの最適化時など、同じモジュールのスナップショットのシーケンス、または比較目的で異なるモジュールのスナップショットを可視化できます。 私たちの対象読者は、LLVM表現とその分析と変換を理解しようとしているLLVMフレームワーク内で作業している開発者です。さらに、LLVM-TVは、新しい種類のプログラム可視化モジュールを簡単に追加できるように設計されています。LLVM-TVはwxWidgetsクロスプラットフォームGUIフレームワークに基づいており、AT&T ResearchのGraphVizを使用してグラフを描画します。 概要、設計文書、およびユーザーマニュアルを含むWikiページ。LLVM SVN(https://llvm.dokyumento.jp/svn/llvm-project/television/trunk)からllvm-tvをダウンロードできます。 線形スキャンレジスタ割り当ては、Linear Scan Register Allocationで最初に提示された高速なグローバルレジスタ割り当てであり、より広く使用されているグラフ彩色アプローチの代替手段です。この論文では、SSA形式のシステムに線形スキャンレジスタ割り当てアルゴリズムを適用し、ライフタイムホールとメモリオペランドを利用してアルゴリズムを改善する方法、およびスピルコード用にレジスタを予約する必要性を排除する方法を示します。 従来のアーキテクチャでは、ハードウェア命令セットを二重の目的で使用しています。まず、ソフトウェアプログラムのセマンティクスを表現するための言語として、次に、ハードウェアを制御する手段としてです。Low-Level Virtual Architectureプロジェクトの主題は、これらの2つの用途を互いに切り離し、ソフトウェアをセマンティックに豊かで、より簡単に操作できる形式で表現できるようにし、コンパイル済みコードでより強力な最適化とプログラム全体の分析を可能にすることです。 LLVAで使用しているセマンティックに豊かなフォーマットは、LLVMコンパイラインフラストラクチャの中間表現に基づいており、「仮想命令セット」として最もよく理解できます。これは、その命令が基盤となるハードウェアで使用可能な命令と密接に一致している場合でも、基盤となるハードウェアが理解する命令と正確に対応するとは限らないことを意味します。これらの基礎となる命令を「実装命令セット」と呼びます。これらの2つのレイヤー間には、通常ソフトウェアで実装される変換レイヤーがあります。 このプロジェクトでは、(1)Linuxカーネル全体をLLVAに移植し、(2)カーネルをそのLLVMバイトコード表現から直接実行できる環境を設計することにより、この取り組みにおける次の論理的なステップを踏みました。本質的に、LLVAをネイティブ命令セットとする最小限の完全なエミュレートされたコンピューターシステムです。私たちが発明したエミュレーターであるllva-emuは、プログラムをLLVMバイトコード形式からプロセッサのネイティブ命令セットに「Just-in-Time」で変換することにより、カーネルコードを実行します。 Brian Fahs
すべての現代的なコンピューターユーザーが経験しているように、ソフトウェアの更新とアップグレードには、多くの場合、プログラム、場合によってはオペレーティングシステム全体を再起動する必要があります。これは、苦痛で迷惑な経験になる可能性があります。この一般的な迷惑を完全に回避するか、少なくとも大幅に軽減できたらどうでしょうか?コンピューターの電源を落としたい場合、または更新が発生した場合ではなく、必要な場合にのみアプリケーションを閉じたい場合にのみ、システムを再起動することを想像してみてください。このプロジェクトの目的は、実行可能ファイルの動的パッチングの可能性を調査し、パッチを自動的に生成して既に実行中のアプリケーションに適用できるパッチングツールを作成することです。このプロジェクトでは、次のような質問に答える必要があります。動的更新をどのように実行できますか?どのような種類の分析が必要ですか?この分析を効果的に自動化できますか?実行中の実行可能ファイルで何が更新できますか(例:アルゴリズム、組織、データなど)? Tanya Brethour、Joel Stanley、およびBill Wendling
このレポートでは、[1999年のTOPLAS SSAPRE論文]に基づくPREのアルゴリズムに対する実装の詳細、経験的パフォーマンスデータ、および注目すべき変更について説明します。[1999年のTOPLAS SSAPRE論文]では、SSAPREとして知られるPREの特定の実現について説明されており、従来のPRE実装よりも効率的です。これは、静的単一代入(SSA)形式の有用なプロパティを利用して、従来のビットベクトルベースのアプローチよりもはるかにスパースな方法でデータフロー分析を実行するためです。私たちの実装は、LLVM(Low-Level Virtual Machine)として知られるSSAベースのコンパイラインフラストラクチャに固有のものです。 Intel IA32アーキテクチャ用の再ターゲット可能なJust-In-Time(JIT)コンパイラであるJelloの設計と実装について説明します。Jelloへの入力は、Low-Level Virtual Machine(LLVM)バイトコードに静的にコンパイルされたCプログラムです。Jelloは、LLVMバイトコード表現の機能を利用して、効率的なランタイムコード生成を可能にし、同時に再ターゲット可能性を重視しています。私たちのアプローチでは、静的単一代入形式の抽象マシンコード表現を使用しており、これはマシンに依存しませんが、暗黙的および明示的なレジスタ参照などのマシン固有の機能を処理できます。この表現はターゲットに依存しないため、コード生成の多くのフェーズをターゲットに依存しないものにすることができ、コードジェネレーターを変更せずにJITを新しいプラットフォームに簡単に再ターゲットできます。Jelloの究極の目標は、従来は静的にコンパイルされている言語で記述されたプログラムのランタイム最適化における将来の研究のための柔軟なホストを提供することです。 Jelloは最終的に、ツールlliの一部である現在のLLVM JITに進化したことに注意してください。 Alon ZakaiとEmscriptenコントリビューターの残りのメンバー
EmscriptenはLLVMビットコードをJavaScriptにコンパイルするため、CおよびC ++ソースコードをJavaScriptにコンパイルできます(最初にClangを使用してLLVMビットコードにコンパイルすることにより)。これはWebで実行できます。Emscriptenは、Python(標準のCPython実装)、Bullet物理エンジン、eSpeak音声合成器など、多くの既存のCおよびC ++コードベースの移植に使用されてきました。 Emscripten自体はJavaScriptで記述されています。重要なコンポーネントには、LLVMビットコードにある低レベルの基本ブロック情報から高レベルのJavaScript制御フロー構造(「if」、「while」など)を生成するRelooperアルゴリズムと、LLVMアセンブリのJavaScriptパーサーがあります。 Rustは、中括弧を使用するブロック構造の式言語です。視覚的にはC言語ファミリーに似ていますが、構文とセマンティクスの詳細では大きく異なります。その設計は、「大規模なプログラミング」、つまり大規模システムの整合性、可用性、同時実行性を維持する抽象的なものと操作的なものの両方の境界を作成および維持することに重点を置いています。 命令型手続き型、同時実行アクタ、オブジェクト指向、純粋関数型のスタイルを組み合わせてサポートしています。Rustは、静的スタイルと動的スタイルの両方で、ジェネリックプログラミングとメタプログラミングもサポートしています。 静的/ネイティブコンパイルはLLVMを使用しています。 ESL(組み込みシステム言語)は、組み込みシステムやその他の低レベルシステムプログラミングプロジェクトの効率的な実装のために設計された新しいプログラミング言語です。ESLは、プログラマーがデータ値の具体的な表現を指示できる機能を備えた型付きコンパイル言語です。たとえば、通信プロトコルやデバイスレジスタを扱う場合に役立ちます。 新機能は次のとおりです。予約語なし、プロシージャは複数の値を返すことができます、自動エンディアン変換、型に対するメソッド(ただし、クラスはありません)。構文はC風よりもPascal風ですが、Cの括弧を使用します。コンパイラはLL IRからブートストラップされます。 リアルタイムシステムコンパイラ(RTSC)は、オペレーティングシステムを認識するコンパイラであり、特定のリアルタイムアプリケーションのリアルタイムシステムアーキテクチャを汎用的に操作できます。 現在、最も興味深いアプリケーションは、イベントトリガー型(OSEK OSベース)システムをタイムトリガー型(OSEKTimeベース)システムに自動的に移行することです。これを実現するために、RTSCは、いわゆる「Atomic Basic Blocks」(ABB)によって形成されるアプリケーションのソースコードから抽象的なグローバル依存グラフを導出します。この「ABBグラフ」は、元のオペレーティングシステムへの依存関係がありませんが、アプリケーションのすべての制御およびデータ依存関係が含まれています。したがって、このグラフを別のターゲットオペレーティングシステムにマッピングできます。現在、入力アプリケーションはOSEK OS用に記述でき、OSEKTimeまたはPOSIXシステムに移行できます。 LLVMフレームワークは、プロセス全体で使用されます。最初に、ABBグラフを作成するために必要なアプリケーションの静的分析は、LLVMフレームワークを使用して実行されます。さらに、ターゲットシステムの操作と最終的な生成もLLVMに基づいています。 Vuoは、マルチメディアアーティスト向けの最新のビジュアルプログラミング言語です。Vuoコンパイラは、さまざまな言語で記述されたモジュールコンポーネントと、コンポーネント間のデータフローのグラフを取得します。LLVMコード生成APIを使用することにより、Vuoコンパイラはグラフをネイティブのマルチスレッド実行可能ファイルに変換します。 |