> {"push_int_4byte", "i", 1}, // 直接持に変更
> {"push_double_8byte", "d", 1}, // 直接持に変更
要点は、文字列以外はコンスタントプールを使わずに、直接定数を
バイトコードの中に埋め込むようにした、ということですよね。
Diksamは、JVMを真似したのと、将来的にバイトコードをファイルに
吐き出すことを考えてコンスタントプールを持ちましたが、
たとえばYARVでは、効率を考えて定数をバイトコード(ていうかこれも
効率を考えてバイトコードではなくワードコード)中に埋め込んでいるそうです。
http://www.atdot.net/yarv/yarvarch.ja.html
> {"push_sysval_int", "s", 1}, // システムグローバル変数アクセス用
> {"push_sysval_double", "s", 1}, //
> {"push_sysval_str", "s", 1}, //
> {"pop_sysval_int", "s", -1}, //
> {"pop_sysval_double", "s", -1}, //
> {"pop_sysval_str", "s", -1}, //
あと、もしシステムグローバル変数がDVM_Valueを保持しているのなら、
実はpush_sysval_intやpush_sysval_doubleのようにインストラクションを
型ごとに分ける必要はありません。
Diksamの場合、スタックはDVM_Valueの配列のくせにこのインストラクションを
分けているのは、将来的にint型ローカル変数は4バイトしか消費しないようにする、
といった改善を入れるときのためです。