コンパイラ vs インタプリタとは?コンパイラは事前に機械語へ変換して速く動く方式

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

30秒で結論

コンパイラ 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(トレードオフ)

📝 オリジナル問題 1 2つの方式のトレードオフ

コンパイラ方式とインタプリタ方式に関する次の記述のうち、正しいものはどれか。

  1. コンパイラ方式はすぐ始められるが遅く、インタプリタ方式は変換に時間がかかるが速い
  2. コンパイラ方式は速く型エラーを事前に見つけやすく、インタプリタ方式はすぐ始まり柔軟だ
  3. コンパイラ方式もインタプリタ方式もまったく同じで、速さや始めやすさに違いはないものだ
  4. コンパイラ方式は紙に印刷する装置のことで、プログラムの実行とは無関係なものだとされる
テクマスター
テクマスター 解答・解説

解答は 2 ですよ。

コンパイラ方式は速く型エラーを事前に見つけやすく、インタプリタ方式はすぐ始められて柔軟ですね。本を印刷してから配るか、その場で読み上げるかの違いです。

選択肢1のコンパイラとインタプリタが逆、選択肢3の「同じ」、選択肢4の「印刷する装置」はどれも誤りですよ。

選択肢判定理由
1コンパイラとインタプリタの説明が逆
2コンパイラは速い・インタプリタは柔軟
3速さも始めやすさも違う
4印刷する装置ではない

オリジナル問題2(用途しだい)

📝 オリジナル問題 2 どちらが上かは用途しだい

コンパイラとインタプリタの優劣に関する次の記述のうち、正しいものはどれか。

  1. コンパイラはあらゆる場面でインタプリタより必ず優れており、使い分ける必要はないものだ
  2. インタプリタはあらゆる場面でコンパイラより必ず優れているものだとされている
  3. コンパイラもインタプリタも紙に印刷する手順のことで、優劣とは無関係なものだとされている
  4. 速さがほしいならコンパイラ、すぐ動かしたい・柔軟ならインタプリタ寄りと用途で選ぶ
テクマスター
テクマスター 解答・解説

解答は 4 ですよ。

速さがほしいならコンパイラ、すぐ動かしたい・柔軟ならインタプリタ寄りと、用途で選びますね。どちらが上という話ではありません。

選択肢1と選択肢2の「必ず優れている」、選択肢3の「印刷する手順」はどれも誤りですよ。

選択肢判定理由
1インタプリタが向く場面もある
2コンパイラが向く場面もある
3印刷する手順ではない
4用途で使い分ける

オリジナル問題3(Pythonの実態)

📝 オリジナル問題 3 Pythonの実態

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

  1. Pythonは内部でいったんバイトコードに変換してから動き、純粋なインタプリタではない
  2. Pythonは事前にすべてを機械語化する純粋なコンパイラ方式だとされている
  3. Pythonは紙に印刷する装置のことで、プログラムの実行とは無関係なものだとされている
  4. Pythonは変換をいっさいせずソースを直接実行する純粋なインタプリタだとされているのだ
テクマスター
テクマスター 解答・解説

解答は 1 ですよ。

Pythonは内部でいったんバイトコードに変換してから動き、純粋なインタプリタではありませんね。CPythonはコンパイラと仮想マシンの組み合わせです。

選択肢2の「純粋なコンパイラ」、選択肢3の「印刷する装置」、選択肢4の「ソースを直接実行」はどれも誤りですよ。

選択肢判定理由
1内部でバイトコードに変換する
2事前に機械語化はしない
3印刷する装置ではない
4バイトコードに変換してから動く

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

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

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

App Storeで見る