25

http://code.google.com/p/unladen-swallow/wiki/ProjectPlanから引用します:

「JITを使用すると、Pythonをスタックベースのマシンからレジスタマシンに移動することもできます。これにより、他の同様の言語でのパフォーマンスが向上することが示されています(Ierusalimschy et al、2005; Shi et al、2005)。」

大学では、再帰的プロシージャを使用する言語用の単純なコンパイラを構築しました。これにより、呼び出される各プロシージャのスタックフレームが維持され、再帰的に呼び出され、パラメータと戻り値が機能するようになります。

2つのこと:

1)上記の引用で使用されている用語を考えると、私が実装したものは「スタックベースのマシン」と見なされると考えるのは正しいですか?

2)ポイント(1)の私の仮定が正しかった場合、「レジスターマシン」はどのように機能しますか?つまり、スタックベースのマシンとどう違うのですか?

ありがとう!

4

6 に答える 6

24

レジスタマシンは、データを操作するときにメモリからデータを取得し、すばやく操作できる場所に配置して結果を返すハードウェアまたはソフトウェアユニットです。

たとえば、通常のCPUはレジスタマシンです。ALU(CPU内の数値を処理するユニット)は、レジスタ内の数値のみを処理できるためです。

スタックベースのマシンは、データをスタックに追加してから、データをスタックにポップまたはプッシュします。

たとえば、2つの数値を加算すると

Push 2 // Push 2 onto the stack
Push 3 // Push 3 onto the stack
Add // Add the top two things on the stack.

レジスターマシンにいるときは、このようになります。

Load x, r0 // Load x onto register 0
Load y, r1 // Load y onto register 1
Add r0, r1, r2 // Add 1 and 2 and store the result in register 2
于 2009-10-25T23:58:22.323 に答える
11

レジスターマシンにも、ほとんどの場合スタックがあります。

ただし、スタックマシンにアーキテクチャ上表示されるレジスタがあることはめったにないか、1つまたは2つしかない場合があります。

レジスタマシンにはいくつかのスタック操作があり、スタックアドレッシングモードさえある場合があります。

違いは方向性の1つです。レジスタマシンには、ほとんどの場合、レジスタを操作する命令があり、レジスタとスタックまたはメモリの間でロードおよび格納するためのいくつかの操作があります。

スタックマシン..そしてこれらは非常にまれです。実際のハードウェアデバイスは..その命令でスタック上で直接動作し、スタックとメモリの間でロードおよびストアするためのいくつかの操作があります。

さて、ハードウェアレジスタマシンがハードウェアスタックマシンよりも高速である理由は、ソフトウェア「スタック」マシンよりもソフトウェア「レジスタ」VMが高速である理由とはおそらく無関係です。

ソフトウェアVMの場合、実行する必要のある命令が少ないのは明らかです。これは、引用された論文の主張に従って経験的に決定されましたが、レジスタマシンで実行する必要のあるプッシュ、ポップ、交換などのオーバーヘッド命令がはるかに少なく、レジスタマシンがオペランドをまだ使用している場合は簡単に再利用できるためだと思いますロードやプッシュ操作を必要とせずに、レジスタファイル内に横たわっています。もちろん、それはすべて本当に単なる記憶です。それらは仮想レジスタです。

于 2009-10-26T00:22:01.590 に答える
5

レジスタマシンは、計算用の中間値を格納するために固定数のレジスタまたはバケットを使用します。たとえば、「add」命令は2つの特定のレジスタに値を追加し、その結果を別のレジスタに格納できます。

スタックベースのマシンは、計算中に中間値を格納するためにスタックを使用します。たとえば、2つの数値を追加するには、「追加」命令によってスタックから2つの値がポップされ、それらが追加され、結果がスタックにプッシュされます。

于 2009-10-25T23:59:02.253 に答える
4

1)上記の引用で使用されている用語を考えると、私が実装したものは「スタックベースのマシン」と見なされると考えるのは正しいですか?

あまり。ある種のスタックは、再帰関数呼び出しを実装するためのほとんど唯一の方法です。しかし、「スタックベースのマシン」は、スタックを介してすべてを実行する上でさらに進んでいます。関数呼び出しだけでなく、算術演算も。ある意味で、それらはすべてのマシン命令がスタックを介して処理される関数呼び出しであるかのように動作します。非常にシンプルなマシン設計になりますが、アセンブラ/マシンコードを書くのはかなり困難です。

2)ポイント(1)の私の仮定が正しかった場合、「レジスターマシン」はどのように機能しますか?つまり、スタックベースのマシンとどう違うのですか?

レジスタマシンには高速の内部ストレージ(レジスタ)があり、これらのレジスタのデータに対してほとんどの操作を実行します。レジスタとメインメモリ間でデータをコピーするための追加のマシン命令があります。

IIRCには、2種類のスタックマシンがあります。

  • アキュムレータマシンには「アキュムレータ」があります。これは基本的に、計算結果を保持する(また、オペランドを提供することもできる)単一のレジスタであり、ほとんどのマシン命令はアキュムレータで動作します。
  • 「純粋な」スタックマシンは、オペランドを消費した後、計算結果をスタックの一番上に置きます。
于 2009-10-26T00:21:59.047 に答える
2

コンパイラはマシンコードを生成しましたか?もしそうなら、そのターゲットはレジスターマシンでした(ほとんどすべてのCPU設計はレジスターマシンです)。

スタックマシンはすべての値をスタックに格納しますが、レジスタマシンには、(スタックマシンとは異なり)「アドレス」が変更されない固定数のストレージスロットがあります。

于 2009-10-26T00:02:41.100 に答える
2

レジスタマシンは、スタックの最上位での操作ではなく、名前付きレジスタのセットでの操作を参照してオペコードが定義される抽象マシンです。

レジスタマシンの場合:addは、3つのレジスタ名をオペランドとして取り、最初の2つの内容を追加し、結果を3番目に配置するように定義できます。(より一般的なのは、1つまたは2つだけの名前が付けられ、結果が常に特別なアキュムレータレジスタに格納される設計ですが、それは重要ではありません。)

スタックマシンの場合:addは、スタックから2つのオペランドをポップし、それらを追加して、結果をスタックにプッシュするように定義できます。

于 2009-10-25T23:58:21.507 に答える