【じっとこんぱいら】

JITコンパイラ とは?

💡 実行しながら「その場で」最適化コンパイル
📌 このページのポイント
JITコンパイラ vs インタプリタ インタプリタ方式 1行目 実行 2行目 実行 3行目 実行 毎回 変換 JITコンパイラ方式 ホット コード検出 頻繁に実行 ネイティブ コードに変換 キャッシュして再利用 実行速度の比較 インタプリタ: 遅い JIT: 高速(繰り返し処理に強い) Java, C#, JavaScript(V8)などがJITコンパイラを採用
JITコンパイラのイメージ
ひよこ ひよこ

インタプリタコンパイラの中間ってこと?

ペンギン先生 ペンギン先生

そう。インタプリタは1行ずつ解釈して遅い。事前コンパイラ(AOT)は実行前に全部変換するけど、実行時の情報を使った最適化ができない。JITは実行中にプロファイリングして「この関数は1000回呼ばれている」とわかったらネイティブコードに変換。実行時の動的な情報で最適化できるのが強みだよ

ひよこ ひよこ

JavaScriptのV8エンジンもJIT?

ペンギン先生 ペンギン先生

V8は多段JITを採用している。最初はIgnitionインタプリタで素早く実行開始し、頻繁に実行されるコードをSparkplugで軽くコンパイル、さらにホットなコードをMaglev→TurboFanで段階的に最適化。最初から全部コンパイルすると起動が遅くなるから、必要な部分だけ段階的に最適化する戦略なんだよ

ひよこ ひよこ

JITのデメリットは?

ペンギン先生 ペンギン先生

①ウォームアップ時間(コンパイルが完了するまで遅い)、②メモリ消費(コンパイル結果をメモリに保持)、③予測不能なパフォーマンス(GCとJITコンパイルのタイミングで遅延スパイク)。サーバーレス環境ではコールドスタートの遅さが問題になるから、GraalVM Native ImageのようなAOTコンパイルが注目されているよ

ひよこ ひよこ

AOTコンパイルとの使い分けは?

ペンギン先生 ペンギン先生

長時間動くサーバーアプリはJITが有利(ウォームアップ後に最高速)。短時間で終わるCLIツールやサーバーレスはAOTが有利(即座に最高速)。Java界隈ではGraalVM Native Imageで起動時間をミリ秒に短縮する動きがある。「ピーク性能のJIT vs 起動速度のAOT」という選択になるんだよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「JITコンパイラ」って出てきたら「実行時にコードを最適化して高速化する仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Just-In-Time Compiler」 = 実行時コンパイラ
💬 Just-In-Time(必要なときに即座に)。製造業のJIT生産方式と同じ発想だよ
← 用語集にもどる