プログラミング基礎概念

JITコンパイル じっとこんぱいる

コンパイラインタプリタバイトコード実行時最適化JVMV8エンジン
JITコンパイルって何?

簡単に言うとこんな感じ!

プログラムを「実行しながらその場で高速化する」仕組みだよ!料理で例えると、レシピ全部を事前に翻訳しておく(事前コンパイル)でも、一行ずつ読み上げながら作る(インタプリタ)でもなく、「よく作るこの工程だけ超効率化しよう!」って実行中に気づいて自動でスピードアップするイメージなんだ!


JITコンパイルとは

JITコンパイル(Just-In-Time Compilation)とは、プログラムの実行中にリアルタイムでソースコードや中間コードをネイティブコード(CPUが直接実行できる命令)に変換する技術です。「必要なときに(Just-In-Time)」変換するという名前の通り、事前にすべてを変換するのではなく、実際に実行が必要になったタイミングでコンパイルを行います。

従来のプログラム実行方式には大きく2種類ありました。事前コンパイル(AOT: Ahead-Of-Time) はプログラムを配布前に完全にネイティブコードへ変換する方式で、実行速度は速いものの「どのマシンで動かすか」を事前に決める必要がありました。一方、インタプリタ方式はコードを一行ずつ読み解きながら実行するため移植性は高いのですが、実行速度が遅くなりがちでした。JITコンパイルはこの両方の長所を組み合わせ、「移植性も速度も両立する」ことを目指した方式です。

現代のWebブラウザ(JavaScriptエンジン)やJava仮想マシン(JVM)、Pythonの一部処理系などで広く採用されており、私たちが日常的に使うアプリやWebサービスの裏側でJITが動いて高速化を実現しています


JITコンパイルの仕組み

JITコンパイルの処理は大まかに以下の流れで進みます。

ステップ処理内容たとえ
① ソースコード読み込み人間が書いたコードを受け取るレシピを手に取る
② 中間コード生成特定のCPUに依存しない「バイトコード」に変換言語に依存しないメモに書き直す
③ インタプリタ実行バイトコードを逐次解釈して実行(最初はゆっくり)メモを一行ずつ見ながら作業
④ ホットスポット検出「よく使われるコード」を分析・特定「この作業、毎回やってるな」と気づく
⑤ JITコンパイルホットスポットをネイティブコードに変換よく使う手順を体で覚えて自動化
⑥ 最適化実行以降はネイティブコードで高速実行考えなくても素早くできる状態

ホットスポットとは

JITの核心は「ホットスポット(Hot Spot)」の検出です。すべてのコードをコンパイルするのはコストが高いため、JITエンジンは実行回数の多いコード(ループ処理・頻繁に呼ばれる関数)を統計的に検出し、そこだけを集中的にコンパイル・最適化します。

実行頻度のイメージ

コード全体 ████████████████████████████
         ↑ ここだけよく実行される(ホットスポット)
              ↓ JITがここだけネイティブコードに変換

コールド(低頻度): インタプリタで処理(そのまま)
ホット(高頻度):   JITコンパイルで高速化

3種類のJIT戦略

戦略内容特徴
Tracing JIT実際の実行パスをトレースして最適化ループに強い。Firefox旧エンジンが採用
Method JITメソッド(関数)単位でコンパイル汎用的。JVMが代表例
Tiered JIT実行頻度に応じて段階的に最適化レベルを上げる現代の主流。V8・JVM(Java 8以降)

歴史と背景

  • 1960年代 — JITの概念の原型は、John McCarthyらによるLISP処理系の実装に見られる。「実行時コード生成」の思想はこの頃から存在した
  • 1995年Javaが登場。「Write Once, Run Anywhere(一度書けばどこでも動く)」を実現するためにJVM(Java仮想マシン)とバイトコードの仕組みを採用。当初はインタプリタ方式で低速だった
  • 1996年〜 — Sun MicrosystemsがJVMにJITコンパイラを統合。Javaの実行速度が大幅に改善される
  • 1999年 — Sun Microsystemsが「HotSpot JVM」を発表。ホットスポット検出+段階的最適化の現代的アプローチを確立
  • 2008年 — GoogleがV8エンジンをChromeに搭載。JavaScriptへのJIT適用を本格化させ、Web上でのリッチなアプリを可能にした
  • 2009年〜Node.jsがV8を採用し、サーバーサイドJavaScriptが実用的になる
  • 2010年代〜 — Python(PyPy)、Ruby(JRuby)、.NET(CLR)など多くの処理系がJITを採用。LLVMなどのコンパイラ基盤の整備により実装が容易になる
  • 2020年代WebAssemblyへのJIT適用、Apple Silicon向け最適化など新たな展開が続く

事前コンパイル・インタプリタとの比較

JITコンパイルは従来の2方式の中間に位置します。

3つの実行方式の比較 事前コンパイル(AOT) インタプリタ JITコンパイル 変換タイミング 起動速度 実行速度 移植性 代表例 実行前(配布時) ★★★ 速い ★★★ 最速 ★ 低い(環境依存) C, C++, Rust, Go 実行時・逐次 ★★★ 速い ★ 遅い ★★★ 高い Python, Ruby(標準) 実行時・選択的 ★★ やや遅い ★★★ 速い(ウォームup後) ★★ 高い Java, JS(V8), .NET ※JITの「起動が遅い」はウォームアップ時間(最初の数秒)を指す。その後は高速

JITの弱点:ウォームアップ時間

JITコンパイルには「ウォームアップ(Warm-up)」と呼ばれる特性があります。起動直後はまだホットスポットが検出されていないためインタプリタとして動作し、やや低速です。実行を続けるうちにJITが最適化を完了し、本来の速度を発揮します。

時間軸でみたJITの速度変化

実行開始  ウォームアップ期間      安定期(高速)
   |──────[インタプリタ]────|──[JITコンパイル済み]────→
   ↑                        ↑
  起動直後は普通の速さ     ここからどんどん速くなる

このため、JITは「短命なスクリプト」より「長時間動き続けるサーバーアプリケーション」と相性が良い特性があります。


関連する規格・RFC

※ JITコンパイルそのものを直接規定するIETF RFC・ISO規格は存在しませんが、JITが採用されている主要な仕様は以下の通りです。

規格・仕様内容
ECMA-262ECMAScript(JavaScript)仕様。V8などのJITエンジンが準拠するJS言語標準
Java SE仕様(JVM仕様)JVMのバイトコード・実行モデルを定義。HotSpot JITが準拠
ECMA-335.NETのCLI(共通言語基盤)仕様。.NET JITコンパイラが準拠

関連用語

  • コンパイラ — ソースコードを機械語に変換するプログラム。JITはその「実行時版」
  • インタプリタ — コードを一行ずつ解釈・実行する方式。JITのウォームアップ前の動作に相当
  • バイトコード — JITが入力として受け取る中間表現コード。CPUに依存しない
  • JVM(Java仮想マシン) — JavaのJITコンパイラ(HotSpot)を搭載した実行環境
  • V8エンジン — GoogleがChromeとNode.js向けに開発したJavaScript用JITエンジン
  • WebAssembly — ブラウザ上で動く低レベル中間コード形式。JITとの組み合わせで高速化
  • ガベージコレクション — JITと並びJVMや.NETランタイムの主要機能。実行時メモリ管理