Toy VM (9)

細々と進めていた内容をまとめよう。

SECD マシンから処理系のリストを取り常に動くものを改良していこう、という形で進めてきた。が、今となっては進め方は逆にすべきだったかもしれない。
つまり、タグ付きポインタで自前のリストを実装し、そのうえに SECD マシンを作るというやり方のほうが、シンプルで良かったかもしれないのだ。

さて、反省は反省として現状を書いておこう。

  • メモリは make-array で保持するようになった。signed-byte 32 のワードの配列だ。これで処理系のコンシングは(コンパイル時をのぞけば)0になった。
  • vm 命令はDUM,RAP 以外は実装済み。vm に対するconsをconsと書けるようになったので、見た目はschemeで書いたのと変わらない。
;; ビルトインのvm命令+ の定義。
(def-insn + (vm)
  (with-accessors ((sp sp-of)) vm
    (let* ((a (car sp))
           (b (car (cdr sp)))
           (res (+ a b)))
      (setf sp (cons res (cdr (cdr sp)))))))

今後の方針を書いておこう。

  • まず gc を動くようにして、 fib 20 あたりが少ないメモリでも計算できるようにする。難易度B
  • DUM, RAP を実装する。テストを書く。難易度C
  • LispMe にならって、L2V, VREF, VSET, VLEN のベクトル命令を実装する。難易度B
  • make-vector, vector, などを実装する。難易度B
  • プログラムの配列とメモリの配列を一緒にする。ベクトル命令を使う。難易度A
  • リストの環境、ダンプをベクトルに変更する。難易度A
  • レジスタ付きvm と命令列を別途設計する。難易度B