# 序言

> 原文：[Preface](https://sourceacademy.org/sicpjs/prefaces03)
> 
> 译者：[飞龙](https://github.com/wizardforcel)
> 
> 协议：[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)

《计算机程序的构造和解释》（SICP）通过建立一系列计算的心智模型，向读者介绍了计算的核心思想。第 1-3 章涵盖了所有现代高级编程语言共有的编程概念。SICP 的最初两版使用 Scheme 编程语言作为其程序示例，其极简的表达式导向语法使得该书能够专注于基本思想而不是所选择语言的设计。第 4 和 5 章使用 Scheme 来制定 Scheme 的语言处理器，加深读者对心智模型的理解，并探索语言扩展和替代方案。

自 1984 年出版以及 1996 年的第二版以来，SICP 已被世界各地的大学和学院采用为教材，包括新加坡国立大学（NUS），该校于 1997 年引入了基于 SICP 的入门课程 CS1101S。在 1990 年代中期，Python、JavaScript 和 Ruby 等语言出现，它们与 Scheme 共享核心设计元素，但采用了更复杂的面向语句的语法，使用熟悉的代数（中缀）表示法。它们的流行崛起导致教师们调整了基于 SICP 的课程，通常是通过将示例程序翻译为他们选择的语言，添加特定于该语言的材料，并省略第 4 和 5 章的材料。

##### 将 SICP 改编为 JavaScript

对将第二版 SICP 改编为 JavaScript（SICP JS）的工作始于 2008 年的 NUS，CS1101S 于 2012 年转换为 JavaScript。语言标准 ECMAScript 2015 引入了 lambda 表达式、尾递归和块作用域变量和常量，这使得改编变得非常接近原版。我们只在 JavaScript 和 Scheme 之间的差异迫使我们感到必须进行实质性的改变时才对 SICP 进行了重大改动。该书只涵盖了 JavaScript 的一小部分，因此读者不应该使用它来学习这种语言。例如，JavaScript 对象的概念——按任何标准来看都是其基本组成部分之一——甚至没有提到！

通过添加模拟 Scheme 基元的库（包括对列表结构的支持），并相应地调整文本，将第 1-3 章的程序翻译成 JavaScript 是直截了当的。然而，转换到 JavaScript 迫使我们对第 4 和 5 章的解释器和编译器进行微妙的更改，以处理返回语句。Scheme 的表达式导向语法没有返回语句，而返回语句是面向语句的语言的一个显著特征。

通过使用 JavaScript，第 1-3 章向读者介绍了大多数主流语言的语法风格。然而，同样的语法风格在第 4 章中引起了重大变化，因为程序的直接表示作为数据结构不再能够被视为理所当然。这为我们提供了一个机会，在第 4.1 节中向读者介绍程序解析的概念，这是编程语言处理器的重要组成部分。在第 4.4 节中，JavaScript 的严格语法结构使得所呈现的逻辑编程系统的实现变得复杂，并暴露了 JavaScript 作为编程语言设计工具的局限性。

##### 使用 SICP JS 的资源

SICP JS 的 MIT Press 网页链接到了这本书的用户支持。这提供了书中的所有程序和丰富的教师资源，包括大量额外的练习和关于在典型大学学期中可以涵盖的 SICP JS 子集的建议。该书中的 JavaScript 程序在符合 ECMAScript 2020 JavaScript 规范（ECMA 2020）的任何 JavaScript 解释器中以推荐的严格模式运行。MIT Press 网页包括 JavaScript 包`sicp`，其中提供了书中被认为是“原始”的所有 JavaScript 函数。

##### 致读者

我们真诚地希望，如果这本书是你第一次接触编程，你将利用你对计算机程序的结构和解释的新理解来学习更多的编程语言，包括 Scheme 和完整的 JavaScript 语言。如果你在阅读 SICP JS 之前已经学过 JavaScript，你可能会对支撑该语言的基本概念有新的见解，并发现如此少的东西可以取得如此大的成就。如果你已经了解原始的 SICP，那么你可能会喜欢看到熟悉的思想以新的形式呈现，并且可能会欣赏书的网页上提供的在线比较版本，其中 SICP JS 和 SICP 可以并排查看。

—Martin Henz 和 Tobias Wrigstad
