【じっとこんぱいる】

JITコンパイル とは?

最終更新:
💡 実行中にコードを機械語へ変換する、その場のコンパイル

プログラムの実行中にコードをコンパイルし、機械語などへ変換する仕組み。実行時の情報を使った最適化もできるが、すべてのJITが高度な最適化を行うわけではない。

📌 このページのポイント
実行中に機械語を作るJITの例バイトコード解釈実行・情報収集頻度などを参考にJITコンパイル機械語生成後は機械語を実行複数段階の変換・最適化を行う実装もある
バイトコードを解釈して実行し、実行時の情報を参考にJITコンパイルする一例。JITのすべてがホットスポットの高度な最適化を行うわけではありません。
ひよこ ひよこ
JITコンパイルは普通のコンパイルと何が違う?
ペンギン先生 ペンギン先生
違いの中心はタイミングだよ。AOTは実行前、JITは実行中にコードをコンパイルする。例えばバイトコードを機械語へ変換し、以後はそのコードを実行する仕組みがあるんだ
ひよこ ひよこ
最初は遅くても、あとで必ず速くなる?
ペンギン先生 ペンギン先生
必ずではないよ。よく実行される部分を見つけて最適化することで、速くなる場合はある。でも、コンパイルにも時間がかかるし、生成したコードの保存にはメモリを使う。短時間で終わる処理では、その負担が効果を上回ることもあるんだ
ひよこ ひよこ
JITは全部、すごく最適化するの?
ペンギン先生 ペンギン先生
そうとは限らないよ。V8のSparkplugは、バイトコードから機械語へ素早く変換する、最適化を目的としないコンパイラとして説明されている。HotSpotなどには複数の段階でコンパイルする仕組みもある。どの段階で何をするかは実装によるんだ
ひよこ ひよこ
実行した情報を使えるのはJITだけ?
ペンギン先生 ペンギン先生
JITは、その実行中に集めた情報を使って最適化できるのが強みだよ。ただしAOTでも、試しに実行して集めた情報を次の事前コンパイルに使う、プロファイルに基づく最適化がある。GCCのように、測定用の実行と再コンパイルを組み合わせる方法もあるんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「JITコンパイル」って出てきたら「実行しながらコードをその場でネイティブ化する仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Just-In-Time Compilation」 = 必要な時点でのコンパイル
💬 Just-In-Timeは、ちょうど必要な時に、という意味だよ。実行中にコードをコンパイルすることを表しているんだ

参考資料

← 用語集にもどる