読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

アセンブリでSECD machine LISP 開発日誌

振り返りに書いたように、アセンブリ(NASM/Linux64bit)での実装に挑戦してた。

github.com

ようやくVMインストラクションのREPLが動いたので記録。

方針は

  • とにかくシンプルに作る
  • かっこいいことはまた今度にする

です。

今のところ

  • 8bit下位タグ付きポインタ
  • 48it整数、シンボル、リスト、nilのみ
  • (Cons)CellのみMark&SweepGC
  • シンボルはシンボル名の文字列テーブル(長さ付き)と、シンボル値とシンボル名を記録するシンボルテーブルで管理
  • シンボルGCはなし
  • 角カッコ([])もカッコとして扱う

という設計。

ようやくRead/Printまで出来て、VM LOOPに取り掛かれたのでLDC命令とSTOPEXITを追加して遊んでた。楽しい。

以下のログのように動いている。

Free cells: 
65533 
vm> (LDC 1 STOP)
1
vm> (LDC [S (EXP . RESSION)] STOP)
(S (EXP . RESSION))
vm> (  LDC  'foo  STOP  )
(quote foo)
vm> (EXIT)

このあとはVMインストラクションを整備(これはSchemeでやった)しつつ、Scheme側のVMLISPコンパイラを書き、コンパイラコンパイルしてAssemblyVMの方に持ってきたい。さすがにアセンブリコンパイラ書く気力は無い。

1つのasmファイルで1600行ほどなので、そろそろ分割しようと思ったら、なんかラベル名大文字で始まるとダメっぽい??そんな……

広告を非表示にする