インタプリタとコンパイラの中間ってこと?
そう。インタプリタは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」という選択になるんだよ