1122
昨晩はVM変換器を一応完成させました。関数からの戻りに不具合があって(最適化に失敗していた)ちょっと手間取りましたが。でも、次の章から使う標準ライブラリを含めたプログラムを変換してみたら、行数が$2^{15}$を超えたので、これはもうCPUエミュレイタでは実行できません。この先はVMエミュレイタでやるしかないのか……
と思ったけど、関数呼び出しとかを共通化してやればもっと短くできるかもと思ったので、今日はそれをやりました。そしたら43530行だったのが30565行まで縮んだので、やったー実行できるぞと思ったのだけど、実行してみたらなんだか動作がおかしいです。スタックポインタがメモリ領域を超えている(いわゆるスタック・オーヴァフローってやつだ!)ようなので、callかreturnのどちらかが壊れているのだと思うのですが、本に載ってるテストコードはちゃんと動いていたので謎です。元のプログラムはさすがに巨大でデバッグできないので、なんか自分でテストコード書かないとだめかなあ。あるいは元のプログラムをVMエミュレイタで確認するのもいいかも。
あとは「屍者の帝国」原作を読んでいます。三年前に初めて読んだときはまあ普通におもしろいなあとしか思ってなかったけど、いま読み返すと円城塔らしさがガンガン出ててめっちゃ楽しい。今夜読みおわると思う。あーでもVM変換器いじるのとどっちやろうか。そういえばVM変換器、末尾再帰最適化とかもしてみたいよね。再帰っていうか、あれでしょ、末尾の関数呼び出しでスタックそのままにしておくやつ。
明日もまだ休み。うれしい。