データ型の定義
現在rowlVMにGCを実装中です。型のない言語で書いているのもあって、コードは汚くなってきましたがこのままいきます。
実装するGCは速度が気になりますが、とりあえずはMostly Copying GCで行こうと思います。下を参考にして、自分なりに修正をして実装します。
Compacting Garbage Collection with Ambiguous Roots
メモリの無駄遣いが嫌いなので非ボックス化型を積極的に使い、出来るだけヘッダを小さくすることを考えます。
現在の案
- 非ボックス化型
- ボックス化型
- ワード境界でアラインする。従ってアドレスの下位2bitは0。ここをフラグとして利用する。
- 00 : 単純型
- 01 : リスト型 (consセル)
- 10 : タプル型
- 11 : 配列型
- ワード境界でアラインする。従ってアドレスの下位2bitは0。ここをフラグとして利用する。
- 単純型
- リスト型
- car/cdrの2フィールド。ヘッダは無し。
- タプル型
- 配列型
- ボックス化型を要素とする配列。
- 1ワードのヘッダ (= 要素数)
GC時にオブジェクトがコピーされた場合はメモリの先頭1ワードにforward pointerを格納します。
オブジェクトがコピーされた化どうかの判定は、アドレスからオブジェクトが属するページを割り出し、ページデスクリプタのフラグを読むことにより行います。