実行時
コンパイラ(Just-In-Time
コンパイラ、JIT
コンパイラ)とは、プログラムの実行中に
ソースコードをコンパイルする
コンパイラのことです。通常の
コンパイラは、プログラム実行前に
ソースコードを
機械語に変換しますが、JIT
コンパイラは、プログラム実行中に必要な部分だけをコンパイルします。この方式は、プログラムの実行速度を向上させるとともに、特定の実行環境に最適化されたコードを生成できるという利点があります。
JIT
コンパイラは、プログラムのモジュール、クラス、関数などが実際に実行されるタイミングで、そのコードを
機械語にコンパイルします。「Just In Time(まさにその時)」という名前は、この特徴に由来します。
JITコンパイルは、動的コンパイルの一種です。動的コンパイルは、実行時に
機械語を生成するより広い概念であり、JITコンパイルはその一形態となります。
JIT
コンパイラの主な利点は、以下の通りです。
1.
プラットフォーム非依存性:
ソースコードや中間コードで
ソフトウェアを配布できるため、
オペレーティングシステムや
CPUに依存しません。
2.
実行速度の向上:
インタプリタ方式のように毎回コードを解釈するのではなく、コンパイルされた
機械語を実行するため、実行速度が向上します。
3.
実行環境に応じた最適化: JIT
コンパイラは、実行時の
CPUやメモリの情報を利用して、最適なコードを生成できます。例えば、
CPUが特定の命令セット(
MMXなど)をサポートしている場合、その命令を使ったコードを生成できます。また、キャッシュやメモリのサイズなどの情報も利用して、最適なコードを生成できます。
4.
仮想メソッド呼び出しの最適化: オブジェクト指向言語では、仮想メソッドの呼び出しは間接的になりますが、JIT
コンパイラは、オーバーライドがない場合、直接呼び出しやインライン展開を行うことができます。
JIT
コンパイラには、以下のような欠点も存在します。
1.
コンパイル時間のオーバーヘッド: 事前コンパイルと比較して、JITコンパイルはプログラムの実行時間に追加のオーバーヘッドをもたらします。
2.
高度な最適化の制限: 事前コンパイルで可能な高度で時間のかかる最適化を、JIT
コンパイラでは実行できません。
適応的コンパイル
適応的コンパイルは、JIT
コンパイラの欠点を補うための手法です。この方式では、プログラムの起動時には
インタプリタとして実行し、繰り返し実行されるコードを検出(プロファイリング)します。その後、検出された頻繁に使用されるコードのみをコンパイルします。この遅延コンパイルによって、起動時のオーバーヘッドを抑えつつ、実行速度を向上させることができます。
プログラム実行時間の大半は、ごく一部のコードに費やされるという経験則(80-20の法則)に基づき、適応的コンパイルでは、そのようなコードのみをコンパイルすることで、効率的にパフォーマンスを向上させることができます。
適応的最適化は、静的コンパイルでは得られない情報を基に最適化を行うため、場合によっては静的コンパイルよりも優れたパフォーマンスを発揮することがあります。ただし、バッチ処理のような短時間で終了するジョブでは、JITコンパイルのオーバーヘッドが問題になることがあります。
JIT
コンパイラは、Javaや
JavaScriptなどのさまざまな環境で広く利用されています。
Javaの普及に伴い、JIT
コンパイラは広く使われるようになりました。Javaの
HotSpot技術は、Self言語の動的コンパイル技術研究に基づいており、初期の商用SmalltalkでもJITコンパイル技術が確立されていました。
HotSpotコンパイラ以降、JIT
コンパイラ部分のインターフェースが規定され、JITコンパイルエンジン部分を差し替えることが可能になりました。
近年の主要なウェブブラウザは、
JavaScriptのエンジンにJIT
コンパイラを搭載しており、
JavaScriptの高速処理を実現しています。
JIT
コンパイラによって、実行時に変数に代入された値の統計データから変数の型を割り振ることで、
JavaScriptの処理速度を大幅に向上させることが可能になりました。
まとめ
JIT
コンパイラは、プログラムの実行中にコードをコンパイルすることで、実行速度の向上や実行環境に応じた最適化を可能にする技術です。適応的コンパイルなどの技術と組み合わせることで、さらに効果的なパフォーマンスの向上が期待できます。一方で、
コンパイル時間のオーバーヘッドや最適化の制限といった課題も存在するため、適切な状況でJIT
コンパイラを利用することが重要です。