インタプリタ・JITとは?インタプリタは1行ずつ解釈して実行する方式

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

インタプリタ・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つの方式)

📝 オリジナル問題 1 3つの実行方式

実行方式に関する次の記述のうち、正しいものはどれか。

  1. AOTコンパイラは実行中に少しずつ機械語化する方式で、起動が最も速いものだとされている
  2. インタプリタは事前にすべてを機械語化する方式で、起動が最も遅いものだとされているのだ
  3. インタプリタは1行ずつ解釈、AOTは事前に機械語化、JITは実行中に機械語化する方式だ
  4. 3つの実行方式はまったく同じ動きで、起動や実行速度に違いはないものだとされているのだ
テクマスター
テクマスター 解答・解説

解答は 3 ですよ。

インタプリタは1行ずつ解釈、AOTは事前に機械語化、JITは実行中に機械語化する方式ですね。通訳・翻訳本・その中間のイメージです。

選択肢1の「AOTが実行中」、選択肢2の「インタプリタが事前」、選択肢4の「同じ動き」はどれも誤りですよ。

選択肢判定理由
1実行中に変換するのはJIT
2事前に変換するのはAOT
33方式の説明が正しい
4起動も実行速度も違う

オリジナル問題2(JITのしくみ)

📝 オリジナル問題 2 JITのしくみ

JITに関する次の記述のうち、正しいものはどれか。

  1. JITは最初はインタプリタのように動き、よく使う箇所を実行中に機械語へ変換する方式である
  2. JITは事前にすべてを機械語化してから動き、実行中には何も変換しないものだとされている
  3. JITは紙に印刷する手順のことで、プログラムの実行とは無関係なものだとされているものだ
  4. JITはプログラムを必ず1行ずつ解釈し続け、機械語に変換することはないものだとされている
テクマスター
テクマスター 解答・解説

解答は 1 ですよ。

JITは最初はインタプリタのように動き、よく使う箇所(ホットスポット)を実行中に機械語へ変換する方式ですね。だんだん速くなります。

選択肢2の「事前にすべて変換」、選択肢3の「印刷する手順」、選択肢4の「1行ずつ解釈し続ける」はどれも誤りですよ。

選択肢判定理由
1ホットスポットを実行中に機械語化
2事前にすべて変換するのはAOT
3印刷する手順ではない
4よく使う箇所は機械語化する

オリジナル問題3(代表と誤解)

📝 オリジナル問題 3 JITの代表と誤解

JITの代表とPythonに関する次の記述のうち、正しいものはどれか。

  1. JITの代表は紙に印刷する装置のことで、JavaやJavaScriptとは無関係だとされる
  2. Pythonは内部で変換せずソースを直接実行する純粋なインタプリタだとされる
  3. JITはどの言語にも存在せず、V8やJVMもJITを使っていないものだとされる
  4. JITの代表はV8とJVMで、Pythonでも高速なPyPyがJITを採用している
テクマスター
テクマスター 解答・解説

解答は 4 ですよ。

JITの代表はV8(JavaScript)とJVM(Java)で、PythonのPyPyもJITを採用していますね。CPythonは内部でバイトコードに変換して動きます。

選択肢1の「印刷する装置」、選択肢2の「ソースを直接実行」、選択肢3の「JITはどこにもない」はどれも誤りですよ。

選択肢判定理由
1代表はV8やJVM
2内部でバイトコードに変換する
3V8やJVMはJITを使う
4V8・JVM・PyPyがJITの例

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る