Open4
Ribbon: ヒープ表現の整理

C++移植前の最後の仕上げということでヒープ表現を整理しておく。当初はC++実装に寄せる意味で全てのオブジェクトをrib内でタグ付けしていた。
これらのなかで、stringとbytevectorは厳密にはwrapする(ribに格納する)必要性は無いので後で外せるように準備しておく。
また、コンパイラとScheme実装されたVMがいちいちシリアライズしないとVM命令列をやりとりできないのはちょっと微妙いので修正したい。

ribに直接アクセスしないようにする
... 今気付いたけど、これやっちゃうとコンパイルしたコードがVM内のプログラムからはSchemeオブジェクトに見えなくなるから、何らかの方法で対策する必要があるな。。さもなくば、VM内からコンパイルした結果をシリアライズできなくなってしまう。
const
命令をlambda(ribを引数にする)とそうでない普通のScheme定数に分けるしかなさそうだな。。

VM命令をシリアライズしないようにする
ひとまず、VMから compile-program
手続きで作成したプログラムはホストSchemeオブジェクトとして直接生成されるようになった。
これにより、 eval
中にプログラムをシリアライズ/デシリアライズする必要がなくなったので、evalのテストやVMのブートストラップが高速化した。
...といってもまだ4分掛かってるけど。。
real 3m48.400s
user 4m2.170s
sys 0m2.889s
C++で書き直して10倍高速化したとしても16秒掛かるのか。。

const
命令を lambda
用のと定数用に分離
constop
命令を追加して、 lambda
に使われる const
(ribな定数をpushする) と quote
で使われる constobj
に分離した。
これでVM命令ストリームの rib と vector を区別することができるようになった。