web-dev-qa-db-ja.com

プロセッサのALUのようなコンピューティングコンポーネントがなくても、インタプリタはどのようにしてコードの出力を生成できますか?

私はコンパイラとインタプリタについて多くの説明をしました。コンパイラとインタプリタの違いははっきり理解できたと思います。次の例で私の学習を説明します。ファイルに3行のコードがあるとしましょう。

a=3;
b=4;
a=a+b;
  1. コンパイラはこれらの3行をマシンコード(または現在の言語よりも低い言語)に変換し、プロセッサ(マシンコードの場合)はそれを実行して出力を生成します。
  2. インタプリタは、最初にa = 3を処理し、言語仕様に従って出力を生成するため、各行を通過します。次に、次の行に移動して同じことを行います。

私が理解していないのは、「プロセッサのALUのようなコンピューティングコンポーネントがなくても、インタプリタがコードの出力を生成するにはどうすればよいですか? "

私の理解では、プロセッサはそれだけを理解しているので、プログラムはマシンコードでプロセッサによって実行されるべきです。

または、インタプリタは、関数に対して実行する必要のあるマシンレベルの命令を高水準言語で格納し、その特定の関数がその高水準言語のコードで提供されるたびに、プロセッサにそれらのマシン命令を実行するように要求しますか?

1
AV94

インタプリタは、最も単純な形式で、最初に命令行を読み取り、それを解析して、より簡単に処理できる抽象構文ツリー(説明されている ここ など)のようなものを作成します。次に、処理が実行され、ASTの式と部分式が特定の順序で評価されます。

評価中、各terminal式は、インタープリタープログラム自体の内部の事前定義された関数にマップされ、インタープリターはその事前定義された関数を呼び出します。また、インタプリタプログラム自体がコンパイル済みプログラムであると仮定すると、その事前定義された関数は、CPUによって直接実行できるマシンコードの形式で存在します。

したがって、インタプリタは、関数に対して実行する必要のあるマシンレベルの命令を保存しません。ただし、事前にコンパイル済みの基本式の関数が含まれています。

3
Doc Brown

または、インタプリタは、関数に対して実行する必要のあるマシンレベルの命令を高級言語で保存し、プロセッサにそれらのマシン命令を実行するように要求しますか...

それ。多かれ少なかれ。

「プロセッサの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は、特定のコンパイラに固有です。コンパイラーまたはインタープリターの作成に関連する技法は非常に多様であり、多くの分野が関係しており、その主題は多数の教科書に記載されています。ただし、基本的な原則は同じです。人間が読める言語から始めて、いくつかの手順を実行し、最終的にはマシンで実行可能なコードに到達します。

2
Robert Harvey