3秒でわかる
ソースコードを実行時に少しずつ解釈しながら動かす方式のこと。事前のビルドが不要で、書いてすぐ試せる代わりに実行は遅くなります。
もう少し詳しく
どういうものか
インタプリタは、ソースコードを機械語の実行ファイルに変換せず、実行しながら1文ずつ解釈して処理系自身が動かす方式です。Python、Ruby、PHP、シェルスクリプトがこの系統にあたります。
実際には、多くの処理系がソースをいったん中間表現 (バイトコード) に直してから実行しています。Python が __pycache__ に .pyc を作るのはこのためで、純粋に1文字ずつ読んでいるわけではありません。
なぜ必要か
書いて即実行できることは、学習と試行錯誤の速度に直結します。コンパイルの待ち時間がなく、対話環境で1行ずつ結果を確かめられるため、データ分析のように「試しながら考える」作業と相性がよいです。同じソースを Windows でも Mac でも Linux でも、その環境の処理系さえあれば動かせるという移植性もあります。
具体例
コンパイルする C と、しない Python を並べると違いがはっきりします。
# コンパイル方式 — 先に機械語の実行ファイルを作る
gcc hello.c -o hello
./hello
# インタプリタ方式 — ソースをそのまま渡す
python3 hello.pyインタプリタ方式は、途中まで正しく動いてから誤りで止まることがあります。
print("開始")
print(1 / 0) # ここで初めてエラー。上の行は実行済み
print("ここは実行されない")コンパイル方式なら、この種の誤りの多くは実行前に検出されます。
つまずきやすいところ
「インタプリタ言語」と「コンパイラ言語」を、言語の性質として固定的に覚えてしまうと説明がつかない例に出会います。C を対話的に動かす処理系もあれば、Python を機械語に落とす仕組みもあり、これは言語ではなく処理系の方式の話です。
Java の位置づけも混乱しやすい点です。Java はソースをバイトコードにコンパイルし、それを JVM が解釈して実行します。さらに JVM は、よく通る部分を実行中に機械語へ変換する JIT を備えています。コンパイルとインタプリタの両方を使う構成です。
配布の形も違います。コンパイル方式は実行ファイルだけ渡せば動きますが、インタプリタ方式は相手の環境に処理系とライブラリが必要です。手元では動いたのにサーバーで動かない、という相談の多くは、この前提の差から生じます。
似た用語との違い
| 方式 | 変換の時期 | 速度 | 誤りの検出 |
|---|---|---|---|
| コンパイラ | 実行前にまとめて | 速い | 実行前に多くを検出 |
| インタプリタ | 実行しながら | 遅い | その行に到達して初めて |
| JIT | 実行中に必要な部分だけ | 温まると速い | 実行時が中心 |