购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1984年SICP第1版的前言

一台计算机就像一把小提琴。你可以想象一个新手试了一台留声机,然后是小提琴。后来他说,这声音真难听。我们已经从大众和我们的大部分计算机科学家那里反复听到这种说法。他们说,计算机程序对一些具体用途确实是好东西,但它们太缺乏弹性。一把小提琴或一台打字机也同样缺乏弹性,那是在你学会如何使用它们之前。

——Marvin Minsky,“为什么说程序设计是表述和理解浮浅的草率而就的思想的好媒介”

《计算机程序的构造和解释》是麻省理工学院(MIT)计算机科学的入门教材。在MIT主修电子工程或计算机科学的所有学生都必须学这门课,作为“公共核心课程计划”的四分之一。这个计划还包含两个关于电路和线性系统的科目,还有一个关于数字系统设计的科目。我们从1978年开始涉足这些科目的开发,自1980年秋季以后,我们就一直按现在的形式教授这门课,每年600到700个学生。大部分学生此前没有或很少接受过计算方面的正式训练,虽然许多人玩过一点计算机,也有少数人有很多程序设计或硬件设计的经验。

我们设计的这一计算机科学导引课程的主要考虑有两个方面。首先,我们希望建立起一种思想:一个计算机语言不仅是指挥计算机去执行操作的一种方式,更重要的,它是表述有关方法学的思想的一种新颖的形式化媒介。因此,程序必须写得适合人的阅读,偶尔用于供计算机执行。其次,我们相信,在这一层次的课程里,最基本的材料不应该是特定程序设计语言的语法,不是高效地计算某些函数的巧妙算法,也不是算法的数学分析或计算的本质基础,而是那些能用于控制大型软件系统的智力复杂性的技术。

我们的目标是使学过了这一科目的学生能对程序设计的风格要素和美学有一种很好的感觉。他们应该掌握了控制大型系统中的复杂性的主要技术。他们应该能阅读50页长的程序,只要它具有某种值得模仿的风格。他们应该知道在任何时刻哪些东西不需要读,哪些不需要理解。他们应该很有把握地去修改一个程序,同时又保持原作者的精神和风格。

这些技能并不是计算机程序设计所独有的。我们所教授和提炼出来的这些技术,对所有工程设计都是共通的。我们应该在适当的情况下隐藏一些细节,通过创建抽象去控制复杂性。我们通过建立方便的接口,以便能以“混合与匹配”的方式组合起标准的、已经被很好理解的片段,以控制系统的复杂性。我们为描述各种设计而创建一些新语言,每种语言强调设计中的某些特定方面,并降低其他方面的重要性,以便控制复杂性。

作为我们的这些方法基础的是一种信念:“计算机科学”并不是一种科学,其重要性也与计算机本身没有太大关系。计算机革命是有关我们的思考方法,以及我们表达自己的思考的一个革命。这一变化的本质,就是出现了这样一种或许最好是称为 过程性认识论 的现象——也就是说,从一种命令式的观点去研究知识的结构,与经典数学领域里采用的更具说明性的观点相对应。数学为精确处理“是什么”提供了框架,而计算则为精确处理“怎样做”的观念提供了框架。

在教授这些材料时,我们采用程序设计语言Lisp的一种方言。我们并不形式化地教授该语言,因为不需要那样做。我们只是使用它,而学生可以在几天之内就学会它。这也是类Lisp语言的一个重要优点:它们只有不多的几种构造复合表达式的方式,而且几乎没有语法结构。所有形式化的性质都可以在一个小时里讲完,就像说明下象棋的规则。在很短时间之后,我们就可以忘掉语言的语法细节(因为这里根本就没有),而进入真正的问题——弄清楚我们想计算什么,可以怎样把问题分解为一组可管理的部分,以及如何对这些部分开展工作。Lisp的另一优势就在于,与我们知道的任何其他语言相比,它支持(但并非强制性的)更多能用于以模块化的方式分解程序的大规模策略。我们可以做过程性抽象和数据抽象,可以利用高阶函数掌控公共的使用模式,可以用赋值和数据变动操作模拟局部状态,可以利用流和延时求值连接起程序里的各个部分,可以很容易地实现嵌入的语言。所有这些都融合在一个交互式环境里,该环境还带有对增量式的程序设计、构造、测试和排除错误的绝佳支持。我们要感谢一代又一代的Lisp大师,从John McCarthy开始,是他们铸造起了这样一个具有空前威力又如此优雅的完美工具。

作为我们所用的Lisp方言,Scheme试图集成起Lisp和Algol的力量和优雅。我们从Lisp那里取来元语言的力量,它来自简单的语法形式,程序与数据对象的统一表示,以及带有废料收集的堆分配的数据结构。我们从Algol那里取来词法作用域和块结构,这是当年参加Algol委员会的那些程序设计语言先驱者的礼物。我们想特别感谢John Reynolds和Peter Landin,为了他们关于丘奇的lambda演算与程序设计语言的结构之间关系的真知灼见。我们也认识到应该感谢那些数学家,在计算机面世以前,他们就已经在这一领域中探索了许多年。这些先驱者包括丘奇(Alonzo Church)、罗塞尔(Barkley Rosser)、克里尼(Stephen Kleene)和库里(Haskell Curry)。

Harold Abelson和Gerald Jay Sussman PIAZsyrj3PHEB2cZguFQwg/iiJ+wVCvCShSyaZ2lEi/sW/0S8cbCx2etnT9Kz2ar

点击中间区域
呼出菜单
上一章
目录
下一章
×