`
yangdong
  • 浏览: 65191 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

完全由不变体写出来的 Register Machine Simulator

 
阅读更多
SICP 第二版 5.2 节提到的 Register Machine Simulator 我用 Clojure 重写了一遍,完全不用 mutable states。每执行一条指令都可以打出当时机器的状态,甚至可以把这些状态保存起来。这就是 Clojure 牛逼的地方……

程序里的模型跟书上不太一样,为了方便对时间的管理(也就是为了用不变体搞定原本需要可变体搞定的事)。Machine 只包含寄存器和栈。操作集和解析过的指令都不作为 Machine 的一部分。因为它们在程序运行过程中是不会变的。

比较有意思的是指令的初始化过程。原本书的指令(instructions/controller)是可变体。先扫一圈,把 label 扫出来,然后后续在往以 label 为 key 的 map 里面塞解析过的指令。这招在用不变体建模的时候就不管用了。因为要解析指令,完整的 labels 列表就是必须的。而给定一个 label 又必须能找到它所对应的指令才算有意义。所以这里出现了一个循环依赖。我就在这两者之间加了一个程序计算器(index/program counter)。原本书中的 pc register 里面放的是一串指令列表,我这里面回归本源,又放的是整数了。

这个模拟器运行书中 5.2 节计算最大公约数和 Fabonacci 数的程序都没有问题。

google code 上的 mercurial 库地址:https://regmachine-simulator.googlecode.com/hg
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics