6

スタックベースの仮想マシンよりもレジスタベースの仮想マシンの方が優れているのはなぜですか?

具体的には、Parrot VM のドキュメントで、設計者はレジスタ マシンの利点を説明しています。

[...] 高水準言語の多くのプログラムは、ネストされた関数とメソッドの呼び出しで構成されており、中間結果を保持するためのレキシカル変数を使用する場合もあります。非 JIT 設定では、スタックベースの VM は同じオペランドを何度もポップしてからプッシュしますが、レジスターベースの VM は単純に適切な量のレジスターを割り当ててそれらを操作するため、操作量を大幅に削減できます。そしてCPU時間。

しかし、同じオペランドが何度もプッシュされるのはなぜですか?

4

1 に答える 1

7

言語設計で説明されているように、コンパイルや最適化を行わずにバイトコードごとにコードを実行するVMを説明しているようです。その場合、それは真実です。たとえば、次のようなコードを実行することを考えてみてください。

x = first(a,b,c)
y = second(a,b,c)
third(y,x)

レジスタベースのシステムでは、引数を期待される位置に配置するだけでよい場合があります(レジスタを使用して引数を渡すことができる場合)。すべてのレジスタが「グローバル」であり、関数ごとではない(または少なくともコールスタックをポップするときに復元される)場合は、との呼び出しの間に何もする必要がない可能性がありfirstますsecond

スタックベースのVMを使用している場合は、次のようになります(できればswap):

push a
push b
push c
call first
push a # pushing same arguments again
push b
push c
call second
swap
call third

また、同じ変数を再利用する数式を計算する場合は、次のようなことを行う必要があります。

push a
push b
add
push a
push c
add
add

代わりに(レジスタa、b、cがあり、bとcの内容を破棄できると仮定):

add b, a
add c, a
add b, c # result in b

aこれにより、最初のケースでは別のプッシュで実行する必要があった復元が回避されます。

繰り返しになりますが、私は例を推測しているだけです、多分それらは他のケースを意味していました...

于 2012-01-01T13:25:13.637 に答える