言語設計で説明されているように、コンパイルや最適化を行わずにバイトコードごとにコードを実行する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
これにより、最初のケースでは別のプッシュで実行する必要があった復元が回避されます。
繰り返しになりますが、私は例を推測しているだけです、多分それらは他のケースを意味していました...