コンパイラ vs インタプリタとは(全体像)
これは、プログラムを動かす2つの考え方を比べる話だ。コンパイラ方式は「動かす前に全部を機械語にしておく」、インタプリタ方式は「動かしながら1行ずつ解釈する」。
身近にたとえると、本の届け方だ。コンパイラは「全部を印刷して本にしてから配る」(作る時間はかかるが、読むのは速い・誤字も印刷前に直せる)。インタプリタは「著者がその場で読み上げる」(すぐ始まるが、読み上げなので遅め・柔軟に変えられる)。
押さえるのは、どちらが優れているという話ではなく、用途で選ぶということ。
詳しく:トレードオフと代表言語だけ覚えれば戦える
ここが記事の心臓部。まず2つの方式を比べましょう。
コンパイラ方式とインタプリタ方式
| 方式 | 実行速度 | 始めやすさ | エラー検出 | 代表 |
|---|---|---|---|---|
| コンパイラ | 速い | 変換に時間がかかる | 動かす前に型エラーを見つけやすい | C・C++・Rust・Go |
| インタプリタ | 遅め | すぐ始められる | 動かして初めて気づく(実行時) | (古典的)・スクリプト |
コンパイラ方式は、動かす前にすべてを機械語に変換するので、実行が速く、型のエラーを動かす前に見つけやすいのが強みです。一方、変換に時間がかかり、別のCPU向けには作り直し(再コンパイル)が必要です。
インタプリタ方式は、1行ずつ解釈しながら動かすので、すぐ始められて柔軟ですが、実行は遅めで、エラーは動かして初めて気づくことが多いです。
そして現代の多くの言語は、両者のいいとこ取り(バイトコード+JIT)です。
代表言語の分類
| 分類 | 言語 |
|---|---|
| コンパイラ(事前に機械語化) | C・C++・Rust・Go |
| いいとこ取り(バイトコード+JIT) | Java・JavaScript・C# |
| バイトコード+仮想マシン | Python(CPython)・Ruby |
ここで一番のひっかけが「コンパイラのほうがインタプリタより必ず優れている」という誤解。どちらが上ではなく、用途しだいです。速さがほしいならコンパイラ、すぐ動かしたい・柔軟にしたいならインタプリタ寄り、という使い分けになります。
もう1つのひっかけが「Pythonは純粋なインタプリタ」。実際は内部でいったんバイトコードに変換してから動くので、純粋なインタプリタではありません。
わかりやすく言い換えると
要するに、本の届け方のたとえで覚えるとラクです。
①コンパイラ … 全部印刷して本にしてから配る(速い・誤字を事前に直せる・C/C++/Rust/Go)
②インタプリタ … その場で読み上げる(すぐ始まる・柔軟だが遅め)
③いいとこ取り … 電子書籍(中間形式)を読み手側で高速表示(Java/JavaScript/C#)
つまり、「どちらが上ではなく用途しだい」「Pythonは純粋なインタプリタではない」、この2点が試験の急所です。
試験のツボ
🔴 一番出る:2つの方式のトレードオフ
①コンパイラ=速い・型エラーを動かす前に見つけやすい(変換に時間)
②インタプリタ=すぐ始められて柔軟だが遅め(エラーは実行時に気づく)
🔴 次に出る:どちらが上ではなく用途しだい
①速さがほしいならコンパイラ(C・C++・Rust・Go)
②すぐ動かしたい・柔軟にしたいならインタプリタ寄り
🟡 押さえると安定:代表言語とPython
①いいとこ取り(バイトコード+JIT)=Java・JavaScript・C#
②Pythonは純粋なインタプリタではない(内部でバイトコードに変換)
よくある間違い
①「コンパイラのほうがインタプリタより必ず優れている」→ ✗ どちらが上ではなく用途しだい。速さならコンパイラ、すぐ動かす・柔軟ならインタプリタ寄り。
②「Pythonは純粋なインタプリタで、ソースを直接実行する」→ ✗ Pythonは内部でいったんバイトコードに変換してから動く。純粋なインタプリタではない。
③「コンパイラ方式はエラーをすべて動かしてからしか見つけられない」→ ✗ コンパイラ方式は型エラーなどを動かす前(コンパイル時)に見つけやすいのが強み。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(トレードオフ)
コンパイラ方式とインタプリタ方式に関する次の記述のうち、正しいものはどれか。
- コンパイラ方式はすぐ始められるが遅く、インタプリタ方式は変換に時間がかかるが速い
- コンパイラ方式は速く型エラーを事前に見つけやすく、インタプリタ方式はすぐ始まり柔軟だ
- コンパイラ方式もインタプリタ方式もまったく同じで、速さや始めやすさに違いはないものだ
- コンパイラ方式は紙に印刷する装置のことで、プログラムの実行とは無関係なものだとされる
解答は 2 ですよ。
コンパイラ方式は速く型エラーを事前に見つけやすく、インタプリタ方式はすぐ始められて柔軟ですね。本を印刷してから配るか、その場で読み上げるかの違いです。
選択肢1のコンパイラとインタプリタが逆、選択肢3の「同じ」、選択肢4の「印刷する装置」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | コンパイラとインタプリタの説明が逆 |
| 2 | ✓ | コンパイラは速い・インタプリタは柔軟 |
| 3 | ✗ | 速さも始めやすさも違う |
| 4 | ✗ | 印刷する装置ではない |
オリジナル問題2(用途しだい)
コンパイラとインタプリタの優劣に関する次の記述のうち、正しいものはどれか。
- コンパイラはあらゆる場面でインタプリタより必ず優れており、使い分ける必要はないものだ
- インタプリタはあらゆる場面でコンパイラより必ず優れているものだとされている
- コンパイラもインタプリタも紙に印刷する手順のことで、優劣とは無関係なものだとされている
- 速さがほしいならコンパイラ、すぐ動かしたい・柔軟ならインタプリタ寄りと用途で選ぶ
解答は 4 ですよ。
速さがほしいならコンパイラ、すぐ動かしたい・柔軟ならインタプリタ寄りと、用途で選びますね。どちらが上という話ではありません。
選択肢1と選択肢2の「必ず優れている」、選択肢3の「印刷する手順」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | インタプリタが向く場面もある |
| 2 | ✗ | コンパイラが向く場面もある |
| 3 | ✗ | 印刷する手順ではない |
| 4 | ✓ | 用途で使い分ける |
オリジナル問題3(Pythonの実態)
Pythonの実行方式に関する次の記述のうち、正しいものはどれか。
- Pythonは内部でいったんバイトコードに変換してから動き、純粋なインタプリタではない
- Pythonは事前にすべてを機械語化する純粋なコンパイラ方式だとされている
- Pythonは紙に印刷する装置のことで、プログラムの実行とは無関係なものだとされている
- Pythonは変換をいっさいせずソースを直接実行する純粋なインタプリタだとされているのだ
解答は 1 ですよ。
Pythonは内部でいったんバイトコードに変換してから動き、純粋なインタプリタではありませんね。CPythonはコンパイラと仮想マシンの組み合わせです。
選択肢2の「純粋なコンパイラ」、選択肢3の「印刷する装置」、選択肢4の「ソースを直接実行」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | 内部でバイトコードに変換する |
| 2 | ✗ | 事前に機械語化はしない |
| 3 | ✗ | 印刷する装置ではない |
| 4 | ✗ | バイトコードに変換してから動く |
まとめ
押さえどころ
- 🔴 2つの方式 = コンパイラは速く型エラーを事前に見つけやすい、インタプリタはすぐ始められて柔軟だが遅め。
- 🔴 用途しだい = どちらが上ではない。速さならコンパイラ(C・C++・Rust・Go)、すぐ動かす・柔軟ならインタプリタ寄り。
- 🟡 代表言語とPython = いいとこ取り(バイトコード+JIT)はJava・JavaScript・C#。Pythonは純粋なインタプリタではない。
次に学ぶ
- インタプリタ・JIT ── 実行中によく使う箇所を機械語化する、JITのしくみ。
- コンパイラのフェーズ ── 事前に機械語へ変換するコンパイラの6つの段階。
執筆: SikakuQuest編集部