オブジェクトシステムの設計 - Immediateの設計

とりあえず、即値オブジェクト(immediate)から設計を始める。immediateは、CPUのワードサイズで表現できるオブジェクトで、schemeでは

  • 数値(fixnum)
  • 文字(char)
  • pair、vector等のオブジェクトへのポインタ

あたりのオブジェクトが相当する。これらはGCにスキャンはされるが、GCによって開放されることは無い。
64bitワードを採用するシステムの場合、

XXXX XXXX XXXX XXXX : XXXX XXXX XXXX XXXX : XXXX XXXX XXXX XXXX : XXXX XXXX XXXX XXX1   (non-fixnum)
NNNN NNNN NNNN NNNN : NNNN NNNN NNNN NNNN : NNNN NNNN NNNN NNNN : NNNN NNNN NNNN 0111   Zone0
iiii iiii iiii iiii : iiii iiii iiii iiii : iiii iiii iiii iiii : iiii iiii NNNN 1111   Zone1
pppp pppp pppp pppp : pppp pppp pppp pppp : pppp pppp pppp pppp : pppp pppp pppp p001   object
iiii iiii iiii iiii : iiii iiii iiii iiii : iiii iiii iiii iiii : iiii iiii iiii iii0   Integer Fixnum

のように割り当てることにした。
Fixnumは31bitまたは63bitの符号付き整数で、最下位ビットにはゼロを採用してみる。ポインタは8の倍数として1を足す。
その他の即値オブジェクトはZone0かZone1のどちらかに分類される。どちらもGCから見るとただの整数または整数のペアであり、これに意味づけをするのはオブジェクトシステムを使うVM側になる。

処理系での解釈

Zone0は単純な整数のみが使用可能で、値によってオブジェクトを識別する。この配列はypsilonからとって:

  • 1 : #t (真)
  • 2 : #f (偽)
  • 3 : Nil (空リスト)
  • 4 : undefined
  • 5 : unspecified
  • 6 : eof

と意味付けることにした。
Zone1は整数のペア(i,N)で、短い方のNで値のクラスを指定する。Zone1のクラスは16個持てるが慎重に選択する価値がある。。また32bitプラットフォームではiは24bitしか無いので、入れるデータに制限が出てくる。

  • 1 : char (文字。Unicode文字を格納する。UCS-4は31bitの空間を持つが、Unicodeが21bitの空間しか持たないためこのような形で格納できる。)
  • 2 : IEEE 754-2008のbinary16浮動小数点数(half float)
  • 3 : IEEE 754のbinary32浮動小数点数(single float) - 32bitプラットフォームでは使用できない

...という割にchar以外に実質的な利用者が居ないという寂しい面もある。
half/singleは最初の実装ではサポートしない。その場合常にヒープに確保される。
floatをimmediateにするかは絶妙なところで、とくにhalfは有効なユースケースがほとんどない。(OpenCLプログラムに引き渡すためにreadをhalf/single精度で行うオプションを用意する予定で、そこだけで使う。)
Zone1の一部をgensymされたシンボルに使うことも考えている。ただ、うまいメタデータの埋め込み法が思い当たらないのと、32bitプラットフォームだとwrapする可能性が有るので保留。