インタプリタ・JITとは(全体像)
これは、書いたプログラムを、どうやって機械が分かる形に変えて実行するかの方式の話だ。
身近にたとえると、外国語の伝え方だ。インタプリタは「同時通訳」で、その場で1文ずつ訳しながら進む(すぐ始められるが、訳しながらなので遅め)。AOTコンパイラは「事前に全部を翻訳して本にする」(本にする時間はかかるが、できた本は速く読める)。JITは「最初は同時通訳しつつ、何度も出る表現は途中で清書して本にする」(だんだん速くなる)。
押さえるのは、3つの方式があり、起動の速さと実行の速さがトレードオフだということ。
詳しく:3つの方式とJITのしくみだけ覚えれば戦える
ここが記事の心臓部。まず3つの方式を比べましょう。
3つの実行方式
| 方式 | やり方 | 起動 | 実行速度 | 代表 |
|---|---|---|---|---|
| インタプリタ | 1行ずつ解釈して実行 | 速い | 遅め | Python・Ruby |
| AOTコンパイラ | 事前にすべて機械語化 | 遅い | 速い | C・C++・Go |
| JIT | 実行中によく使う箇所を機械語化 | 中くらい | 速い(温まれば) | V8・JVM |
インタプリタは、ソースを1行ずつ解釈しながら実行します。すぐ始められますが、訳しながら動くので実行は遅めです。AOTコンパイラは、動かす前にすべてを機械語に変換しておくので、起動に時間はかかりますが実行は速いです。
JITは、その中間のいいとこ取り。最初はインタプリタのように動きながら、よく使われる箇所(ホットスポット)を見つけて、そこだけ実行中に機械語に変換します。だから起動は速く、動かし続けるほど速くなっていきます。
ここで一番のひっかけが「JITは普通の(事前の)コンパイラと同じ」という誤解。JITは「実行中に」機械語化するので、事前にすべてを変換するAOTコンパイラとは別ものです。
JITのしくみ
| 段階 | やること |
|---|---|
| ① | 最初はインタプリタのように動く |
| ② | よく使う箇所(ホットスポット)を見つける |
| ③ | その箇所だけ実行中に機械語へ変換 |
| ④ | 以降そこは機械語で高速に動く |
代表的なJITは、V8(JavaScript・ChromeやNode.jsで動く)とJVM(Java)です。もう1つの誤解として「Pythonは純粋なインタプリタ」がありますが、実際は内部でいったんバイトコードに変換してから動いており、PyPyはJITを使います。
わかりやすく言い換えると
要するに、通訳のたとえで覚えるとラクです。
①インタプリタ … 同時通訳(その場で1文ずつ・すぐ始まるが遅め)
②AOTコンパイラ … 事前に全部翻訳して本に(起動は遅いが実行は速い)
③JIT … 同時通訳しつつ頻出表現を途中で本に(だんだん速くなる・V8やJVM)
つまり、「JITは実行中に機械語化(事前のAOTとは別)」「ホットスポットだけ変換」、この2点が試験の急所です。
試験のツボ
🔴 一番出る:3つの方式の違い
①インタプリタ=1行ずつ解釈(起動速い・実行遅め)/AOT=事前に機械語化(起動遅い・実行速い)
②JIT=実行中によく使う箇所を機械語化(起動速く徐々に速くなる)
🔴 次に出る:JITのしくみ
①最初はインタプリタのように動く
②よく使う箇所(ホットスポット)だけを実行中に機械語へ変換する
🟡 押さえると安定:代表と誤解
①代表はV8(JavaScript)とJVM(Java)
②Pythonは純粋なインタプリタではない(内部でバイトコード化・PyPyはJIT)
よくある間違い
①「JITは事前にすべてを変換する普通のコンパイラと同じ」→ ✗ JITは実行中によく使う箇所を機械語化する。事前にすべて変換するのはAOTコンパイラ。
②「Pythonは純粋なインタプリタで、ソースを直接実行する」→ ✗ CPythonは内部でいったんバイトコードに変換してから動く。PyPyはJITを使う。
③「インタプリタはAOTより必ず実行が速い」→ ✗ インタプリタは起動が速い反面、実行は遅め。実行はAOTやJITのほうが速い。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(3つの方式)
実行方式に関する次の記述のうち、正しいものはどれか。
- AOTコンパイラは実行中に少しずつ機械語化する方式で、起動が最も速いものだとされている
- インタプリタは事前にすべてを機械語化する方式で、起動が最も遅いものだとされているのだ
- インタプリタは1行ずつ解釈、AOTは事前に機械語化、JITは実行中に機械語化する方式だ
- 3つの実行方式はまったく同じ動きで、起動や実行速度に違いはないものだとされているのだ
解答は 3 ですよ。
インタプリタは1行ずつ解釈、AOTは事前に機械語化、JITは実行中に機械語化する方式ですね。通訳・翻訳本・その中間のイメージです。
選択肢1の「AOTが実行中」、選択肢2の「インタプリタが事前」、選択肢4の「同じ動き」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 実行中に変換するのはJIT |
| 2 | ✗ | 事前に変換するのはAOT |
| 3 | ✓ | 3方式の説明が正しい |
| 4 | ✗ | 起動も実行速度も違う |
オリジナル問題2(JITのしくみ)
JITに関する次の記述のうち、正しいものはどれか。
- JITは最初はインタプリタのように動き、よく使う箇所を実行中に機械語へ変換する方式である
- JITは事前にすべてを機械語化してから動き、実行中には何も変換しないものだとされている
- JITは紙に印刷する手順のことで、プログラムの実行とは無関係なものだとされているものだ
- JITはプログラムを必ず1行ずつ解釈し続け、機械語に変換することはないものだとされている
解答は 1 ですよ。
JITは最初はインタプリタのように動き、よく使う箇所(ホットスポット)を実行中に機械語へ変換する方式ですね。だんだん速くなります。
選択肢2の「事前にすべて変換」、選択肢3の「印刷する手順」、選択肢4の「1行ずつ解釈し続ける」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | ホットスポットを実行中に機械語化 |
| 2 | ✗ | 事前にすべて変換するのはAOT |
| 3 | ✗ | 印刷する手順ではない |
| 4 | ✗ | よく使う箇所は機械語化する |
オリジナル問題3(代表と誤解)
JITの代表とPythonに関する次の記述のうち、正しいものはどれか。
- JITの代表は紙に印刷する装置のことで、JavaやJavaScriptとは無関係だとされる
- Pythonは内部で変換せずソースを直接実行する純粋なインタプリタだとされる
- JITはどの言語にも存在せず、V8やJVMもJITを使っていないものだとされる
- JITの代表はV8とJVMで、Pythonでも高速なPyPyがJITを採用している
解答は 4 ですよ。
JITの代表はV8(JavaScript)とJVM(Java)で、PythonのPyPyもJITを採用していますね。CPythonは内部でバイトコードに変換して動きます。
選択肢1の「印刷する装置」、選択肢2の「ソースを直接実行」、選択肢3の「JITはどこにもない」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 代表はV8やJVM |
| 2 | ✗ | 内部でバイトコードに変換する |
| 3 | ✗ | V8やJVMはJITを使う |
| 4 | ✓ | V8・JVM・PyPyがJITの例 |
まとめ
押さえどころ
- 🔴 3つの方式 = インタプリタ(1行ずつ解釈・起動速い)/AOT(事前に機械語化・実行速い)/JIT(実行中に機械語化・徐々に速くなる)。
- 🔴 JITのしくみ = 最初はインタプリタのように動き、よく使う箇所(ホットスポット)を実行中に機械語化する。
- 🟡 代表と誤解 = 代表はV8(JavaScript)とJVM(Java)。Pythonは純粋なインタプリタではない(PyPyはJIT)。
次に学ぶ
- コンパイラのフェーズ ── 事前に機械語へ変換するコンパイラの6つの段階。
- 現代言語(Rust・Go・TypeScript) ── 実行方式と関わる、現代のプログラミング言語の特徴。
執筆: SikakuQuest編集部