5.0 Computing with Regiser Machines - CloneableX/SICP-learning GitHub Wiki
本书的开头部分我们学习了 Lisp 程式的编写。为了解释这些程式的原理,我们采用了替换模型,环境模型以及元循环求值器。特别是通过元循环求值器的学习,了解了关于类 Lisp 语言运算的细节。不过元循环求值器也遗留了一些尚未解答的疑惑,因为它无法解释 Lisp 系统的控制原理。例如,求值器从不解释计算的子表达式如何管理在其中被使用到的其他表达式的返回值,或者换个说法,求值器只解释了递归程式如何生成迭代过程(这种求值方式的空间增长是常量级),而没有解释由递归程式生成的递归过程。由于元循环求值器只是一个 Lisp 程序,于是完整继承了底层 Lisp 系统的控制结构,所以这些问题在求值器部分都无法得到解答。为了深入了解 Lisp 求值器的控制结构,我们必须基于 Lisp 的更底层部分进行学习。
本章内容将描述事物在计算机中的完整计算过程。比如一台计算机,或者称为 寄存器机器(register machine) 会频繁执行 指令(instructions) 对一组固定的存储单元 寄存器(registers) 的内容进行维护。一个经典的寄存器机器指令能够将某些寄存器的存储内容分配给其他寄存器。本章对于寄存器执行过程的描述与传统计算机的机器语言程序十分类似。不过与关注点在某个特殊计算机的机器语言有所不同的是,我们将研究几种不同的 Lisp 程式,并设计一个特定的寄存器机器运行每种程式。因此,本章的视角更倾向于硬件架构师而不是机器语言程序员。为了设计寄存器机器,我们需要开发实现重点程序结构的机制,比如实现递归的机制。同时,我们也要呈现描述寄存器机器设计的语言。在 5.2 节,我们将通过根据上述描述实现的 Lisp 程序模拟寄存器机器。
该寄存器机器中大量的基本操作都是非常简单的。例如,其中一个操作是能够将从两个寄存器中获取的数字相加,并将相加的结果存储至另一个寄存器中。这样的操作能够轻易地通过硬件描述并实现。不过,在处理列表结构时,常用的 car
、cdr
和 cons
操作需要一个精心设计的存储分配机制作为基础。在 5.3 节,我们将学习更多的存储单元操作的实现。
在 5.4 节,在我们累积了一定的寄存器程式实现经验后,我们将设计一个能够承载元求值器所描述的算法的寄存器机器。它将提供一个关于求值器控制机制的清晰模型,以此填补 Scheme 表达式解释过程的知识空缺。在 5.5 节,我们将学习编译器,它能够将 Scheme 程式编译为命令序列,这些命令将由寄存器直接执行,以及由寄存器机器求值器直接操作。