コンパイルや最適化をしないで、バイトコードごとに言語デザインに記述されているコードを実行する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の内容が破壊されることが仮定):
このような何かをする必要がある場合があります3210
これは、最初のケースで別のプッシュで実行する必要があるa
の復元を回避します。
はその後、再び、私はちょうど(
...多分、彼らは他のいくつかのケースを意味し、[スタック対レジスタ]の可能な複製を例に推測していますhttp://stackoverflow.com/questions/164143/registers- vs-stacks) –