データ型の定義

現在rowlVMにGCを実装中です。型のない言語で書いているのもあって、コードは汚くなってきましたがこのままいきます。
実装するGCは速度が気になりますが、とりあえずはMostly Copying GCで行こうと思います。下を参考にして、自分なりに修正をして実装します。
Compacting Garbage Collection with Ambiguous Roots
メモリの無駄遣いが嫌いなので非ボックス化型を積極的に使い、出来るだけヘッダを小さくすることを考えます。

現在の案

  • 非ボックス化型
    • bool (内部的には4バイト整数)
    • char (1バイト整数)
    • short (2バイト整数) # いらないかも
    • int (4バイト整数)
    • long (8バイト整数)
    • float (単精度浮動小数点数)
    • double (倍精度浮動小数点数)
    • ポインタ型
  • ボックス化型
    • ワード境界でアラインする。従ってアドレスの下位2bitは0。ここをフラグとして利用する。
      • 00 : 単純型
      • 01 : リスト型 (consセル)
      • 10 : タプル型
      • 11 : 配列型
  • 単純型
    • ボックス化型をフィールドとして持たない型。GC時に再帰的にtraverseする必要のない型。
    • nil(==0),ボックス化非ボックス化型,ビット配列,文字列,整数配列,浮動小数点数配列,etc.
    • 1ワードのヘッダ (== オブジェクトのワード数)
  • リスト型
    • car/cdrの2フィールド。ヘッダは無し。
  • タプル型
    • Cでいう構造体の様なもの。ただし、メモリ上でのフィールドの連続性は保証しない(というかコンパイラが勝手に並び変える)。これは解析・最適化に貢献するはず。
    • フィールドの前半にボックス化型、後半に非ボックス化型を配置。ここはユーザが意識しなくていいようにコンパイラがケア。
    • 1ワードのヘッダ
      • 下位16bit : オブジェクトのワード数 (従ってタプルオブジェクトの最大サイズ = 256Kbyte)
      • 上位16bit : ボックス化型のフィールドの個数
  • 配列型
    • ボックス化型を要素とする配列。
    • 1ワードのヘッダ (= 要素数)

GC時にオブジェクトがコピーされた場合はメモリの先頭1ワードにforward pointerを格納します。
オブジェクトがコピーされた化どうかの判定は、アドレスからオブジェクトが属するページを割り出し、ページデスクリプタのフラグを読むことにより行います。