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

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

私に教えられることなら

AmeLisp開発日誌

asm lisp

GitHubリポジトリ

アセンブリでLISP開発日誌(完)の最後に書いた目標3つのうち

  1. VM/Aに継続、限定継続を実装する(VM/S上で動いてるのでたぶん大丈夫)
  2. Copying GCに切り替えて文字列・配列・バイト配列を扱えるようにする
  3. Windowsで動かす

1はその後実装できた。3は今ちょっとどうでもよくなってきた。で、2はかなりVMに変更入れなきゃいけないので、前のをv1、今回からv2として分けることにした。最初はC言語で書いてたんだけど、ビットフィールド・共用体・構造体の組み合わせで完全に意味不明になったので全部消してアセンブリに逃げ帰った。Cはまた今度……

v1はほぼ1ファイルに書いてて、3000行近くのアセンブリコードでだいぶん見通しが悪くなっていたのでファイルも分けた。また、ユニットテストも自動で実行できるようにした。ファイルを保存したら自動ビルド→テストのおかげでかなり開発のサイクルが速くなって、とりあえずCopying GC部分は実装できた、と思う。(GCについて「もう大丈夫だ!」と安心できる日は来るんだろうか……)

  1. AmeLispの上でS式アセンブリ→nasmトランスレータを書く
  2. アセンブラ自体も書く
  3. C言語のS式サブセットみたいなのを書く

というのを目標としてたんだけど、v1ではGCされるConsセルと作りっぱなしのシンボルしか無くて、ちょっと面倒だったので文字列の実装は急務だった。多分できたので今回から取り組めるんじゃないかと思う。

あとはv1のSECDマシン部分を再実装するだけなので簡単なはず。

それからいろいろと考えてることがあって

  • シンボルのGCを行いたいが、WeakPointerはどう実装すればいいんだろう。単純にCopy終了後に走査して書き換えていく場合、リンクリスト等でWeakPointerを記憶しておくなら空間効率が、メモリ全て走査するなら時間効率が悪くなる。
  • 単純なSECDマシンなので環境をそのままConsリストとして持ってるから、辿るのがかなり遅い。O(1)でアクセスする方法無いんだろうか
  • スタックも毎回ConsしてGCなので、保持する必要のない環境をそのままpopできるやり方が知りたい
  • フルの継続はサポートする必要無い気がする。例外処理はトップレベルからの部分継続で、後のアプリケーションで使う継続もだいたい本当に欲しいものは部分継続なんじゃなかろうか。また、部分継続もCPS変換でやってしまえば、lambdaに対する最適化を全てに適用できてお得では

などなど。3impとか、最近翻訳されたGCの本読めば載ってるだろうか。最後のについてはどう考えればいいんだろ。後方互換性維持するつもりないから必要無いと思ったときにさっさと切ればいいんだけど、なんとなく、いらないかもしれないものがずっとあると気持ち悪い。

広告を非表示にする