web-dev-qa-db-ja.com

Just-in-Timeコンパイラとインタープリタの違いは何ですか?

ジャストインタイムコンパイラとインタープリタの違いは何ですか。また、.NETとJava JITコンパイラの違いはありますか?

36
Rookian

ジャストインタイムコンパイル は、バイトコードなどの非ネイティブコードが、実行される直前にネイティブコードに変換されます。

ウィキペディアから:

JITは、ランタイム環境における以前の2つのアイデア、バイトコードコンパイルと動的コンパイルに基づいています。実行時にコードをネイティブに実行する前に変換します。たとえば、バイトコードをネイティブマシンコードに変換します。

インタプリタ はプログラムを実行します。ジッタがある場合とない場合があります。

もう一度、ウィキペディアから:

インタープリターは、

  1. ソースコードを直接実行します
  2. ソースコードをいくつかの効率的な中間表現(コード)に変換し、すぐにこれを実行します
  3. インタープリターシステムの一部であるコンパイラーによって作成された、保存済みのプリコンパイル済みコードを明示的に実行します

標準のJavaおよび.NETディストリビューションにはJITコンパイルがありますが、標準では必須ではありません。NETとC#のJITコンパイラは、中間バイトコードが異なるため、当然異なります。原則は同じです。

35
Mark Byers

私はいつも、より抽象的な説明が時々役立つことを発見しました。メキシコの全員に「こんにちは。お元気ですか?」と尋ねようとしているとしましょう。 (yoursource language)もちろん、最初にそれをスペイン語に翻訳する必要があります(母国語の国)。その翻訳は "Hola。Como estas?"になります。

スペイン語を知っている場合は、(ネイティブコード/アセンブラー)を翻訳する必要はありません。 「Hola。Como estas?」

スペイン語がわからない場合は、3つの方法で対処できます。

1つ目は、スペイン語辞書(compiler)を取得して、スペイン語の単語が何であるかを調べることです。 「ホラ。ケタル?」 1音節短い(コンパイラ最適化)。代わりにそれを使用してください。これは言語コンパイル;事前に情報を母国語に変換しています。

2番目は、最初の人の前に立っている間にスペイン語辞書で単語を検索し、結果を保存する場所です(単語を検索しますジャストインタイム)。ここでの利点は、中国語の辞書を取得して、10枚の付箋(異なるプラットフォーム用のバイナリ)を保持する必要なしに、中国で同じ実験を行うことができることです。翻訳されたフレーズの。

3つ目は、各人の前に立っているときに単語を調べる場所です。本質的に、あなたは各人の言葉を別々に解釈します(あなたは通訳として振る舞います)。ここでの利点は、変更がすぐに次の人に反映されることです(家に帰って再起動する必要なく、「こんにちは。犬の色は何ですか?」と尋ねるように変更できます。必要はありませんrecompileフレーズ)。

  • 事前に翻訳するということは、人々に最も早く尋ねることができることを意味します(pre-compiliation);辞書を持ってくる必要もありません。
  • 各国の最初の人に会ったときに翻訳するのは、事前に翻訳するのとほぼ同じくらい高速ですが、辞書を得るために家に帰る必要なく複数の国に旅行できますが、いくつかの辞書を持ってくる必要があります(プラットフォームに依存しないランタイム)。
  • オンデマンドでの翻訳ははるかに低速ですが、家に帰ることなく単語を変更できます(ソース分散言語)。
38

インタープリターは、以前に実行されたかどうかに関係なく、各命令に対して即座にマシンコード命令を生成して実行します。
JITは、以前にマシンコードに解釈された命令をキャッシュし、それらのネイティブマシンコード命令を再利用するため、すでに解釈されたステートメントを再解釈する必要がないため、時間とリソースを節約できます。

17
crowne

実行エンジンがコンパイラなのかインタープリタなのかという問題は、ルーチンが1,000回実行されるとどうなるかを考えることで、非常に簡単に答えることができます。実行エンジン内のコードがコードの特定の表現を1,000回調べる必要がある場合、実行エンジンはその表現のインタープリターです。実行内のコードがコードの特定の表現を数回(通常は1回とは限りませんが)調べるだけでよい場合、それはその表現のコンパイラまたはトランスレータです。実行エンジンが入力コードを受け取り、より簡単に検査できる他の形式に変換することは非常に一般的であることに注意してください。このような実行エンジンは、前者のコンパイラまたはトランスレータを後者のインタプリタと組み合わせます。

インタープリターがマシンコードの形式を生成することはほとんどありません。インタプリタがマシンコードを生成するのは、ステートメントが他の方法では実行できない操作を実行することになっているときだけです。たとえば、8080で実行されているBASICインタープリターが「OUT 100,5」という命令に遭遇した場合、通常、D3 64 C9(OUT 64h/RET)をある固定アドレスの3つの連続したバイトに格納し、Aを5、そのアドレスを呼び出します。インタープリターは技術的にはマシンコードを生成している可能性がありますが、同じOUT命令を500回実行する場合、インタープリターは毎回マシンコードを再生成する必要があります。

6
supercat

tl; dr

インタプリタ:一度に1つの命令だけを実行します。

ジャストインタイム:コードのブロックを一度に受け取り、実行前にコンパイルします。最適化の余地は十分にあります

5
del bao

JITコンパイラは、ブロックソースコードを変換するバイナリマシンコードを生成します。通訳は行ごとに翻訳します。

2
erasmus

クラスが初めて参照されるとき、JIT実行エンジンは、Java JVM命令セットを含むコンパイラ)によって生成された.classファイル(プライマリバイナリ)を、ホストシステムの命令セットを含むバイナリに再コンパイルします。JITストアさらに、メモリから再コンパイルされたバイナリを再利用します。これにより、ネイティブコードの実行による解釈時間と利点が削減されます。

一方、単純な古いJava=インタプリタは、クラスファイルから一度に1つのJVM命令を解釈し、それに対してプロシージャを呼び出します。

詳細な比較はこちら http://bitshub.blogspot.com/2010/01/Flavors-of-JVM.html

1
bitan

Microsoft.NET言語をコンパイルすると、コンパイラはMicrosoft Intermediate Language(MSIL)で記述されたコードを生成します。 MSILは、ネイティブコードにすばやく変換できる一連の命令です。

Microsoft.NETアプリケーションは、MSILコードがネイティブマシンコードに変換された後にのみ実行できます。 .NET Frameworkでは、開発時にアプリケーションをコンパイルするのではなく、アプリケーションまたはコンポーネントを実行すると、中間言語が "ジャストインタイム"(JIT)でネイティブコードにコンパイルされます。

詳細

0
Kimi