SECDV Schemeの復習
常識的なサイズで移植性が高い処理系が欲しいので昔作っていたSECDV SchemeをCに移植できないか考えてみることにした。
処理系依存の無いSchemeヒープ実装にごく小さなVM(仮想マシン)を載せてScheme処理系として成立させるのを基本方針にする。 ...実は処理系依存のないヒープ実装をちゃんとやっているものは珍しい。 ポインタ演算無しでヒープを実装しても非効率過ぎる ため。
整数ヒープ
一般的なScheme実装では、C言語的なポインタの下位2〜3bitが空いていることを利用してそこにタグを入れている。ただ、基本的にC言語のポインタが整数と互換であることは特に規定がないので、これを一切の仮定なしで実装することはできない。
というわけで、ポインタの代わりに int32_t
の32bitを切りくずす形でヒープを表現する。
ヒープは Zone0
(JavaScriptで言うところの true
とか false
のような特殊オブジェクト) Symbol
Primitive
Char
Fixnum
String
Flonum
Bytevector
Simple-struct
Vector
(= array) vmclosure
(= function) Pair
を扱える ...って Integer
(= BigInt)が無いじゃん。。潰すとしたら Bytevector
(= Buffer)かなぁ。。どうせポインタ種別とサイズのために1ワード余計に必要だし。。
いわゆるMark & Sweepをどう実装するのかはまだ考えていない。まぁ普通に再帰探索で良いんじゃないかなという気はしている。パフォーマンスを気にするようなもんでもないし。。
SECDV VM
SECDV VMは多値を直接扱えるVMでVMの命令数を極力絞りつつ常識的なパフォーマンスを目指して設計している。
伝統的なScheme仮想機械と違うのは多値をベクタやリストの形で格納する V
レジスタと、レジスタに格納されているデータの型を保持する Link
レジスタを持つ点にある。