小さくできるのか

追記 : 恥ずかしい数え間違い。言い訳しておくと、以前作ったSchemeからデザインを流用してるのでそれと混ざって困ったことになっている。
http://optimize.ath.cx/pic24usb/
オプティマイズからPIC24ボードがでていて、これに適合できる位のマイクロプロファイルを作ることは技術的に興味深い。

制限

マイコンにyuniSchemeを組み込む上ではそれなりの制限がある。

この手のマイコンは、プログラム領域とデータ領域がメモリ空間的に独立している。PIC24(やdsPIC)は特殊な命令や、一種のメモリバンク機能でプログラム領域のデータをロードすることが出来るが、データ領域を実行することは出来ない。
もちろんプログラム領域はフラッシュメモリ(またはROM)なので、プログラムを生成して実行するというアプローチを取ることは出来ない。

  • RAM

RAMは16KBしかない。(このボードの場合)
PIC24は16bit*1 CPUなので、8Kワードということになる。
ワードは2ワードを1単位として以下のように使うことにする。

★ Pair (a b) 15 + 15 bits
+-----------------+-----------------+
|0aaaaaaa aaaaaaaa|Mbbbbbbb bbbbbbbb|
+-----------------+-----------------+

★ Atom 27bits
+-----------------+-----------------+
|1MTTTaaa aaaaaaaa|aaaaaaaa aaaaaaaa|
+-----------------+-----------------+

★ Vector Head 15bits
+-----------------+-----------------+
|1M001ttt tttttttt|Xaaaaaaa aaaaaaaa|
+-----------------+-----------------+

これを4K個保持できることになる。シフトを省略するためにタグビットを下位に置くといった工夫が必要になるだろう。型はvector headにだけ任意に付ける。
Mark & Sweepのために、対にはマークビットがある。pairだけはマークビットが微妙な位置にある。
Atomの型は(Vector Headを含めて)8個しか持てない。

  • 0 : null(0bit effective)
  • 1 : Vector Head(23bit effective)
  • 2 : Fixnum(24bit effective)
  • 3 : Fixnum(24bit effective)
  • 4 : CHAR(16bit effective)
  • 5 : Closure(23bit effective)
  • 6 : Symbol(23bit effective)
  • 7 : ???

Atomの余裕は1つしかない。本来Vector Headとnullは統合しても構わないので、Atomの型はあと2つ導入できることになる。Fixnumは24bit確保する要求があるので一つ型ビットを切り崩している。数え間違えてた。
Vectorの型はかなり余裕がある。これは自前のVector型を大量に定義して、通常間接参照で済まされるようようなオブジェクトも可能な限り直接参照に変換することを意図している。例えばCDR CODEDなリストはメモリ消費を抑えるのに活用できるだろう。

*1:24はインストラクションの長さを表す。