インタプリタとは?
インタプリタとは、プログラム全体を先に別の機械語ファイルへ翻訳するのではなく、ソースコードを直接読みながらその命令を順に実行するプログラムです。標準的なPythonやRubyの実装はインタプリタです。
更新日: 2026年9月24日
- 1print("Hello")
- 2total = 2 + 3
- 3print(total)
- 4print("Done")
実行するたびに行を翻訳し直します。つづり間違いをオンにしても、インタプリタは3行目に達して止まる前に "Hello" を表示します。
python3 hello.py と入力すると出力が表示されますが、そのあとフォルダを見ても新しいプログラムファイルは作られていません。実際に動いたプログラムは python3 自身、つまりPythonインタプリタです。インタプリタが hello.py を読み、各文の意味を理解して実行しました。明日もう一度スクリプトを実行すると、インタプリタはまたソースを最初から読みます。
インタプリタの仕組み
インタプリタは、プログラムが終わるまで1つのサイクルを繰り返します。次の命令を取り出し、意味を理解し、実行し、先へ進みます。その間、プログラムの変数を自分のメモリに保持しているので、total = price * 3 は数行前に設定された price を使えます。
これをいちばんよく見られるのが、REPL(read、evaluate、print、loop)と呼ばれる対話モードです。ファイル名を付けずに python3 と入力すると、Enterキーを押した瞬間にその行が実行されます。
>>> price = 4
>>> price * 3
12
実際のインタプリタには準備の段階があります。標準のPythonインタプリタであるCPythonは、まずファイル全体をバイトコード(単純な命令を並べたコンパクトな列)にコンパイルし、そのバイトコードを1命令ずつ実行するループを回します。1行分のバイトコードを表示してみましょう。
Python 3.12では次のように表示されます(ほかのバージョンでは細部が異なります)。
0 0 RESUME 0
1 2 LOAD_NAME 0 (price)
4 LOAD_CONST 0 (3)
6 BINARY_OP 5 (*)
10 STORE_NAME 1 (total)
12 RETURN_CONST 1 (None)
これらの各行が、インタプリタのループの1ステップです。price の値を取り出し、定数 3 を取り出し、掛け合わせ、結果を total に格納します。どれも機械語ではありません。それ自体がコンパイル済みのCプログラムであるインタプリタが、各ステップを実行しています。
エラーはその行を実行したときに現れる
インタプリタは実行しながら進むので、プログラムは間違いにぶつかる前に実際の処理をこなせます。次を実行すると、クラッシュする前に最初の2行が表示されます。
Step 1: starting
Step 2: still fine
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
構文の間違いは違う振る舞いをします。CPythonは、ファイルのどこかを実行する前に、ファイル全体をバイトコードにコンパイルするからです。3行目を print("Step 3:" 10)(カンマが抜けている)に変えると、Step 1も含めて何も表示されません。
SyntaxError: invalid syntax. Perhaps you forgot a comma?
つまり「インタプリタはコードを1行ずつ実行する」は半分しか正しくありません。文法はファイル全体について最初にチェックされます。ゼロ除算や存在しない名前の使用など、それ以外の問題は、その行を実行したときに初めて見つかります。前者については構文エラーを参照してください。
コンパイラとインタプリタの違い
コンパイラは、プログラムを実行する前に全体を別のファイルへ翻訳します。インタプリタは、毎回プログラムそのものを実行します。実際の違いはここから生まれます。
| コンパイラ | インタプリタ | |
|---|---|---|
| 処理が行われるタイミング | プログラムの実行前に一度だけ | プログラムを実行するたびに毎回 |
| 出力 | 別のファイル(実行ファイルやバイトコード) | 別のプログラムファイルはない |
| ユーザーに渡すもの | コンパイル済みのプログラム | ソースコードと、ユーザーのマシンにインストールされたインタプリタ |
| エラーチェック | 実行前にプログラム全体の構文と、型付き言語なら型エラー | 通常は構文を先にチェックし、それ以外のエラーは問題の行を実行したときに現れる |
| 編集と実行 | 変更のたびに再コンパイル | 保存してもう一度実行 |
| 速度 | 速い。CPUが機械語を直接実行する | 遅い。実行中にすべての命令を読み解く |
| 移植性 | CPUとオペレーティングシステムごとに再コンパイル | インタプリタがある場所ならどこでも同じソースが動く |
| 代表的な言語 | C, C++, Rust, Go | Python, Ruby, PHP, Bash |
計算を繰り返すタイトなループでは、速度の差ははっきり出ます。同じループが、CPythonよりコンパイルしたCのほうが何倍も速く動くことがあります。ネットワーク、ディスク、ユーザーを待っている時間がほとんどのプログラムでは、差は気づかないほど小さいことがよくあります。
コンパイル型かインタプリタ型かは言語の性質ではない
言語は規則の集まりで、コンパイラやインタプリタはその規則を実装するプログラムです。同じ言語をどちらの方法でも実行でき、よく使われる言語の多くは両方を組み合わせています。
- Python。 CPythonはバイトコードにコンパイルし、それを解釈します。別の実装であるPyPyは、よく実行されるコードをプログラムの実行中に機械語にするJIT(ジャストインタイム)コンパイラを加えています。
- Java。
javacがソースを事前にバイトコードへコンパイルします。そのバイトコードをJava仮想マシンが解釈し、特によく動くメソッドを機械語にJITコンパイルします。Java 11以降は、java Main.javaで1つのソースファイルを直接実行できます。まずメモリ上でコンパイルしてから動かしています。 - JavaScript。 ブラウザやNode.jsはV8などのエンジンを使います。V8はまずコードを解釈し、プログラムの実行中によく動く部分を機械語にコンパイルします。
- CとC++。 ほとんどの場合、GCC、Clang、MSVCで事前にコンパイルされます。
python3 app.py # Python: interpreter, bytecode behind the scenes
node app.js # JavaScript: V8 interprets, then JIT-compiles
javac Main.java # Java step 1: compile to Main.class
java Main # Java step 2: the JVM runs the bytecode
どちらの方法でも、インタプリタや仮想マシンはプログラムの実行環境の一部です。プログラムを動かす場所には、それがインストールされていなければなりません。
よくある誤解
- 「インタプリタは各行を機械語に翻訳する」 古典的なインタプリタは、プログラムのための機械語を一切作りません。命令を読み、インタプリタにあらかじめコンパイルされて組み込まれているコードを使ってそれを実行します。実行時に機械語を作るのはJITコンパイラの仕事です。
- 「インタプリタ型言語にはコンパイルの段階がない」 CPython、RubyのYARV、PHPはいずれも、まずバイトコードにコンパイルします。この段階は自動で目に見えないので、見落としがちです。
- 「インタプリタ型は遅い」 JITコンパイルによって差の多くは埋まりました。V8はJavaScriptを十分に速く動かせるので、Electronで作られたVS Codeのような大きなアプリケーションも動きます。
- 「Pythonはインタプリタのこと」 Pythonは言語です。CPython、PyPy、MicroPythonはそれぞれ別のインタプリタで、速度や対応するライブラリが異なることがあります。
次に読むもの
比較のもう半分については、コンパイラとは何かと、それがソースコードを機械語に変える仕組みを読んでください。インタプリタがほかに何を一緒に持ち込むかは、実行環境のページで説明しています。インタプリタを自分で試すなら、Pythonスクリプトを実行するか、Pythonプレイグラウンドを開いてください。
よくある質問
Pythonはコンパイラですか、インタプリタですか?
C++はインタプリタとコンパイラのどちらで動きますか?
インタプリタとコンパイラ、速いのはどちらですか?
REPLとは何ですか?
python3 や node と入力すると開きます。ファイルを作らずに小さなアイデアを試すのに便利です。1つの言語がコンパイルもインタプリタ実行もされることはありますか?
javac でバイトコードにコンパイルされ、それをJVMが解釈したりJITコンパイルしたりします。PythonやJavaScriptのような言語にも、インタプリタとコンパイラの両方があります。