

# 前言

《计算机程序的结构和解释》一书(SICP)通过建立一系列计算的心智模型向读者介绍了计算的核心思想。[第 1–3 章](c001.xhtml)涵盖了所有现代高级编程语言共有的编程概念。《SICP》最初的两个版本在他们的程序示例中使用了编程语言方案，其极简主义的、面向表达式的语法使这本书能够专注于潜在的思想，而不是所选语言的设计。第 4 章和 [5](c005.xhtml) 使用 Scheme 为 Scheme 制定语言处理器，加深读者对心智模型的理解，探索语言扩展和替代。

自 1984 年出版和 1996 年再版以来，《SICP》已被世界各地的大学和学院采用为教科书，包括新加坡国立大学(NUS)，它于 1997 年在 SICP 推出了入门课程 CS1101S。在 20 世纪 90 年代中期，出现了 Python、JavaScript 和 Ruby 语言，它们与 Scheme 共享中心设计元素，但是它们采用了更复杂的、面向语句的语法，该语法使用熟悉的代数(中缀)符号。这些程序越来越受欢迎，这使得教师们对他们在 SICP 的课程进行了调整，通常是将示例程序翻译成他们选择的语言，添加针对该语言的材料，以及省略第 4 章第 4 章第 11 章和第 5 章第 13 章的材料。

##### 让 SICP 适应 JavaScript

将《SICP》第二版改编为 JavaScript (SICP JS)的工作始于 2008 年的新加坡国立大学，CS1101S 于 2012 年改用 JavaScript。语言标准 ECMAScript 2015 引入了 lambda 表达式、尾部递归以及块范围的变量和常量，这使得改编变得非常接近原始版本。只有当我们觉得 JavaScript 和 Scheme 之间的差异迫使我们对 SICP 进行实质性的修改时，我们才会这样做。这本书只涵盖了 JavaScript 的一小部分，所以读者不应该用它来学习语言。例如，JavaScript 对象的概念——无论如何都被认为是其基本成分之一——甚至没有被提及！

通过添加镜像 Scheme 原语的库——包括对列表结构的支持——并相应地修改文本，很容易将第 1 章到第 3 章的程序翻译成 JavaScript。然而，切换到 JavaScript 迫使我们对第 4 章和第 5 章的解释器和编译器做了微妙的改变，以处理返回语句。Scheme 的面向表达式的语法没有返回语句，这是面向语句语言的一个显著特征。

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

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

麻省理工学院出版社的 SICP JS 网页链接到这本书的用户支持。这提供了书中的所有程序和广泛的教师资源，包括大量额外的练习和关于选择一个典型的大学学期可以涵盖的 SICP JS 子集的建议。书中的 JavaScript 程序在任何符合 JavaScript 的 ECMAScript 2020 规范(ECMA 2020)的 JavaScript 解释器中以推荐的严格模式运行。麻省理工出版社的网页包括 JavaScript 包`sicp`，它提供了书中所有被认为是“原语”的 JavaScript 函数。

##### 给读者

我们真诚地希望，如果这本书是你第一次接触编程，你将利用你新获得的对计算机程序的结构和解释的理解来学习更多的编程语言，包括 Scheme 和完整的 JavaScript 语言。如果你在学习 SICP JS 之前已经学习了 JavaScript，你可能会对这种语言背后的基本概念有新的见解，并发现用这么少的资源可以获得这么多的东西。如果你带着对《SICP》原著的了解来到《SICP JS 》,你可能会喜欢看到以新的形式呈现的熟悉的观点——并且可能会欣赏在线比较版，可以在该书的网页上找到，SICP JS 和 SICP 可以并排查看。

—马丁·亨茨和托拜厄斯·里格斯塔德