最終更新:

【図解で比較】コンパイラ vs インタプリタ — プログラム実行方式の違いを徹底解説


プログラム実行方式の比較 コンパイラ方式(C / Rust / Go) ソースコード コンパイラ 機械語 実行 一括変換 → 高速実行 インタプリタ方式(Python / Ruby) ソースコード インタプリタ(1行ずつ変換+実行) 結果 逐次変換 → すぐ試せる JIT方式(Java / C# / V8) ソースコード コンパイル (事前) バイトコード JIT (実行時) 実行 中間形式 → 速度と柔軟性を両立
コンパイラ・インタプリタ・JITの実行フロー比較
ひよこ ひよこ

プログラミング言語って、書いたコードがそのまま動くわけじゃないんだよね?

ペンギン先生 ペンギン先生

そうだよ。コンピュータが理解できるのは機械語(0と1の羅列)だけだから、人間が書いたソースコードを何らかの方法で変換する必要があるんだ。その変換方式の代表が「コンパイラ」と「インタプリタ」の2つだよ。

ひよこ ひよこ

コンパイラってどういう仕組みなの?

ペンギン先生 ペンギン先生

コンパイラは「事前にまとめて翻訳する」方式だよ。ソースコード全体を一括で機械語に変換して、実行ファイルを作る。C言語C++Rust、Goなんかがこの方式だね。本を丸ごと翻訳してから読者に渡すイメージだよ。

ひよこ ひよこ

じゃあインタプリタは?

ペンギン先生 ペンギン先生

インタプリタは「その場で1行ずつ翻訳しながら実行する」方式だよ。PythonRubyJavaScriptなんかがこっちだね。通訳者が話を聞きながらリアルタイムで訳していくイメージ。だから実行前にコンパイルする手間がなくて、書いたらすぐ試せるのが強みなんだ。

ひよこ ひよこ

すぐ試せるのは便利だね!でも速度に差があったりするの?

ペンギン先生 ペンギン先生

大きな差があるよ。コンパイラ方式は事前に最適化された機械語を直接実行するから非常に速い。インタプリタ方式は毎回翻訳しながら動くぶん、どうしても遅くなるんだ。あとコンパイラコンパイル時にエラーをまとめて検出できるけど、インタプリタは実行してその行に到達するまでエラーに気づけないこともあるよ。

ひよこ ひよこ

じゃあ全部コンパイラにすればいいんじゃないの?

ペンギン先生 ペンギン先生

そうとも限らないんだ。インタプリタにはREPLっていう対話的にコードを試せる環境があって、データ分析や学習にはすごく便利。コンパイラ方式だと「書く→コンパイル→実行」のサイクルが必要だけど、インタプリタなら1行書いてすぐ結果が見える。用途に応じた使い分けが大事なんだよ。

ひよこ ひよこ

JavaとかC#はどっちになるの?

ペンギン先生 ペンギン先生

いい質問だね。JavaC#は「どちらでもない第3の方式」を使っているよ。ソースコードをまず「バイトコード」という中間形式にコンパイルして、実行時にJITコンパイラ(Just-In-Time Compiler)が機械語に変換するんだ。事前コンパイルの速さとプラットフォーム非依存の柔軟さを両立した仕組みだよ。JavaScriptのV8エンジンも同じくJITを使っているよ。

ひよこ ひよこ

バイトコードって機械語とは違うの?

ペンギン先生 ペンギン先生

違うよ。機械語はCPUが直接実行できる命令だけど、バイトコードは仮想マシン向けの中間コードなんだ。JavaならJVM、C#ならCLRっていうVMが解釈・実行する。だからWindows用にコンパイルしたバイトコードがmacOSでもLinuxでも動く。「一度書けばどこでも動く」を実現する鍵がバイトコードなんだよ。

ひよこ ひよこ

最近はこの境界がもっと曖昧になってきてるって聞いたけど…?

ペンギン先生 ペンギン先生

まさにその通り。AOT(Ahead-Of-Time)コンパイルといって、JavaC#でも事前に機械語まで変換する技術が登場しているし、逆にPythonは3.13からJITコンパイラが実験的に導入されたんだ。LLVMという共通基盤のおかげで、さまざまな言語が同じ最適化技術を使えるようになっているよ。

ひよこ ひよこ

WebAssemblyっていうのもコンパイルと関係あるの?

ペンギン先生 ペンギン先生

大ありだよ。WebAssemblyブラウザ上で高速に動く「コンパイルターゲット」なんだ。C++Rustで書いたコードをWebAssemblyコンパイルすれば、ブラウザ内でほぼネイティブ並みの速度で動かせる。かつてWebはインタプリタ方式のJavaScriptだけだったけど、今はコンパイル方式の恩恵もWebで受けられる時代になったんだよ。

ひよこ ひよこ

コンパイラインタプリタ、結局どっちが正解なの?

ペンギン先生 ペンギン先生

「正解」はなくて、目的次第だね。最高速度が必要ならコンパイラ方式のRustC++、素早くプロトタイプを作りたいならインタプリタ方式のPython、両方のバランスが欲しいならJIT方式のJavaC#。現代の言語は複数の方式を組み合わせるのが主流だから、「この言語はコンパイラインタプリタ」と単純に分けるより、仕組みの違いを理解しておくことが大事だよ。