bootstrap Lisp

今まで、言語・CPU環境のブートストラップにはForthを使ってきた。端的に言えばForthの実装はアセンブラで直ぐ作れるからだ。別にBASICをアセンブラで実装することがそれほど難しいこととは思わないが、BASICは演算器として使うのは優秀でも、コンパイラを上手いこと作るのには向いていない。Forthは数百〜数千ステップ - それこそDSPのローカルストアに収まるくらい - で実装できる。TCP/IPのようなプロトコルアセンブラで書く意義は有るが、シェルスクリプトで書きたくなるようなバッチ処理も存在し、そのために理解しやすい言語が存在することには大きな意義がある。
今はメモリが大量に有るので、ブートストラップにLisp(Scheme)を使えないかと考える。
メモリの32bitワードを、数値としての16bitと、タグとしての16bitに分割する。本来はそんなに要らないが、

+----------+----------+
|16bit(CAR)|16bit(CDR)|
+----------+----------+

32bit CPUで32bitの値を使いたがるのは、実装を難しくする。
このような、C言語風に言うと、ポインタ+(ポインタあるいは値)というペア(consセル)さえ取り扱えれば、ツリーやリストの処理には事欠かない(遅いが)*1
この手の話というと純Lispが有る。6つほどの基本関数とlambda、condのような特殊形式によってLispを作るというコース。

これは現実的な使用にはあまり適さない。足し算や引き算は絶対に必要で、場合によっては文字列を分離する必要があるかも知れない。
有力な折衷案はSchemeコードをバイトコードに変換し、そのインタプリタを作ることで、このアイデアのほうが論理的に思える。しかし、スタックマシンを作るのと、スタックとconsセルを装備した評価器を作るのとどっちが楽(で教育的なのか)は両方試してみる必要があるだろう。

*1:そのためにCDR-codingのような手法もある