コンテンツにスキップ

【比較】コンパイラとインタプリタの違い

概要

「コンパイラ」と「インタプリタ」は、人間が書いたソースコードをコンピュータが実行できる形にする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 .pyc files」と明記しており、さらに「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 を組み合わせたハイブリッドです。

出典・参考