はじめに
多分これはガセネタです。おそらく日本だけで出回っているガセネタです。インタプリタにはそのような定義はありません。インタプリタは「ソースコードを読み込んで意味を解釈して実行するプログラム」 です。「1行ずつ」は些細な間違いとして「機械語に変換する」は完全に間違いです。ある程度詳しい人にとっては常識だと思うのですが。
おそらくコンピュータは機械語しか動かせないから、インタプリタも最終的に機械語に変換しているはずだという間違った思い込みからこのガセネタは広まってしまっているのでしょう。機械語に変換するのは面倒な処理です。速くなるかもしれませんが変換処理しなくて良いのだから普通はしませんよ。
コンパイラとインタプリタの定義
コンパイラとは
コンパイラとは、ソースコードを元に実行可能なプログラムを生成するためのプログラムです。ユーザーは(ソースコードではなく)別に生成されたプログラムを実行します。かつてはコンパイラはソースコードから機械語に変換するものでしたが、今は中間コード(バイトコード)などに変換するコンパイラもあります。何に変換するかは関係なく、あらかじめの変換作業を行うプログラムがコンパイラです。
[ソースコード]
↓
[コンパイラ] 👈 コンパイルする(ソースコードを入力データとして実行ファイルを生成する)
│
│ 実行ファイルの生成(ソースコードから実行ファイルへの変換作業を事前に行う)
↓
[実行ファイル] 👈 ユーザーはこれを実行する(ユーザーは実行ファイルだけを持っていれば良い)
インタプリタとは
インタプリタとは、ソースコードを直接実行することができるプログラムです。ユーザーはソースコードをインタプリタに渡して実行します。内部的には中間コードなどに変換されている場合がありますがユーザーはそれを意識する必要はありません。内部の変換がどうなっているかは関係なく、コードを解釈しながら実行するプログラムがインタプリタです。内部で機械語に変換しなければならないという定義はなく、実際に機械語に変換しているインタプリタは少数派です。
[ソースコード]
↓
[インタプリタ] 👈 ユーザーはこれを実行する(ソースコードも必要、インタプリタはソースコードを実行するため)
※ユーザーが本当に実行しているプログラムはインタプリタだが、感覚的にはソースコードを実行している
バイトコードインタプリタの場合は、事前にバイトコードコンパイラを使ってバイトコード(機械語ではなく仮想的なコンピュータ用のバイナリ)に変換します。この場合、インタプリタはソースコードではなくバイトコードを実行します。この場合も「インタプリタは機械語に変換する」という要件はありません。解釈する対象がソースコードからバイトコードに変わるだけでインタプリタの役目は同じです。
[ソースコード]
↓
[コンパイラ] 👈 バイトコードにコンパイルする(ソースコードを入力データとして実行ファイルを生成する)
│
│ バイトコード実行ファイルの生成(ソースコードからバイトコードの実行ファイルへの変換作業を事前に行う)
↓
[インタプリタ] 👈 ユーザーはこれを実行する(バイトコードも必要、バイトコードインタプリタはバイトコードを実行する)
※ユーザーが本当に実行しているプログラムはインタプリタだが、感覚的にはバイトコードを実行している
いずれにしろインタプリタは解釈しながら実行するプログラムだと言うことです。
Wikipediaの定義
In computer science, an interpreter is a computer program that directly executes instructions written in a programming or scripting language, without requiring them previously to have been compiled into a machine language program.
インタプリタはプログラミング言語やスクリプト言語で書かれた命令を機械語プログラムにコンパイルすることなく直接実行するコンピュータ・プログラムのことであると書いてありますね。続けて3つのタイプが紹介されています。
- Parse the source code and perform its behavior directly;
- Translate source code into some efficient intermediate representation or object code and immediately execute that;
- Explicitly execute stored precompiled bytecode[1] made by a compiler and matched with the interpreter's Virtual Machine.
- ソースコードを解釈して直接実行する
- ソースコードを効率的な中間コードやオブジェクトコードに変換して実行する
- インタプリタ仮想マシンのバイトコードに変換して実行する
機械語に変換するようなインタプリタは定義されていません。
機械語に変換する方式だと移植性がさがる
機械語は特定のCPU固有の命令なので機械語に変換する場合、対応するCPUが限定さたり、そのCPUに対応しているかを明示しなければいけないはずです。せっかくインタプリタを作ったのに移植性を下げるようなことをしてしまったらもったいないでしょう?
最初のインタプリタであるLISPはどうなの?
LISPに詳しくないのでよくわかりません。機械語に変換していたのでしょうか? はるか昔のことで当時であれば特定のCPU固有の機械語を生成してもおかしくないと思っていますが、一般的なインタプリタの定義として「1行ずつ機械語に変換する」が正しいとは思えません。
機械語に変換するインタプリタもあると言えばある
どこで見かけたのか忘れましたが、機械語に変換してから実行するインタプリタもあるようです。インタプリタの定義として「ソースコードを1行ずつ機械語に変換する」が間違っていると言うだけで、1行ずつ機械語に変換するインタプリタが存在しないという意味ではありません。
さいごに
インタプリタは「ソースコードを1行ずつ機械語に変換する」という定義が正しいという根拠や、このようなガセネタはどこから生まれたのかという情報があればコメント下さい。