オブジェクトシステムの設計 - 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する可能性が有るので保留。