非JITコンパイラとは対照的に、JITコンパイラは具体的に何をしますか? どなたか簡潔でわかりやすい説明をいただけないでしょうか。
18 に答える
JIT コンパイラは、プログラムの開始後に実行され、コード (通常はバイトコードまたはある種の VM 命令) をオンザフライで (またはジャストインタイムと呼ばれる)、通常より高速な形式 (通常はホスト CPU のネイティブ) にコンパイルします。指図書。JIT は動的な実行時情報にアクセスできますが、標準コンパイラはそうではなく、頻繁に使用される関数のインライン化などの最適化を行うことができます。
これは、プログラムを最初に実行する前にすべてのコードを機械語にコンパイルする従来のコンパイラとは対照的です。
言い換えると、従来のコンパイラは、最初にプログラムを実行する前に、プログラム全体を EXE ファイルとしてビルドします。新しいスタイルのプログラムの場合、アセンブリは疑似コード (p-code) で生成されます。OS 上でプログラムを実行した後でのみ (たとえば、アイコンをダブルクリックして)、(JIT) コンパイラが起動し、Intel ベースのプロセッサまたはその他のプロセッサが理解できるマシン コード (m-code) を生成します。
当初、コンパイラーは高水準言語 (アセンブラーよりも高いレベルとして定義されている) をオブジェクト コード (機械語命令) に変換する役割を担っていました。このオブジェクト コードは (リンカーによって) 実行可能ファイルにリンクされます。
言語の進化のある時点で、コンパイラは高水準言語を疑似コードにコンパイルし、それを (インタプリタによって) 解釈してプログラムを実行しました。これにより、オブジェクト コードと実行可能ファイルが排除され、これらの言語を複数のオペレーティング システムとハードウェア プラットフォームに移植できるようになりました。Pascal (P-Code にコンパイル) は最初の 1 つです。Java と C# は最近の例です。ほとんどの擬似操作はバイト長であるため、最終的に P コードという用語はバイトコードに置き換えられました。
Just-In-Time (JIT) コンパイラはランタイム インタープリターの機能であり、メソッドが呼び出されるたびにバイトコードを解釈する代わりに、実行中のマシンのマシン コード命令にバイトコードをコンパイルしてから、これを呼び出します。代わりにオブジェクトコード。理想的には、オブジェクト コードを効率的に実行することで、プログラムを実行するたびにプログラムを再コンパイルする非効率性を克服できます。
JIT - ジャスト イン タイムで、必要なときに単語自体が言う (オンデマンド)
典型的なシナリオ:
ソースコードは完全に機械語に変換されます
JIT シナリオ:
ソースコードは、構造体のようなアセンブリ言語に変換されます [例: C# の場合は IL (中間言語)、java の場合は ByteCode]。
中間コードを機械語に変換するのは、アプリケーションが必要とするコードのみを機械語に変換する必要がある場合のみです。
JIT と非 JIT の比較:
JIT では、すべてのコードがマシン コードに変換されるわけではありません。最初に必要なコードの一部がマシン コードに変換されます。次に、呼び出されたメソッドまたは機能がマシンにない場合、それがマシン コードに変換されます。 CPUの負担。
実行時にマシン コードが生成されるため、JIT コンパイラはマシンの CPU アーキテクチャを実行するために最適化されたマシン コードを生成します。
JIT の例:
- Java JIT は JVM (Java Virtual Machine) にあります。
- C# では CLR (共通言語ランタイム) にあります。
- Android では、DVM (Dalvik Virtual Machine)、または新しいバージョンの ART (Android RunTime) にあります。
他の人が述べたように
JIT は Just-in-Time の略で、実行前ではなく、必要なときにコードがコンパイルされることを意味します。
上記の説明にポイントを追加するだけで、JVM は関数が実行された回数のカウントを維持します。このカウントが事前定義された制限を超えた場合、JIT はコードをプロセッサによって直接実行できる機械語にコンパイルします (javac がコードをバイトコードにコンパイルしてから java にコンパイルする通常の場合とは異なり、インタープリターはこのバイトコードを 1 行ずつ解釈し、マシンコードと実行)。
また、次回この関数が計算されるとき、コードが行ごとに再度解釈される通常の解釈とは異なり、同じコンパイル済みコードが再度実行されます。これにより、実行が高速になります。
JIT コンパイラは、最初の実行時にバイトコードを同等のネイティブ コードにコンパイルするだけです。連続して実行するたびに、JVM は単にコンパイル済みのネイティブ コードを使用してパフォーマンスを最適化します。
JIT コンパイラーがない場合、JVM インタープリターはバイトコードを 1 行ずつ変換して、ネイティブ アプリケーションが実行されているかのように表示します。
JITはJust-in-Timeの略で、実行前ではなく、必要なときにコードがコンパイルされることを意味します。
コンパイラは特定のマシンに最適化されたコードを生成できるため、これは有益です。平均的なCコンパイラのような静的コンパイラは、すべてのコードを開発者のマシン上の実行可能コードにコンパイルします。したがって、コンパイラーはいくつかの仮定に基づいて最適化を実行します。ユーザーのプログラムの実行を遅くしないため、コンパイルが遅くなり、最適化を行うことができます。
バイト コード (アーキテクチャに依存しない) が Java コンパイラによって生成された後、実行は JVM (Java 内) によって処理されます。ローダーによってバイト コードが JVM にロードされ、各バイト命令が解釈されます。
メソッドを複数回呼び出す必要がある場合、同じコードを何度も解釈する必要があり、必要以上に時間がかかる場合があります。そのため、JIT (ジャストインタイム) コンパイラがあります。バイトが JVM にロードされると (実行時)、コード全体が解釈されるのではなくコンパイルされるため、時間を節約できます。
JIT コンパイラは実行時にのみ機能するため、バイナリ出力はありません。
ジャスト イン タイム コンパイラ (JIT) :
Java バイトコードをその特定の CPU のマシン命令にコンパイルします。
たとえば、Java コードにループ ステートメントがあるとします。
while(i<10){
// ...
a=a+i;
// ...
}
i の値が 0 の場合、上記のループ コードは 10 回実行されます。
同じ命令が 10 回実行されるため、バイトコードを何度も 10 回コンパイルする必要はありません。その場合、そのコードを一度だけコンパイルする必要があり、必要な回数だけ値を変更できます。そのため、ジャスト イン タイム (JIT) コンパイラは、(前述のように) そのようなステートメントとメソッドを追跡し、パフォーマンスを向上させるために、そのようなバイト コードの断片をマシン コードにコンパイルします。
別の同様の例は、文字列/文のリストで「正規表現」を使用してパターンを検索することです。
JIT コンパイラは、すべてのコードをマシン コードにコンパイルするわけではありません。実行時に同様のパターンを持つコードをコンパイルします。
詳細については、 JITについてのこのOracle ドキュメントを参照してください。
IL (中間言語) にコンパイルされたコードがあります。プログラムを実行すると、コンピューターはこのコードを理解できません。ネイティブ コードのみを理解します。そのため、JIT コンパイラはその場で IL をネイティブ コードにコンパイルします。これはメソッド レベルで行われます。
Jit は Just In Time Compiler の略で、Java バイト コードをプロセッサに直接送信できる命令に変換するプログラムです。
特定のシステム プラットフォームで Java ジャスト イン タイム コンパイラ (実際には 2 番目のコンパイラ) を使用すると、バイトコードが特定のシステム コードにコンパイルされます。コードが jit コンパイラによって再コンパイルされると、通常はコンピュータでより高速に実行されます。
Just-In-Time コンパイラは仮想マシンに付属しており、オプションで使用されます。バイトコードをプラットフォーム固有の実行可能コードにコンパイルし、すぐに実行します。
非JITコンパイラは、ソースコードを受け取り、コンパイル時にそれをマシン固有のバイトコードに変換します。JITコンパイラは、コンパイル時に生成されたマシンに依存しないバイトコードを取得し、実行時にマシン固有のバイトコードに変換します。Javaが使用するJITコンパイラは、単一のバイナリを変更せずに多数のプラットフォームで実行できるようにするものです。
バイトコードの 20% が 80% の時間で使用されます。JIT コンパイラはこれらの統計を取得し、インライン メソッドの追加、未使用のロックの削除などを行い、そのマシンに固有のバイトコードを作成することで、バイト コードのこの 20% を最適化して高速に実行します。この記事から引用していますが、便利であることがわかりました。http://java.dzone.com/articles/just-time-compiler-jit-hotspot
JIT は、いくつかの JVM 実装で実行エンジンを指します。より高速ですが、より多くのメモリを必要とするものは、ジャストインタイム コンパイラです。このスキームでは、メソッドのバイトコードは、メソッドが初めて呼び出されたときにネイティブ マシン コードにコンパイルされます。次に、メソッドのネイティブ マシン コードがキャッシュされるため、次に同じメソッドが呼び出されたときに再利用できます。