# 前言

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

 <matter>教育者，将军，营养师，心理学家和父母计划。 对军队，学生和一些社会进行了编程。 对大问题的攻击使用了一系列程序，其中大多数程序在途中都已存在。 这些程序充斥着似乎是手头问题特有的问题。 要想将编程本身视为一种智力活动，就必须求助于计算机编程。 您必须读写计算机程序-其中许多。 程序涉及的内容或服务的应用程序无关紧要。 重要的是在创建更大的程序时，它们的性能如何以及与其他程序的适应程度如何。 程序员必须同时追求零件的完美和收藏的充分性。 在本书中，&lt;quote&gt;程序&lt;/quote&gt;的使用重点在于用Lisp语言编写的，在数字计算机上执行的程序的创建，执行和研究。 使用Lisp，我们不限制或限制我们可以编程的内容，而仅限制或限制我们程序描述的符号。

本书主题涉及的交通问题涉及到我们三种现象的焦点：人类的思想，计算机程序的集合和计算机。 每个计算机程序都是真实或思维过程的模型。 这些过程源于人类的经验和思想，数量庞大，细节复杂，并且在任何时候都只能部分理解。 它们很少通过我们的计算机程序来满足我们的永久满意度。 因此，即使我们的程序是精心设计的离散符号集合，互锁功能的镶嵌图，它们仍在不断发展：随着对模型的理解加深，扩大，泛化，我们会对其进行更改，直到模型最终在另一个模型中达到亚稳态为止。 我们奋斗。 与计算机编程相关的兴奋之源是在大脑中以及在计算机上不断表现为程序的机制及其产生的感知力的激增。 如果艺术诠释了我们的梦想，那么计算机将以程序的形式实现它们！

尽管计算机功能强大，但它是一个苛刻的任务管理员。 它的程序必须正确，我们想说的每一个细节都必须准确说出。 就像在其他所有象征性活动中一样，我们通过论据深信程序真理。 可以为Lisp本身分配一个语义（顺便说一句，是另一个模型），并且如果可以在谓词演算中指定程序的功能，则可以使用逻辑证明方法来提出可接受的正确性参数。 不幸的是，随着程序变得越来越庞大和复杂（几乎总是如此），规范本身的充分性，一致性和正确性就容易受到质疑，因此正确性的完整形式论据很少伴随大型程序。 由于大型程序是从小型程序中成长而来的，因此至关重要的是，我们必须开发出一系列标准程序结构，这些程序的正确性已被我们确定为“成语”，并学会使用经证明具有价值的组织技术将它们组合成较大的结构。 本书对这些技术进行了详尽的介绍，并且了解它们对于参与Promethean企业（称为编程）至关重要。 最重要的是，对强大的组织技术的发现和掌握加快了我们创建大型重要程序的能力。 相反，由于编写大型程序非常费力，因此我们被激励发明新的方法以减少适合大型程序的功能和细节量。

与程序不同，计算机必须遵守物理定律。 如果它们希望快速执行（每个状态改变几纳秒），则它们必须仅传输电子很小的距离（最多![1%5Cfrac%7B1%7D%7B2%7D](img/6e96cd8c046940367f2a4b9ae63f9d67.jpg)英尺）。 大量设备集中在空间中所产生的热量必须消除。 已经开发出一种精美的工程技术，在功能的多样性和设备的密度之间取得了平衡。 无论如何，硬件的工作水平总是比我们关心的编程还要原始。 将我们的Lisp程序转换为&lt;quote&gt;机器&lt;/quote&gt;程序的过程本身就是我们要编程的抽象模型。 他们的研究和创建为与编程任意模型相关的组织程序提供了很多见识。 当然，计算机本身可以如此建模。 想一想：最小的物理开关元件的行为是由微分方程描述的量子力学建模的，其详细行为是由在由...！组成的计算机上执行的计算机程序中表示的数值近似表示的。

分开识别这三个焦点不仅仅是战术上的方便。 即使就像他们所说的那样，这种逻辑上的分离也会促使这些焦点之间的象征性交通加速发展，这些焦点的丰富，活力和潜力在人类经验中仅靠生命本身的进化得以超越。 最好，病灶之间的关系是亚稳的。 这些计算机永远不会足够大或不够快。 硬件技术的每一次突破都会导致更庞大的编程企业，新的组织原则以及丰富的抽象模型。 每个读者都应该定期问自己&lt;quote&gt;朝着什么目的，朝着什么目的？&lt;/quote&gt; -但不要经常问这个问题，以免您忘却了苦乐参半的便秘的编程乐趣。

