09/05/28 23:20:44 czz930Bl
密度についてはその通り
命令数は増えるが、命令長が短いのでトータルでは密度が上がる
インタプリタの実装では、スタックトップはメモリではなくレジスタに置ける
スタックが空の時にスタックを参照する命令を実行するとエラーだが、
これはバイトコード検証であらかじめはじいてあるのでノーチェックで良い
一工夫すればスタックの上2段をレジスタにキャッシュすることもできる
load x
load y
add
というシーケンスを考える
最初のload命令でレジスタAに値をキャッシュする
次のload命令では別のレジスタBにキャッシュしたい。どうすればいいか?
最初のload命令の実行後、スタックレベルに応じてインタプリタを切り替えればよい!
つまり、別のインタプリタループのloadルーチンを実行し、そこでレジスタBにキャッシュする
addルーチンは加算結果をレジスタAに置き「スタックレベル=1」のインタプリタに戻る
add命令はオペランドを二つ使うため、「スタックレベル=2」のインタプリタにだけ実装すればよい
インタプリタの切り替えは、ただの状態遷移なのでオーバーヘッドは皆無である