C++ で VM 実装中 - Scheme VM を書く
Gauche を利用してコンパイラが結果を write し、C++ の VM が読み込む。
簡単な命令を実行するというフローを作った。
初期の段階ではあっちを立てればこちらが立たずといったような窮屈な思いをするが、少しずつ世界が広がって行くのが楽しいね。
今は完全に実装(移植)フェーズでほとんど考えることがないのである面では楽かもしれない。
Scheme の世界で閉じこもっていた時には気づかなかった、コンパイラと VM の密結合などに気づき反省中。
そういえば Gauche.Night のときに shiro さんが write 時に外部表現がないものを write しようとしていたら例外を出したいというようなことをおっしゃっていたのですが、確かにその方がありがたいかもという状況に今日出くわしました。(hash-tableをwriteしてしばらく気づかなかった)
当然のように ToDo が増えている罠。
- ■Fixnum, String, Symbol, Vector などのデータ型を実装
- ■コンパイラが Gauche 上で動くためコンパイル済みコードを気軽に読み込める仕組みが必要
- ■read の実装(この時点では port の実装は手抜きで良い)
- ■read して VM ループ実行する仕組みを実装
- ■ファイルに書かれたS式をコンパイルしてファイルに書く
- ■instruction は数字に置換する。
- ■読み込む
- ■例のテストファイルを実行できるようにする
- □VM ループを作成
- □主要な基礎命令の動作を単体で確認
- ■define global に使う hash map どうしよ。-> std::map
- ■ライブラリ名をシンボルに変換しよう
- □free variable 参照が必要。
- □どういう構造が VM にやさしくきれいな設計か?
- □closure を実装
- ■closure クラスを定義
- ■makeCprocedure
- □outerクロージャを生成するようなスクリプトを作成
- □library をロードする
- ■library をコンパイルする
- ■library のコンパイル結果に write できないものがあるぞ
- ■hash-table だ
- ■何に使っているの?
- ■ライブラリのマクロを保持している
- ■そもそもコンパイラとVMが完全に切れていないっぽいな。
- ■あーでもこの場合マクロのコンパイル結果は VM に引き渡さないとしょうがないのか。
- ■hash-table をやめて acons にしよう。
- □各 hash-table の出自を明らかにしわかりやすい名前にしよう ←いまここ
- □library インストラクションをつくろう
- □display が必要
- □型チェックどこでやる?
- □主要な基礎命令の動作を単体で確認
- □write/display などを考慮した port の実装
- □主要な手続きの実装
- □コンパイラが VM で動くようになる(つまりGaucheの助けがいらなくなる)
- □正規表現の実装(鬼車)
- □Bignum の実装(ライブラリの移植かな?)
- □プロファイル/最適化
- □Wikiが動くようになる
- □0.0.1 をリリース