通用机
二十课
引入
前几节课程最终想要传达的核心思想其实就是:
Evaluator 决定 Scheme 程序的意义
我们也可以直观地观察到
Evaluator 自身也是个程序
也就是说我们有一个能解释其它程序意义的程序。
如何看待 Evaluator
从语言设计者的角度出发
Evaluator 定义了解释程序的方式如:
Applicative vs. Normal order
Dynamic vs. Lexical scoping
Decoupling analysis from evaluation
前两个例子不再赘述,这边介绍一下第三条,将 analysis 与 evaluation 解耦:
我们前面介绍的 Scheme 解释器的示意图如下:
![](/assets/Screen Shot 2018-04-17 at 1.36.33 PM.jpg)
这种解释器被称为 straight interpreter,因为它不会对输入的表达式作任何分析,而是直接在环境中解释表达式。但通常情况下,输入的表达式有优化空间,因此就有下面这种功能更强大的解释器或者编译器 (advanced interpreter or compiler):
![](/assets/Screen Shot 2018-04-17 at 1.36.40 PM.jpg)
在 expression 进入 execution 之前,多了一个静态分析模块,它可以:
提升执行效率
及早发现常见错误
对表达式做安检
所有这些,都是为了减少 evaluation 的成本。course notes 还对部分表达式的 analyzer 的实现举例,这里也不再赘述。
从理论研究者的角度出发
引入中提到过,Evaluator 是一个能解释其它程序的程序,它的另外一个名字就是通用机 (Universal Machine)。
Universal Machine is a program that takes any program as input and reconfigures itself to simulate the input program
Evaluator 不仅能够解释其它程序,它自身也是一个程序,因此 Evaluator 也可以用来解释其它语言的 Evaluator,这也是我们从十七课开始在做的事情 --- 利用 Scheme 的 Evaluator 来构建 Scheme* 的 Evaluator。极端地说,任何语言的 Evaluator 都可以被用来解释任何其它语言的 Evaluator,换言之,你可以用 C 语言写 Java 的、Python 的、Ruby 的....任何语言的 Evaluators。
参考
Last updated