ジャストインタイムコンパイルの説明

ジャストインタイムコンパイルは、インタープリター型プログラムのパフォーマンスを向上させる方法です。実行中に、プログラムをネイティブコードにコンパイルして、パフォーマンスを向上させることができます。動的コンパイルとも呼ばれます。

動的コンパイルには、静的コンパイルに比べていくつかの利点があります。JavaまたはC#アプリケーションを実行している場合、ランタイム環境は実行中にアプリケーションのプロファイルを作成できます。これにより、より最適化されたコードを生成できます。アプリケーションの実行中にアプリケーションの動作が変更された場合、ランタイム環境でコードを再コンパイルできます。

いくつかの欠点には、起動の遅延や実行時のコンパイルのオーバーヘッドが含まれます。オーバーヘッドを制限するために、多くのJITコンパイラは、頻繁に使用されるコードパスのみをコンパイルします。

概要概要

従来、ソースコードをプラットフォームで実行できる形式に変換するには2つの方法があります。静的コンパイルは、コードを特定のプラットフォーム用の言語に変換します。インタプリタはソースコードを直接実行します。

JITコンパイルは、両方の利点を利用しようとします。インタープリター型プログラムの実行中に、JITコンパイラーは最も頻繁に使用されるコードを判別し、それをマシンコードにコンパイルします。コンパイラーによっては、これはメソッドまたはコードのより小さなセクションで実行できます。

動的コンパイルは、1960年にLISPに関するJ.McCarthyの論文で最初に説明されました。

ジャストインタイムコンパイル、JIT、または動的変換は、プログラムの実行中に実行されるコンパイルです。実行前ではなく、実行時の意味。何が起こるかは、マシンコードへの変換です。JITの利点は、コンパイルが実行時に行われるため、JITコンパイラーが動的なランタイム情報にアクセスして、より適切な最適化(インライン関数など)を実行できることです。

JITコンパイルについて理解することが重要なのは、バイトコードを実行中のマシンのマシンコード命令にコンパイルすることです。つまり、結果のマシンコードは、実行中のマシンのCPUアーキテクチャ用に最適化されます。

JITコンパイラの例としては、JavaのJVM(Java仮想マシン)やC#のCLR(共通言語ランタイム)があります。

歴史

当初、コンパイラーは、高水準言語(アセンブラーよりも高レベルとして定義)をオブジェクトコード(マシン命令)に変換し、それを(リンカーによって)実行可能ファイルにリンクする責任がありました。

言語の進化のある時点で、コンパイラーは高水準言語を疑似コードにコンパイルし、それを(インタープリターによって)解釈してプログラムを実行します。これにより、オブジェクトコードと実行可能ファイルが排除され、これらの言語を複数のオペレーティングシステムとハードウェアプラットフォームに移植できるようになりました。Pascal(P-Codeにコンパイルされた)は最初のものの1つでした。JavaとC#は最近の例です。ほとんどの疑似操作は1バイト長であるため、最終的にPコードという用語はバイトコードに置き換えられました。

ジャストインタイム(JIT)コンパイラは、ランタイムインタプリタの機能であり、メソッドが呼び出されるたびにバイトコードを解釈する代わりに、実行中のマシンのマシンコード命令にバイトコードをコンパイルしてから、これを呼び出します。代わりにオブジェクトコード。理想的には、オブジェクトコードの実行の効率は、実行するたびにプログラムを再コンパイルする非効率を克服します。

典型的なシナリオ

ソースコードは完全にマシンコードに変換されます

JITシナリオ

ソースコードは、構造のようなアセンブリ言語に変換されます[C#の場合はIL(中間言語)、Javaの場合はByteCode]。

中間コードは、アプリケーションが必要とする場合にのみ機械語に変換されます。必要なコードは機械語にのみ変換されます。

JITと非JITの比較

JITでは、すべてのコードが最初にマシンコードに変換されるわけではなく、必要なコードの一部がマシンコードに変換されます。次に、呼び出されたメソッドまたは機能がマシンにない場合、それがマシンコードに変換され、負担が軽減されます。 CPU。マシンコードは実行時に生成されるため、JITコンパイラはマシンのCPUアーキテクチャを実行するために最適化されたマシンコードを生成します。

JITの例は次のとおりです。

  • Java:JVM(Java仮想マシン)
  • C#:CLR(共通言語ランタイム)
  • Android:新しいバージョンのDVM(Dalvik Virtual Machine)またはART(Android RunTime)

Java仮想マシン(JVM)はバイトコードを実行し、関数が実行された回数のカウントを維持します。このカウントが事前定義された制限を超えると、JITはコードをプロセッサが直接実行できる機械語にコンパイルします(javacがコードをバイトコードにコンパイルしてからJavaにコンパイルする通常の場合とは異なり、インタプリタはこのバイトコードを1行ずつ解釈して次のように変換します。マシンコードと実行)。

また、次にこの関数が計算されるとき、コードが1行ずつ再度解釈される通常の解釈とは異なり、同じコンパイル済みコードが再度実行されます。これにより、実行が高速化されます。