私はコンパイラとインタプリタについて多くの説明をしました。コンパイラとインタプリタの違いははっきり理解できたと思います。次の例で私の学習を説明します。ファイルに3行のコードがあるとしましょう。
a=3;
b=4;
a=a+b;
私が理解していないのは、「プロセッサのALUのようなコンピューティングコンポーネントがなくても、インタプリタがコードの出力を生成するにはどうすればよいですか? "
私の理解では、プロセッサはそれだけを理解しているので、プログラムはマシンコードでプロセッサによって実行されるべきです。
または、インタプリタは、関数に対して実行する必要のあるマシンレベルの命令を高水準言語で格納し、その特定の関数がその高水準言語のコードで提供されるたびに、プロセッサにそれらのマシン命令を実行するように要求しますか?
インタプリタは、最も単純な形式で、最初に命令行を読み取り、それを解析して、より簡単に処理できる抽象構文ツリー(説明されている ここ など)のようなものを作成します。次に、処理が実行され、ASTの式と部分式が特定の順序で評価されます。
評価中、各terminal式は、インタープリタープログラム自体の内部の事前定義された関数にマップされ、インタープリターはその事前定義された関数を呼び出します。また、インタプリタプログラム自体がコンパイル済みプログラムであると仮定すると、その事前定義された関数は、CPUによって直接実行できるマシンコードの形式で存在します。
したがって、インタプリタは、関数に対して実行する必要のあるマシンレベルの命令を保存しません。ただし、事前にコンパイル済みの基本式の関数が含まれています。
または、インタプリタは、関数に対して実行する必要のあるマシンレベルの命令を高級言語で保存し、プロセッサにそれらのマシン命令を実行するように要求しますか...
それ。多かれ少なかれ。
「プロセッサのALUのようなコンピューティングコンポーネントがなくても、インタプリタはどのようにしてコードの出力を生成できますか?」
CPU内で定義され、コンパイラー作成者が実行可能命令を生成するために使用する、事前定義された実行可能マシン命令のセットを使用する。 ALUはこれらの命令を解釈します。プログラムはALUを直接操作しません。
これが例です。 Cコンパイラを介して実行すると、Cプログラム
int main() {
printf("Hello World!");
return 0;
}
機械の指示に翻訳されます:
LC0:
.string "Hello World!"
.text
.globl main
.type main, @function
main:
Push ebp
mov ebp, esp
and esp, -16
sub esp, 16
mov eax, OFFSET FLAT:.LC0
mov DWORD PTR [esp], eax
call printf
mov eax, 0
leave
ret
次に、関数printf
は、独自の命令セットにコンパイルされます。
さて、これを行うwayは、特定のコンパイラに固有です。コンパイラーまたはインタープリターの作成に関連する技法は非常に多様であり、多くの分野が関係しており、その主題は多数の教科書に記載されています。ただし、基本的な原則は同じです。人間が読める言語から始めて、いくつかの手順を実行し、最終的にはマシンで実行可能なコードに到達します。