【比較】コンパイラとインタプリタの違い¶
概要¶
「コンパイラ」と「インタプリタ」は、人間が書いたソースコードをコンピュータが実行できる形にする2つの方式です。コンパイラは実行前にソース全体を機械語(または中間表現)へ一括翻訳し、生成物を後から実行します。インタプリタはソースを読みながら逐次解釈・実行します。
混同が起きやすいのは「C はコンパイラ言語」「Python はインタプリタ言語」といった言語=方式の固定観念があるためです。実際には方式は言語そのものの性質ではなく実装の選択であり、現代の主要処理系の多くは「ソース → バイトコード(コンパイル)→ 仮想マシンで逐次実行(インタプリタ)」というハイブリッドや、実行時に機械語へ変換する JIT を採用しています。本記事ではこのスペクトラムを公式仕様に沿って整理します。
詳細比較¶
| 項目 | コンパイラ (Compiler) | インタプリタ (Interpreter) |
|---|---|---|
| 翻訳のタイミング | 実行前に全体を一括翻訳 | 実行しながら逐次解釈 |
| 生成物 | 実行可能ファイルや中間コード(バイトコード等)を出力 | 原則として永続的な実行ファイルは作らない(バイトコードをキャッシュする実装もある) |
| 実行速度 | 一般に高速(最適化済みネイティブコードになり得る) | 一般に低速(解釈のオーバーヘッド) |
| エラー検出 | コンパイル時に型・構文エラーをまとめて検出しやすい | 実行が到達した行で初めてエラーが出ることが多い |
| 開発サイクル | ビルド工程が入る分やや長い | ソースを直接実行でき短い(対話実行も可能) |
| 配布 | ターゲット環境向けバイナリを配布(実行時にソース不要なことが多い) | 実行時にインタプリタとソース/バイトコードが必要 |
| 代表的な処理系 | C/C++(GCC, Clang)、Rust、Go | 古典的シェル、伝統的 BASIC、純粋なインタプリタ実装(Python・Ruby などは厳密にはバイトコードへコンパイル+仮想マシンで解釈するハイブリッドで、純粋なインタプリタではない) |
よくある誤解¶
-
「Python はインタプリタ言語だからコンパイルは一切ない」は誤り。 CPython はソースコードをバイトコードにコンパイルしてから仮想マシンで逐次実行します。Python 公式用語集も「Python source code is compiled into bytecode … cached in
.pycfiles」と明記しており、さらに「interpreted か compiled かの区別は bytecode compiler の存在により曖昧(the distinction can be blurry)」と述べています。正確には「バイトコードへコンパイルし、それをインタプリタで実行する」ハイブリッドです。 -
「コンパイラ=必ず機械語を吐く」は誤り。 コンパイラとは「ある言語から別の言語へ翻訳するもの」であり、出力先は機械語に限りません。Java や C# は中間バイトコード(JVM バイトコード/CIL)にコンパイルされ、実行時に仮想マシンが解釈または JIT で機械語化します。
-
「言語ごとに方式が固定」は誤り。 同じ言語に複数の実装方式が存在し得ます。C にもインタプリタ実装があり、JavaScript は当初純インタプリタでしたが現代のエンジン(V8 等)はバイトコード化と JIT を併用します。方式は言語の本質ではなく実装の選択です。
実務での選び分け¶
これは「自分でどちらかを選ぶ」というより、言語・処理系の特性として理解しておく観点です。
- 起動の速さ・対話的試行錯誤・スクリプト的自動化を重視 → インタプリタ寄りの処理系(Python、Ruby、シェル)が向く。
- 実行速度・配布の手軽さ(単一バイナリ)・実行時依存の最小化を重視 → AOT コンパイル系(Go、Rust、C/C++)が向く。
- 長時間動くサーバで起動後のスループットを重視 → JIT 系(JVM、.NET、最新の JS エンジン)が、ウォームアップ後にネイティブ並みの速度を出す。
- エラーを早期に潰したい → 静的型+コンパイル時チェックの強い処理系を選ぶと、実行前に多くの欠陥を検出できる。
ひとことまとめ¶
コンパイラは「実行前に一括翻訳する」、インタプリタは「実行しながら逐次解釈する」方式ですが、両者は対立ではなくスペクトラムであり、現代の主要処理系の多くはバイトコード化+仮想マシン実行+JIT を組み合わせたハイブリッドです。
出典・参考¶
- Python 公式用語集 — bytecode / interpreted の定義 — 「ソースを bytecode にコンパイルし
.pycにキャッシュ」「interpreted/compiled の区別は曖昧」と明記 - The bytecode interpreter — CPython InternalDocs(公式リポジトリ) — CPython のバイトコードインタプリタ(スタックマシン)の解説
- The Java Virtual Machine Specification (Oracle) — Java はバイトコードへコンパイルし JVM が実行する仕様