# 5使用注册机进行计算

> 译者： [https://sicp.comp.nus.edu.sg/chapters/94](https://sicp.comp.nus.edu.sg/chapters/94)

 <chapter>> 我的目的是表明，就几乎所有的多重运动而言，天上的机器不是一种神圣的，活的存在，而是一种发条（并且他相信钟有灵魂将制造者的荣耀归功于作品）。 由最简单和物质的力量引起，就像时钟的所有运动都是由单个砝码引起的一样。Johannes Kepler （给Herwart von Hohenburg的信，1605年）

<chaptercontent></chaptercontent>

我们通过研究过程并通过用JavaScript编写的函数描述过程来开始本书。 为了解释这些功能的含义，我们使用了一系列评估模型：第1章的替代模型，第3章的环境模型以及第4章的元圆评估器。我们对元圆评估器的检查，尤其是消除了 解释类似JavaScript的语言的方式有很多奥秘。 但是，即使是元循环评估器也无法回答重要问题，因为它无法阐明JavaScript系统中的控制机制。 例如，评估程序没有解释子表达式的评估如何设法将值返回给使用该值的表达式，评估程序也没有解释某些递归函数如何生成迭代过程（即，使用常量空间进行评估），而 其他递归函数会生成递归过程。 这些问题仍然没有得到回答，因为元循环评估器本身就是一个JavaScript程序，因此继承了底层JavaScript系统的控制结构。 为了更全面地描述JavaScript评估程序的控制结构，我们必须在比JavaScript本身更原始的层次上进行工作。

在本章中，我们将按照传统计算机的逐步操作来描述过程。 这样的计算机或_寄存器机_顺序执行_指令_，这些指令操纵称为_寄存器_的一组固定存储元件的内容。 典型的寄存器机指令将原始操作应用于某些寄存器的内容，并将结果分配给另一个寄存器。 我们对注册机执行的处理的描述非常类似于传统计算机的&lt;quote&gt;机器语言&lt;/quote&gt;程序。 但是，我们将不关注任何特定计算机的机器语言，而将研究几个JavaScript函数并设计一个特定的寄存器机器来执行每个函数。 因此，我们将从硬件架构师而不是机器语言计算机程序员的角度来完成任务。 在设计寄存器机时，我们将开发用于实现重要编程结构（例如递归）的机制。 我们还将介绍一种用于描述套准机设计的语言。 在 [5.2](101) 部分中，我们将实现一个JavaScript程序，该程序使用这些描述来模拟我们设计的机器。

我们的注册机的大多数原始操作都非常简单。 例如，一个操作可能会将从两个寄存器中提取的数字相加，从而将结果存储到第三个寄存器中。 可以通过简单描述的硬件来执行这样的操作。 但是，为了处理列表结构，我们还将使用需要精心设计的存储分配机制的内存操作`head`，`tail`和`pair`。 在 [5.3](106) 部分，我们从更多基本操作的角度研究了它们的实现。

在 [5.4](109)[部分的元圆评估器描述的算法。 ] 4.1](73)[5.5](114) 部分中，我们将研究一个简单的编译器，该编译器将JavaScript程序转换为指令序列，可以直接通过评估器注册机的寄存器和操作执行这些指令。

<chaptercontent></chaptercontent></chapter>