多くの動的言語は、実行時間を短縮するためにJITコンパイラを実装しています(または実装したい)。必然的に、ピーナッツギャラリーの誰かがLLVMを使用しない理由を尋ねます。多くの場合、答えは「LLVMはJITの構築には適していない」です。 (たとえば、Armin Rigoのコメント here。 )
LLVMがJITの構築に適さないのはなぜですか?
注:LLVMには独自のJITがあります。 LLVMが以前は不適切であったが、現在は適切である場合、何が変わったのかを言ってください。 LLVM JITでLLVMバイトコードを実行することではなく、LLVMライブラリを使用して動的言語のJITを実装することについて話します。
Unladen Swallowの事後のブログ投稿にLLVMに関するいくつかのメモがあります: http://qinsb.blogspot.com/2011/03/unladen-swallow-retrospective.html .
残念ながら、現在の状態のLLVMは、実際には静的コンパイラーオプティマイザーおよびバックエンドとして設計されています。 LLVMコードの生成と最適化は優れていますが、高価です。最適化はすべて、静的なC言語のような言語で生成されたIRで動作するように設計されています。 Python)を最適化するための重要な最適化のほとんどは、以前の反復でプログラムがどのように実行されたかについての高度な知識を必要とし、LLVMはそれを助けませんでした。
LLVMがJITの構築に適さないのはなぜですか?
[〜#〜] hlvm [〜#〜] 、値型、テールコール除去、汎用印刷、C FFIおよびPOSIXスレッドを含む豊富な静的型システムを備えた高レベル仮想マシン静的コンパイルとJITコンパイルの両方のサポート。特に、HLVMは、高レベルのVMに対して 信じられないほどのパフォーマンス を提供します。これに見られるように、JITコンパイラーを使用して、バリアント型とパターンマッチングを備えたMLのようなインタラクティブフロントエンドを実装しました コンピューター代数デモンストレーション 。私のHLVM関連の仕事はすべて、合計数週間の仕事を合わせたものです(そして、私はコンピューター科学者ではなく、ただの手抜きです)。
結果はそれ自体を物語っており、LLVMが完全にJITコンパイルに適していることを明確に示していると思います。
LLVMをJITとして使用することについて プレゼンテーション があり、その理由の多くが、なぜ悪いのか、そのほとんどは、静的コンパイラーをJITとしてではなくJITとして構築する人々に要約されるようになっている実際のJITを構築します。
更新:2014年7月の時点で、LLVMは「パッチポイント」と呼ばれる機能を追加しました。これは、 SafariのFTL JavaScript JITで多態性インラインキャッシュをサポートするために使用されます。 これは、元の質問のint Armin Rigoのコメントについて不満を述べたユースケースを正確にカバーしています。
起動に長い時間がかかるのが最大の不満です。ただし、これはJavaがインタープリターモードで起動し、LLVMを使用してコンパイルする場合はそれほど問題ではありません。プログラムの最も使用される部分。
また、このような議論はインターネット中に散らばっていますが、 Mono はしばらくの間LLVMをJITコンパイラとして正常に使用しています(ただし、デフォルトではより高速ですが効率の低いバックエンドになっていることに注意してください) 、またLLVMの一部を変更しました)。
動的/動的言語の場合、LLVMはC/C++などの強力/静的に型指定され、非常に低レベルの機能をサポートするシステムプログラミング言語を最適化するために設計されたため、適切なツールではないかもしれません。一般に、Cで実行される最適化は、実際には動的言語を高速化しません。これは、低速システムを実行する効率的な方法を作成しているだけだからです。現代の動的言語JITは、実行時にのみ知られる関数のインライン化や、ほとんどの場合変数が持つ型に基づいた最適化など、LLVMは設計されていません。
LLVM IRの詳細については、 LLVM IRはコンパイラIRです を参照してください。