2012-01-01 16 views
6

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

具体的には、the Parrot VM's documentで、設計者がレジスタマシンのメリットを説明しています

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

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

+0

...多分、彼らは他のいくつかのケースを意味し、[スタック対レジスタ]の可能な複製を例に推測していますhttp://stackoverflow.com/questions/164143/registers- vs-stacks) –

答えて

7

コンパイルや最適化をしないで、バイトコードごとに言語デザインに記述されているコードを実行するVMを記述しているようです。その場合は真です。レジスタベースのシステムでは

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

(レジスタは引数を渡すために使用することができた場合)、あなたは、単に彼らが期待しているものは何でも位置で引数を置くことができるかもしれない。例えば、このような何かをやってコードを考えてみて。すべてのレジスタが機能ごとではなく(または呼び出しスタックをポップするときに少なくとも復元された)「グローバル」である場合、firstsecondの呼び出しの間に何もする必要はないかもしれません。あなたは、スタックベースの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の内容が破壊されることが仮定):

このような何かをする必要がある場合があります3210

これは、最初のケースで別のプッシュで実行する必要があるaの復元を回避します。

はその後、再び、私はちょうど(

関連する問題