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

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

私に教えられることなら

3imp 3章 The Heap-Based Model読んだ

現在、AmeLispのVMお気楽 Scheme プログラミング入門LispKit Lisp - Qiitaを参考にしてSECDマシンで作っている。

Schemeアセンブリ、C、で書いてそろそろSECDマシン飽きてきたのと、いろいろなVMの実装を知って選択肢を広げておきたい、ということでまずThree Implementation Models for Scheme、通称3impを読むことにした。

まず3章のHeap Based Model。上記のSECDマシンとあんまり変わらないので流し読みした。違いは、aレジスタとrレジスタが分かれていること、コード(SECDのC、xレジスタ)が線形か入れ子かぐらい。

aとrをわざわざ分けるのはなんでだろう、1つにすればレジスタ一個減ってシンプルなんじゃ?と思ってたんだけど、引数を後ろから評価して、argument命令でrレジスタにconsしていくことで、SECDマシンのARGS命令のコストを削減できるということがわかった。

でもSECDマシンでも後ろから評価するようにすれば、Sレジスタがそのまま(関数 . 引数リスト)になるかな?試してみよう。

aレジスタが分かれている方が、最後の結果をスタックではなくaレジスタに置く分、Cons回数が減ってやや速度的に有利、かな。一方argument命令が無い分メモリ的に有利になるかもしれない。それもPOPと釣り合うか?時間見つけて比べてみたい。

感想

わかりやすいしスッキリまとまってると思うんだけど、SECDマシン何度も実装して頭にイメージあるからで、経験無しだったら理解できたかどうか怪しい。英語読むのがまだ苦手なせいか、説明が難しいかはわからないけど。次の4章が目的なので、理解するための準備したほうがいいかもしれない。

それから、3impで検索して出てきた3impを読みながらわかったことを書いてく - 標高+1m誰得UNIX: 3imp 読書メモ(1)などの読書メモ、前見たときは全くわからなかった(当たり前)なんだけど、今見るとよくわかるので嬉しい。レベルが上がったのを実感している。

広告を非表示にする