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

3impの3章を読みました。

3impの3章は、schemeのheap型VMとそのコンパイラの実装について書かれている。
コードを見てだいたい分かったので文のほうはさらっとしか読んでないけど。

vm用コードもs式
レジスタは、a,x,e,r,sの5つで、それぞれ(アキュムレータ(返り値とか次のコードで使うための一時保存領域?)、次に実行するコード、引数の一時置き場、コールスタック)
・aとrを統合してもいいのではないか?
・構文は、if、lambda、set!,quoteをサポートしている(いくつか機能は省かれている)
・call/ccもある。
・ただしVM上に継続の補足と呼び出しを実装しているので、手続きではない。
レジスタと次に実行するコードをまとめてオブジェクトにするという形で実現している。

ちょっと拡張

pythonで実装して、lambdaのbodyが2つ以上の式でも動くように拡張した。
コンパイラに手を加える。
FRAME命令をつなげてできそう。

・FRAMEについて

(FRAME A B)

・B実行後Aを実行する。
・aレジスタはB実行時のものを、それ以外はFRAME実行時のを
・BからAにつなげるためBにはRETURNが含まれている必要あり。

以上をふまえて

            c = ["RETURN"]
            for b in  bodies:
                bi = compiler(b,["RETURN"])
                if (c[0] == "RETURN"):
                    c = bi
                else:
                    c = ["FRAME",bi,c]
            compiled_body = c