【じっとこんぱいら】

JITコンパイラ とは?

最終更新:
💡 実行しながら、必要なコードをその場でコンパイル

プログラムの実行時に、バイトコードなどをCPUが実行する機械語へ変換するコンパイラ。必要になった部分の変換や、実行中の情報を使った最適化を行う方式がある。

📌 このページのポイント
実行時に機械語へコンパイル .NETのメソッド呼出しを簡略化した例 中間コード JIT コンパイル 機械語 CPUで実行 変換結果を保持 後の呼出し 再利用 変換の時間・メモリも含めて性能を評価
JITの方式は実行環境によって異なります。V8などはインタプリタや複数のコンパイラを組み合わせ、最適化やその取消しも行います。
ひよこ ひよこ
インタプリタとコンパイラの中間ってこと?
ペンギン先生 ペンギン先生
JITもコンパイラの一種だよ。AOTが実行前に変換するのに対し、JITは実行時に変換するんだ。インタプリタでバイトコードを実行しながら、よく使う部分をJITで機械語にするなど、両方を組み合わせる実行環境もあるよ。
ひよこ ひよこ
JavaScriptのV8エンジンもJIT?
ペンギン先生 ペンギン先生
そうだよ。V8はIgnitionというインタプリタに加え、SparkplugやMaglevなどのコンパイラを使う。素早いコンパイルと、時間をかけた最適化を使い分けるんだ。すべてのコードが同じ段階を必ず通るわけではないよ。
ひよこ ひよこ
実行してから最適化する利点は?
ペンギン先生 ペンギン先生
たとえば、よく実行する関数や実際に渡された値の型を手がかりにできるよ。ただし、想定した型などが変わったら、最適化を取り消して別の実行方式へ戻す場合もあるんだ。
ひよこ ひよこ
JITのデメリットは?
ペンギン先生 ペンギン先生
実行中のコンパイルや情報収集に時間がかかり、生成したコードを置くメモリも必要になることだよ。最適化が進むまでのウォームアップや、再コンパイルの影響もある。どの程度効くかは処理によるね。
ひよこ ひよこ
AOTコンパイルとの使い分けは?
ペンギン先生 ペンギン先生
起動時間、継続実行の速さ、メモリ使用量などを測って選ぼう。AOTでも、事前の試運転で集めた情報を使うPGOという最適化があるんだ。「JITは常に最高速、AOTは起動直後から最高速」とは決められないよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「JITコンパイラ」って出てきたら「実行時に必要なコードを機械語へ変換する仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Just-In-Time Compiler」 = 実行時コンパイラ
💬 Just-In-Timeは「必要なときに」という意味。プログラムの実行時にコンパイルすることを表しているよ。

参考資料

← 用語集にもどる