Open3

SECDV Schemeの復習

okuokuokuoku

常識的なサイズで移植性が高い処理系が欲しいので昔作っていたSECDV SchemeをCに移植できないか考えてみることにした。

処理系依存の無いSchemeヒープ実装にごく小さなVM(仮想マシン)を載せてScheme処理系として成立させるのを基本方針にする。 ...実は処理系依存のないヒープ実装をちゃんとやっているものは珍しい。 ポインタ演算無しでヒープを実装しても非効率過ぎる ため。

okuokuokuoku

整数ヒープ

一般的な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をどう実装するのかはまだ考えていない。まぁ普通に再帰探索で良いんじゃないかなという気はしている。パフォーマンスを気にするようなもんでもないし。。

okuokuokuoku

SECDV VM

SECDV VMは多値を直接扱えるVMでVMの命令数を極力絞りつつ常識的なパフォーマンスを目指して設計している。

伝統的なScheme仮想機械と違うのは多値をベクタやリストの形で格納する V レジスタと、レジスタに格納されているデータの型を保持する Link レジスタを持つ点にある。