|
我的目标是证明天体机器不是某种神圣的、有生命的存在,而是一种钟表装置(相信时钟有灵魂的人,是把制造者的荣耀归于了作品本身),因为几乎所有多样的运动都是由一种最简单、最物质的力量引起的,正如时钟的所有运动都是由一个重锤引起的一样。
|
在本书中,我们一开始通过研究过程,并用 Lisp 编写的过程来描述过程。为了解释这些过程的含义,我们使用了一系列求值模型:第 1 章的替换模型、第 3 章的环境模型和第 4 章的元循环求值器。特别是对元循环求值器的考察,消除了对类 Lisp 语言如何被解释的大部分神秘感。但即使元循环求值器也留下了一些重要问题没有回答,因为它未能阐明 Lisp 系统中控制的机制。例如,求值器没有解释子表达式的求值如何设法将值返回给使用该值的表达式,也没有解释为什么某些递归过程产生迭代过程(即使用常量空间求值),而其他递归过程产生递归过程。这些问题仍然没有答案,因为元循环求值器本身就是一个 Lisp 程序,因此继承了底层 Lisp 系统的控制结构。为了提供 Lisp 求值器控制结构的更完整描述,我们必须在比 Lisp 本身更原始的层次上工作。
在本章中,我们将根据传统计算机的逐步操作来描述过程。这样的计算机或寄存器计算机顺序执行指令,这些指令操纵一组称为寄存器的固定存储元素的内容。一条典型的寄存器计算机指令对某些寄存器的内容应用基本操作,并将结果赋给另一个寄存器。我们对寄存器计算机执行过程的描述看起来很像传统计算机的"机器语言"程序。然而,我们不会关注任何特定计算机的机器语言,而是研究几个 Lisp 过程,并为每个过程设计一个特定的寄存器计算机。因此,我们将从硬件架构师的角度而不是机器语言程序员的角度来处理我们的任务。在设计寄存器计算机时,我们将开发实现重要编程结构(如递归)的机制。我们还将提出一种语言来描述寄存器计算机的设计。在第 5.2 节中,我们将实现一个 Lisp 程序,它使用这些描述来模拟我们设计的计算机。
我们的寄存器计算机的大多数基本操作都非常简单。例如,一个操作可能将从两个寄存器中取出的数字相加,产生一个结果存入第三个寄存器。这样的操作可以由容易描述的硬件执行。然而,为了处理列表结构,我们还将使用内存操作 car、cdr 和 cons,这些操作需要精密的存储分配机制。在第 5.3 节中,我们将研究它们如何用更基本的操作来实现。
在第 5.4 节中,在积累了将简单过程表述为寄存器计算机的经验之后,我们将设计一台计算机来执行第 4.1 节中元循环求值器描述的算法。这将通过为求值器中的控制机制提供显式模型,来填补我们对 Scheme 表达式如何解释的理解中的空白。在第 5.5 节中,我们将研究一个简单的编译器,它将 Scheme 程序翻译成指令序列,可以在求值器寄存器计算机的寄存器和操作上直接执行。