在我们编写的程序中，有些（但远远不够）执行精确的数学功能，例如排序或找到一个数字序列的最大值，确定素数或找到平方根。 我们称这种程序为算法，并且对于它们的最佳行为，尤其是关于执行时间和数据存储要求这两个重要参数的已知行为，众所周知。 程序员应掌握良好的算法和习惯用法。 即使某些程序拒绝精确的规范，程序员也有责任估计并始终尝试改善其性能。

Lisp是幸存者，已经使用了大约25年。 在活跃的编程语言中，只有Fortran的寿命更长。 两种语言都支持重要应用领域的编程需求，其中Fortran用于科学和工程计算，而Lisp用于人工智能。 这两个领域仍然很重要，并且他们的程序员非常专注于这两种语言，以至于Lisp和Fortran可能会继续活跃至少至少一个25世纪。

Lisp更改。 本文中使用的Scheme方言是从原始Lisp演变而来的，在几个重要方面与后者不同，包括对变量绑定的静态作用域确定和允许函数将函数作为值产生。 Scheme的语义结构与早期Lisps极为相似，类似于Algol 60。 Algol 60，再也不再是一种活跃的语言，以Scheme和Pascal的基因为生。 很难找到两种语言，这两种语言是与围绕这两种语言收集的两种不同文化相比交流的币种。 帕斯卡（Pascal）用于建造金字塔，由军队将重物推入到位而形成的，令人叹为观止的静态结构。 Lisp用于构建生物体-团队通过将波动的无数简单生物体安装到位而形成的，令人叹为观止的动态结构。 两种情况下使用的组织原理相同，除了一个非常重要的区别外：委托给Lisp程序员的可随意导出的功能比在Pascal企业中发现的功能大一个数量级。 Lisp程序会使用其实用程序超越生成它们的应用程序的功能来为库添加功能。 该列表是Lisp的本机数据结构，在很大程度上推动了实用程序的增长。 列表的简单结构和自然适用性体现在非同寻常的功能中。 在Pascal中，大量可声明的数据结构导致功能内的一种特殊化，从而抑制并惩罚了随意合作。 与对10个数据结构进行操作的10个功能相比，使100个函数对一种数据结构操作要好。 结果，金字塔必须保持一千年不变。 生物必须进化或灭亡。

为了说明这种差异，请将本书中对材料和练习的处理方式与使用Pascal的任何第一门课的处理方式进行比较。 不要以为这只是麻省理工学院可消化的文字的错觉而工作，这是在那里发现的品种所特有的。 无论学生是谁或在哪里使用它，这都是关于Lisp编程的一本严肃的书。

请注意，这是关于编程的文本，与大多数Lisp书籍不同，这些书籍被用作人工智能工作的准备。 毕竟，随着所研究的系统变得越来越大，软件工程和人工智能的关键编程问题趋于融合。 这就解释了为什么在人工智能之外人们对Lisp越来越感兴趣。

正如人们从其目标中所期望的那样，人工智能研究产生了许多重大的编程问题。 在其他编程文化中，这一系列问题产生了新的语言。 实际上，在任何非常大的编程任务中，一种有用的组织原则是通过语言的发明来控制和隔离任务模块中的流量。 随着一种语言接近人类交互最频繁的系统边界，这些语言趋于变得不那么原始。 结果，这样的系统包含复杂的语言处理功能，这些功能已被重复多次。 Lisp具有如此简单的语法和语义，可以将解析视为基本任务。 因此，解析技术在Lisp程序中几乎没有任何作用，并且语言处理器的构造很少会阻碍大型Lisp系统的增长和变化。 最后，正是这种语法和语义上的简单性导致了所有Lisp程序员所承担的负担和自由。 如果不使用任意功能，就不能编写任何大小的Lisp程序（超过几行）。 发明并适应； 适合并重塑！ 我们敬酒Lisp程序员，他把自己的想法写在括号里。

> Alan J. Perlis 康涅狄格州纽黑文</matter>