ジャストインタイム コンパイラとインタープリターの違いは何ですか?また、.NET と Java JIT コンパイラの違いは何ですか?
8 に答える
ジャストインタイム コンパイルは、バイトコードなどの非ネイティブ コードを実行直前にネイティブ コードに変換することです。
ウィキペディアから:
JIT は、ランタイム環境における以前の 2 つのアイデア (バイトコード コンパイルと動的コンパイル) に基づいています。ネイティブに実行する前に、実行時にコードを変換します。たとえば、バイトコードをネイティブ マシン コードに変換します。
インタプリタはプログラムを実行します。ジッターがある場合とない場合があります。
繰り返しますが、ウィキペディアから:
インタプリタは、次のいずれかのプログラムである場合があります。
- ソースコードを直接実行する
- ソースコードを効率的な中間表現 (コード) に変換し、すぐにこれを実行します。
- インタープリターシステムの一部であるコンパイラーによって作成された、保存されたプリコンパイル済みコードを明示的に実行します
標準の Java ディストリビューションと .NET ディストリビューションの両方に JIT コンパイルがありますが、標準では必須ではありません。中間のバイトコードが異なるため、.NET と C# の JIT コンパイラはもちろん異なります。原理は同じですが。
インタプリタは、以前に実行されたかどうかに関係なく、命令ごとにオンザフライでマシンコード命令を生成して実行します。
JIT は、以前にマシン コードに解釈された命令をキャッシュし、それらのネイティブ マシン コード命令を再利用するため、既に解釈されたステートメントを再解釈する必要がないため、時間とリソースを節約できます。
実行エンジンがコンパイラなのかインタプリタなのかという問題は、あるルーチンが 1,000 回実行されるとどうなるかを考えれば、非常に簡単に答えることができます。実行エンジン内のコードがコードの特定の表現を 1,000 回検査する必要がある場合、実行エンジンはその表現のインタープリターです。実行内のコードが実行エンジンでコードの特定の表現をより少ない回数 (通常は 1 回である必要はありませんが) 検査するだけでよい場合、それはその表現のコンパイラまたはトランスレータです。実行エンジンが入力コードを受け取り、それをより簡単に検査できる他の形式に変換することは非常に一般的であることに注意してください。このような実行エンジンは、前者の形式のコンパイラまたはトランスレータと後者の形式のインタプリタを組み合わせます。
インタプリタが何らかの形式のマシン コードを生成することはめったにないことに注意してください。インタプリタがマシンコードを生成するのは、ステートメントが他の方法では実行できない操作を実行する必要がある場合のみです。たとえば、8080 で実行されている BASIC インタープリターが命令「OUT 100,5」に遭遇した場合、通常、D3 64 C9 (OUT 64h / RET) をある固定アドレスの 3 つの連続するバイトに格納し、A に5、そしてそのアドレスを呼び出します。インタープリターは技術的にマシン コードを生成している可能性がありますが、同じ OUT 命令を 500 回実行すると、インタープリターは毎回マシン コードを再生成する必要があります。
JIT コンパイラは、ブロック ソース コードを変換するバイナリ マシン コードを生成します。インタープリターは行ごとに翻訳します。
クラスが初めて参照されると、JIT 実行エンジンは、JVM 命令セットを含む Java コンパイラによって生成された .class ファイル (プライマリ バイナリ) を、ホスト システムの命令セットを含むバイナリに再コンパイルします。JIT は、これらの再コンパイルされたバイナリをメモリから保存して再利用します。これにより、解釈時間が短縮され、ネイティブ コードの実行による利点が得られます。
一方、普通の古い Java インタープリターは、クラス ファイルから一度に 1 つの JVM 命令を解釈し、それに対してプロシージャを呼び出します。
ここで詳細な比較を見つけてくださいhttp://bitshub.blogspot.com/2010/01/Flavors-of-JVM.html
Microsoft.NET言語をコンパイルすると、コンパイラーはMicrosoft中間言語(MSIL)で記述されたコードを生成します。MSILは、ネイティブコードにすばやく変換できる一連の命令です。
Microsoft.NETアプリケーションは、MSILコードがネイティブマシンコードに変換された後にのみ実行できます。.NET Frameworkでは、中間言語は、開発時にアプリケーションをコンパイルするのではなく、アプリケーションまたはコンポーネントの実行時に「ジャストインタイム」(JIT)でネイティブコードにコンパイルされます。