ソースコードを1行ずつ解釈しながら、その場で実行していくプログラム。
インタプリタとは、ソースコードを1行ずつ解釈しながら、その場で実行していくプログラムです。コンパイラのように全体を事前に翻訳して実行ファイルを作ることはせず、上から順に「読んで、すぐ動かす」を繰り返します。
身近な例で考えると、同時通訳に似ています。話し手の言葉を1文ずつその場で訳して相手に伝える──全文が終わるのを待たずに、文ごとにすぐ伝わるのがインタプリタの動き方です。
上のツールで▶ボタンを押すと、ソースコードが1行ずつ「解釈→実行」され、途中で未定義の変数に出会ってエラーが発生し、そこで止まる様子を確認できます。
インタプリタの動作は、次の流れを1命令ずつ繰り返すだけのシンプルなものです。
・① 解釈:いま見ている行が何をする命令かを読み取る
・② 実行:解釈した内容をその場で実行し、必要なら結果を出力する
・③ 次の行へ:1行終えたら、すぐ次の行に進んで①に戻る
重要なのは、実行ファイルを作らないという点です。翻訳済みのファイルを残すのではなく、動かすたびにその場で解釈します。そのため、書いたコードをすぐ試せて、対話的に動かせるのが強みです。
エラーの出方にも特徴があります。1行ずつ進むため、エラーのある行に実際に到達して初めて止まります。上のツールでは3行目の未定義変数でエラーが出てそこで停止し、4行目は実行されません。それより前の行(1〜2行目)はすでに実行済みになっている点に注目してください。
インタプリタは起動が速く、対話的に動かせて、移植しやすい(=別の環境でも同じソースで動かしやすい)という長所があります。その代わり、毎回ソースを解釈し直すため実行は遅めです。一方コンパイラは事前に一括翻訳しておくので、実行が速いのが長所です。
| 項目 | インタプリタ | コンパイラ |
|---|---|---|
| 翻訳のしかた | 1行ずつ解釈実行 | 事前に一括翻訳 |
| 実行ファイル | 作らない | 作る |
| 実行速度 | 遅め | 速い |
| 得意なこと | 起動の速さ・移植性・対話 | 実行性能 |
インタプリタ方式で動く代表的な言語には Python・Ruby・JavaScript などがあります。書いてすぐ試せる手軽さから、学習用やWeb開発で広く使われています。
インタプリタの実行が遅い根本的な理由は、同じ命令でも実行するたびに毎回解釈し直すからです。
たとえば同じ処理を10回繰り返すループ(=同じ命令を何度も実行する構造)があるとき、インタプリタは同じ行を10回それぞれ「これは何をする命令か?」と解釈してから実行します。コンパイラであれば事前に一度だけ翻訳しておき、あとは翻訳済みの命令を10回実行するだけです。
・インタプリタ:解釈×10回 + 実行×10回
・コンパイラ:解釈×1回(コンパイル時) + 実行×10回
身近な例で言うと、同時通訳(インタプリタ)は毎回その場で訳すため、翻訳版の本(コンパイラ)をそのまま読むより時間がかかるのと同じ理屈です。ループ回数が多いプログラムほど差が大きくなるため、速さが求められる処理にはコンパイル方式が向いています。
インタプリタとコンパイラではエラーの出方が大きく異なります。これは「いつ翻訳するか」の違いから来ています。
インタプリタの場合:1行ずつ実行するため、エラーのある行に到達して初めてエラーになります。それより前の行はすでに実行済みです。「3行目にエラーがあっても、1・2行目は実行された」というのがインタプリタの特徴です。
コンパイラの場合:実行前に全体を翻訳するため、エラーが見つかると翻訳自体が失敗します。実行ファイルが作られないので1行も実行されません。ただし、エラーをまとめて事前に把握できる利点があります。
どちらが良いかは用途次第です。「書いてすぐ試せる・途中まで動かせる」のがインタプリタの強み、「実行前にまとめてエラーを発見できる」のがコンパイラの強み、と覚えておくと整理しやすいです。