通用机

二十课

引入

前几节课程最终想要传达的核心思想其实就是:

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。

参考