《计算的本质:深入剖析程序和计算机》
这几天我在学习一本书,名字是《计算的本质:深入剖析程序和计算机》,是一本干货十足的书。
我才学习完第二章节,作者在这章中试图用Ruby语言来描述一种简单编程语言解释器的实现。他总共通过了三种不同的方法来实现编程语言的操作语义。我使用Python语言来实现书中的例子:
-
小步语义。就是假想一台机器,用这台机器直接按照这种语言的语法进行操作一小步一小步地对其进行反复规约,从而对一个程序求值。小步语义大部分都带有迭代的味道,它要求抽象机器反复执行规约步骤(Machine#run中的 while 循环),这些步骤以及与它们同样类型的信息可以作为自身的输入和输出,这让它们适合这种反复进行的应用程序。
-
大步语义。定义如何从一个表达式或者语句直接得到它的结果。这必然需要把程序的执行当成一个递归的而不是迭代的过程:大步语义说的是,为了对一个更大的表达式求值,我们要对所有比它小的子表达式求值,然后把结果结合起来得到最终答案。大步规约的规则描述了如何只对程序的抽象语法树访问一次就计算出整个程序的结果,因此不需要处理状态和重复。我们将只对表达式和语句类定义一个#evaluate 方法,然后直接调用它。
-
指称语义。转而关心从程序本来的语言到其他表示的转换。这种类型的语义没有直接处理程序的执行,而是关注如何借助另一种语言的已有含义——一种低级的、更形式化的或者至少比正在描述的语言更好理解的语言——解释一个新的语言。
在用Python语言实现书中Ruby语言代码示例时,发现Ruby作为一门纯面向对象编程语言发挥到了极致。特别是Ruby中的对象都返回一个指定的值,这对于解释器实现来说,非常的好用。同样的功能,用Python代码实现起来略显累赘,但是少了很多语法糖后,代码应该会更清晰一点。
2014-12-23
上一篇: 排序算法 下一篇: Ruby的函数调用与super