出版社: 机械工业出版社
副标题: 原书第2版
原作名: Structure and Interpretation of Computer Programs
译者: 裘宗燕
出版年: 2004-2
页数: 473
定价: 45.00元
装帧: 平装
丛书: 计算机科学丛书
ISBN: 9787111135104
内容简介 · · · · · ·
《计算机程序的构造和解释(原书第2版)》1984年出版,成型于美国麻省理工学院(MIT)多年使用的一本教材,1996年修订为第2版。在过去的二十多年里,《计算机程序的构造和解释(原书第2版)》对于计算机科学的教育计划产生了深刻的影响。第2版中大部分重要程序设计系统都重新修改并做过测试,包括各种解释器和编译器。作者根据其后十余年的教学实践,还对其他许多细节做了相应的修改。
海报:
作者简介 · · · · · ·
Harold Abelson是MIT1992年度MacVicarFacultyFellow。Gerald JaySussman是Matsushita电子工程教授。他们都在MIT电子工程和计算机科学系工作.都得到过最重要的计算机科学教育奖:如Abelson得到了IEEE计算机学会的Booth奖。Sussman得到了ACM的Karlstrom奖。
Julie Sussman是作家和编辑,同时使用自然语言和计算机语言写作。
目录 · · · · · ·
专家指导委员会
序
第2版前言
第1版前言
致谢
第1章 构造过程抽象
1.1 程序设计的基本元素
1.2 过程与它们所产生的计算
1.3 用高阶函数做抽象
第2章 构造数据现象
2.1 数据抽象导引
2.2 层次性数据和闭包性质
2.3 符号数据
2.4 抽象数据的多重表示
2.5 带有通用型操作的系统
第3章 模块化、对象和状态
3.1 赋值和局部状态
3.2 求值的环境模型
3.3 用变动数据做模拟
3.4 并发:时间是一个本质问题
3.5 流
第4章 元语言抽象
4.1 元循环求值器
4.2 Scheme的变形——惰性求值
4.3 Scheme的变形——非确定性计算
4.4 逻辑程序设计
第5章 寄存器机器里的计算
5.1 寄存器机器的设计
5.2 一个寄存器机器模拟器
5.3 存储分配和废料收集
5.4 显式控制的求值器
5.5 编译
参考文献
练习表
索引
· · · · · · (收起)
丛书信息
喜欢读"计算机程序的构造和解释"的人也喜欢的电子书 · · · · · ·
喜欢读"计算机程序的构造和解释"的人也喜欢 · · · · · ·
计算机程序的构造和解释的话题 · · · · · · ( 全部 条 )
计算机程序的构造和解释的书评 · · · · · · ( 全部 70 条 )
涵盖面很广,起点很高
计算机科学不是科学也和计算机无关
> 更多书评70篇
-
现在到了数学抽象中最关键的一步:让我们忘记这些符号所表示的对象。(数学家)不应在这里停步,有许多操作可以应用于这些符号,而根本不必考虑它们到底代表着什么东西。 邱奇数可以帮我们充分理解上面这句话和数据抽象的含义,于是符号语言表示自然数和和四则运算表达如下: /代码内容已省略/ 邱奇数可以很好的将数学计算,用符号演算构造出来,并得到所有(可计算的)“自然数”.. (1回应)
2012-02-28 17:06 9人喜欢
现在到了数学抽象中最关键的一步:让我们忘记这些符号所表示的对象。(数学家)不应在这里停步,有许多操作可以应用于这些符号,而根本不必考虑它们到底代表着什么东西。 邱奇数可以帮我们充分理解上面这句话和数据抽象的含义,于是符号语言表示自然数和和四则运算表达如下:(define (inc n) (+ n 1)) (define zero (lambda (f zero) zero)) (define one (lambda (f zero) (f zero))) (define two (lambda (f zero) (f (f zero)))) (define (add x y) (lambda (f zero) (x f (y f zero)))) (define three (add two one)) ;; 3+3 (define (multiply x y) (lambda (f zero) (x (lambda (z) (y f z)) zero))) (define four (multiply two three)) (four inc 0)邱奇数可以很好的将数学计算,用符号演算构造出来,并得到所有(可计算的)“自然数”(符号)。(将操作应用于符号,而不必考虑他们到底代表什么东西) 其实邱奇的lambda calculus建立一个强大的符号演算系统,利用这个(抽象)符号操作概念可以建立一个强大的形式语言,从而实现一个图灵等价的计算模型。符号演算可以模拟出数学世界里的所有计算模型,而数学计算只是这个形式语言的其中一个具体罢了。 关于邱奇-图灵理论,停机问题,Y 组合子,不完备性定理,可以参考一下2篇好文: http://blog.csdn.net/pongba/article/details/1336028 http://blog.csdn.net/pongba/article/details/6217231回应 2012-02-28 17:06 -
tertio (母语式英语学习)
原文 P3 将数值作为"简单数据"看待实际上完全是作为一种虚张声势.事实上,对于数值的处理是任何程序设计语言里最错综复杂而且也最迷惑人的事项之一.其中涉及的典型问题包括: 某些计算机系统区分了整数(例如2)和实数(例如2.71).那么实数2.00和整数2不同吗?用于整数的算术运算是否与用于实数的运算相同呢?用6除以2的结果是3还是3.0?我们可以表示的最大的数是多少?最多能表示的精度包含了多少个十进制位?整数的表示范围与实...2012-11-22 15:22 3人喜欢
原文 P3
tertio注解:这里的难点关键在于理论模型和实现模型的关系,一般认为关于数的理论,是无法直接用于计算机的,要么无法表示,要么效率低下,但实际上如果构造出理论到具体内存位的映射,有办法解决这个理论与实践的两难问题.原文 P10将数值作为"简单数据"看待实际上完全是作为一种虚张声势.事实上,对于数值的处理是任何程序设计语言里最错综复杂而且也最迷惑人的事项之一.其中涉及的典型问题包括: 某些计算机系统区分了整数(例如2)和实数(例如2.71).那么实数2.00和整数2不同吗?用于整数的算术运算是否与用于实数的运算相同呢?用6除以2的结果是3还是3.0?我们可以表示的最大的数是多少?最多能表示的精度包含了多少个十进制位?整数的表示范围与实数一样吗?......
tertio注解:这里应该指的是term rewriting,一种非常类似人的纸面推导和证明的方法.至于这里的名称混淆问题,可能涉及到高阶的模式匹配,但不是没有办法解决的.原文 P14虽然代换模型看起来似乎非常简单,但令人吃惊的是,给出代换过程的严格数学定义却异常复杂.问题在于,用作过程中形式参数的名字,可能会与该过程可能应用的那些表达式中的(同样)名字相互混淆.在逻辑和程序设计的语义学文献里,关于代换的充满错误的定义有一个很长的历史.
tertio注解:这是语言之谜的一个复杂而又关键的地方,此时此刻做某事,这是一个行动性语句,然而上升到更高的层次,你又可以给出一个命题,当某时某刻做某事之后,某个命题成立.在这段注释省略掉的后半段,这种甚高级语言试图全部用说明性语句来解决问题的方式是不对的,这个思路忽视了人类的语言特征:人类常常从不同的层次描述同一个问题,因而行动性描述和说明性描述都是需要的,而且,在计算机语言中,只有为这两种描述提供转换方法,才能符合人类的思维特征.原文P65说明性描述和行动性描述有着内在的联系,就像数学和计算机科学有内在的联系一样.举个例子,说一个程序产生的结果"正确",就是给出了一个有关该程序性质的说明性语句.存在着大量的研究工作,其目标就是创建起一些技术,设法证明一个程序是正确的.在这一领域中有许多技术性困难,究其根源,都出自需要在行动性语句(程序是有它们构造起来的)和说明性语句(它们可以用于推导出某些结果)之间转来转去
tertio注解:用抽象代数来理解lisp和函数式的都是棒槌.原文P136术语"闭包"来自于抽象代数,在抽象代数里,一集元素称为在某个运算(操作)之下封闭,如果将该运算作用于这一集合的元素,产生出的仍然是该集合里的元素.然而lisp社团(很不幸)还用术语"闭包"描述另一个与此毫不相干的概念.闭包也是一种为带有自由变量的过程而用的实现技术.本书没有采用闭包这一术语的第二种意义.
tertio注解:吐得一口好槽,最后一句话尤其关键,一下子就点明了构造哲学意义上的本体的方向----知识表示与自动推理.现有的走向前台的计算机语言,完全没有达到这个层次.原文P148...开发出一种有用的,具有一般意义的框架,以描述不同类型的对象之间的关系(这在哲学中称为"本体论").看来是一件极其困难的工作.在10年前存在的混乱和今天存在的混乱之间的主要差异在于,今天已经有了一批各式各样的并不合适的本体理论,它们已经被嵌入到数量过多而又先天不足的各种程序设计语言里.举例来说,面向对象语言的大部分复杂性---以及当前各种面向对象语言之间细微的而且使人迷惑的差异的核心,就是对类型之间通用型操作的处理....事实上,我们的猜想是,如果没有知识表示和自动推理工作的帮助,这些问题是无法仅仅通过计算机语言设计的方式合理处理的.
tertio注解:哲学上的同一性问题在古希腊时代就得到了深入的思考,"赫拉克利特的河流","特修斯之船"...而且从罗素的指称到克里普克的专名理论,哲学家们已经给出了很好的答案.在计算机程序设计中,解决同一性的方式就得以这些理论作为基础,而不是搬弄数学.原文P247在处理变动数据对象的共享问题时,最微妙的地方正好就反应了3.1.3节里提出的有关"同一"和"变化"的基本问题.我们在那里说过,如果希望这个语言里容许做修改,那么每个复合对象就必须有一个"标识",这应该是某种不同于构造起它的那些片段的东西.在lisp里,我们所认为的"同一"也就是检查课题之间的eq?,采用指针相等表示.这是因为在大部分lisp实现里,一个指针本质就是一个存储地址,在这里"解决"对象标识的方式,是假设数据对象"本身"也是一些信息,存储在计算机中某一些特定的存储位置,对于简单的lisp程序而言,这也就足够了.但是这并不是解决计算模型中"同一"问题的一般性方法.
tertio注解:这是前面提到的语义层次的问题,当我们和粒子处于同一个世界中的时候(正在观察),粒子的状态随真实的时间发生变化,而当我们为其建立运动理论的时候,就可以把粒子的状态和时间之间建立对应关系,这时候,这里所说的时间无非是一个坐标轴而已,不是真实的时间,因而也不涉及什么变化.函数式通过将状态变化当做流或其他结构来处理,避免了状态变化和赋值的问题,但问题是,一旦系统有了真实的IO,就很难再保持纯粹了.原文P248物理中也类似,当我们观察一个正在移动的粒子时,我们说该粒子的位置(状态)正在变化,然而,从粒子的世界线的观点看,这里根本就不涉及任何变化
tertio注解:这里提到量子力学可能不是一个恰当的类比。但同意,不回到最根本的认识论上,不足以解决这个问题。在这方面的探索,分析哲学家已经做出了大量的努力,是时候在计算机程序设计领域引入这些成果了。原文P248正文对象模型对世界的近似在于将其分割为独立的片段,函数式模型则不是沿着对象的边界去做模块化。当“对象”之间不共享的状态远远大于它们所共享的状态时,对象模型就特别好用。这种对象观点失效的一个地方就是量子力学,在那里,将物体看做独立粒子就会导致悖论和混乱。将对象观点和函数式观点合并可能与程序设计的关系不大,而是与基本认识论有关的论题。
tertio注解:大统一是可期待的,因为不论把世界看做什么,但自始自终我们无法摆脱的是所采用的语言和思维方式,一旦在计算机中构造出了在各个层次都符合思维规律的语言,大统一就不可避免了。原文P317本章开始时提出了一个目标,那就是构造出一些计算模型,使其结构能够符合我们对于试图去模拟的真实世界的看法。我们可以将这一世界模拟为一集相互分离的、受时间约束的、具有状态的相互交流的对象。或者可以将它模拟为单一的、无时间也无状态的统一体。每种观点都有其强有力的优势,但就其自身而言,又没有一种方式能够完全令人满意。我们还在等待一个大统一的出现。
tertio注解:要略略纠正一下这个说法,匹配并不是一种代价高昂的工作,因为对每个元素进行匹配是必不可少的工作.而提高效率的方法,一方面是让搜索回答更少的问题(降低问题的难度),另一方面是避免重复的匹配.而在构造数据库时就可以做的那些粗略匹配,相当于是把大多数搜索所需要的匹配提前做完,从而在搜索的时候,避免这些重复的匹配工作.------从信息的角度讲,没有任何一个匹配是真正可以避免的一般而言,匹配是一种代价高昂的工作,因为我们希望避免将完整的匹配应用于数据库里的每一个元素,通常可以通过将这个过程分解为快速的粗略匹配和最终匹配而达到加速的目的.其中的粗略匹配过滤数据库,为最终匹配产生出很小的一组候选.我们也可以仔细安排这个数据库,使得粗略匹配的工作在数据库的构造过程中完成,而不是等着需要找出候选的时候再做.这称为数据库的索引....
回应 2012-11-22 15:22 -
读书笔记 第一章题解~ http://www.freopen.com/?p=10382 第二章题解~最后两个通用系统的练习没写,代码量太大~ http://www.freopen.com/?p=10385 第三章已经看完了,不过最近比较忙,练习需要等等再写~ P.S. 建了一个"计算机科学"的QQ群:20076724~欢迎加入!~ 很欢乐的写了一个C++版的解释器,各种泄漏内存.可以深入探讨一下,如果不存在赋值语句,应该可以保证永远不存在环结构,从而使用计数器来管理内存. (4回应)
2011-04-05 04:40 9人喜欢
读书笔记第一章题解~ http://www.freopen.com/?p=10382第二章题解~最后两个通用系统的练习没写,代码量太大~ http://www.freopen.com/?p=10385第三章已经看完了,不过最近比较忙,练习需要等等再写~P.S.建了一个"计算机科学"的QQ群:20076724~欢迎加入!~很欢乐的写了一个C++版的解释器,各种泄漏内存.可以深入探讨一下,如果不存在赋值语句,应该可以保证永远不存在环结构,从而使用计数器来管理内存.4回应 2011-04-05 04:40 -
勘误,第一段的最后一行: 『也就是说,当且仅当一个或门的两个输入信号之一为 1 时,其输出为 1 ,否则其输出就是 0 。』 原文(http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-22.html#%_sec_3.3.4): 『That is, the output will become 1 if at least one of the input signals is 1; otherwise the output will become 0.』 这里译者将 OR 的意思译成了 XOR 的意思了,正确翻译应该是: 『。。。如果... (4回应)
2012-05-15 09:59 2人喜欢
勘误,第一段的最后一行:『也就是说,当且仅当一个或门的两个输入信号之一为 1 时,其输出为 1 ,否则其输出就是 0 。』原文(http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-22.html#%_sec_3.3.4):『That is, the output will become 1 if at least one of the input signals is 1; otherwise the output will become 0.』这里译者将 OR 的意思译成了 XOR 的意思了,正确翻译应该是:『。。。如果至少有一个输入信号为 1 ,那么输出为 1 ;否则。。。』4回应 2012-05-15 09:59
-
读书笔记 第一章题解~ http://www.freopen.com/?p=10382 第二章题解~最后两个通用系统的练习没写,代码量太大~ http://www.freopen.com/?p=10385 第三章已经看完了,不过最近比较忙,练习需要等等再写~ P.S. 建了一个"计算机科学"的QQ群:20076724~欢迎加入!~ 很欢乐的写了一个C++版的解释器,各种泄漏内存.可以深入探讨一下,如果不存在赋值语句,应该可以保证永远不存在环结构,从而使用计数器来管理内存. (4回应)
2011-04-05 04:40 9人喜欢
读书笔记第一章题解~ http://www.freopen.com/?p=10382第二章题解~最后两个通用系统的练习没写,代码量太大~ http://www.freopen.com/?p=10385第三章已经看完了,不过最近比较忙,练习需要等等再写~P.S.建了一个"计算机科学"的QQ群:20076724~欢迎加入!~很欢乐的写了一个C++版的解释器,各种泄漏内存.可以深入探讨一下,如果不存在赋值语句,应该可以保证永远不存在环结构,从而使用计数器来管理内存.4回应 2011-04-05 04:40 -
读前note,by 老赵: http://www.cnblogs.com/JeffreyZhao/archive/2009/07/15/recommended-reading-2-sicp.html "看一本书,不一定要从头到底全部看完。SICP全书共分五章,我建议可以认真阅读前三章——没时间的话就精读前两章“过程抽象”与“数据抽象”。如果您有时间的话,也可以把第四章看完。至于第五章,有人说是SICP的精华所在,但是我认为啃下第五章的投入产出比相对前几章来说就相对较低了(第四和第五章使用Lis...
2011-12-07 12:55
读前note,by 老赵: http://www.cnblogs.com/JeffreyZhao/archive/2009/07/15/recommended-reading-2-sicp.html"看一本书,不一定要从头到底全部看完。SICP全书共分五章,我建议可以认真阅读前三章——没时间的话就精读前两章“过程抽象”与“数据抽象”。如果您有时间的话,也可以把第四章看完。至于第五章,有人说是SICP的精华所在,但是我认为啃下第五章的投入产出比相对前几章来说就相对较低了(第四和第五章使用Lisp实现一个解释器及一个简单的CPU逻辑实现,很难,不过这的确是Lisp最“美”最能体现出完备性的地方)。如果,我是说如果,您在阅读前两章时较为困难,也不妨先看一下《Simply Scheme: Introducing Computer Science》,您可以把它看作是SICP的基础5。"回应 2011-12-07 12:55
-
adsk (No such person)
这里主要关注迭代过程。 如果要实现f(n),由公式可知我们需要f(n-1),f(n-2),f(n-3),最终f(n)都可由f(0),f(1),f(2)表示(n > 3时),给个例子 f(3)=f(2)+2f(1)+3f(0) f(4)=f(3)+2f(2)+3f(1) f(5)=f(4)+2f(3)+3f(2) 也就是说,如果我们要表示f(n),首先我们要表示f(3),然后表示f(4),依次继续,而f(4)需要用f(1),f(2),f(3)来表示,f(3)需要f(0),f(1),f(2)来表示 (define (fo...2017-09-25 23:54
这里主要关注迭代过程。
如果要实现f(n),由公式可知我们需要f(n-1),f(n-2),f(n-3),最终f(n)都可由f(0),f(1),f(2)表示(n > 3时),给个例子
f(3)=f(2)+2f(1)+3f(0)
f(4)=f(3)+2f(2)+3f(1)
f(5)=f(4)+2f(3)+3f(2)
也就是说,如果我们要表示f(n),首先我们要表示f(3),然后表示f(4),依次继续,而f(4)需要用f(1),f(2),f(3)来表示,f(3)需要f(0),f(1),f(2)来表示
(define (foo n) #函数名称 (define (foo-iter a b c n) #给了四个参数,n是我们需要计算的数,同时也用于降阶,使程序终止 (if (< n 3) a (foo-iter (+ a (* 2 b) (* 3 c)) a b (- n 1)))) #表示计算过程,进行迭代 (if (< n 3) n (foo-iter 2 1 0 n))) #给定了基数
回应 2017-09-25 23:54 -
1.3 #lang sicp (define (min a b) (if (< a b) a b)) (define (twoGreaterSum a b c) (- (+ a b c) (min (min a b) c))) (twoGreaterSum 1 2 3) 这里取巧了下。感觉题目貌似有点意思。继续试试看吧。 1.4 题目想表达的意思感觉应该是 方法也可以当成值来求。 这和一般的编程语言的确思维有所不同。 1.5 一上来没有理解透。想表达的就是两种求值模式的不同。 1.6 和1.5类似。函数调用前先eval参数,然后进行过程。而if则不是...
2017-06-27 19:42
1.3
#lang sicp
(define (min a b) (if (< a b) a b))
(define (twoGreaterSum a b c) (- (+ a b c) (min (min a b) c)))
(twoGreaterSum 1 2 3)
这里取巧了下。感觉题目貌似有点意思。继续试试看吧。
1.4
题目想表达的意思感觉应该是 方法也可以当成值来求。
这和一般的编程语言的确思维有所不同。
1.5
一上来没有理解透。想表达的就是两种求值模式的不同。
1.6
和1.5类似。函数调用前先eval参数,然后进行过程。而if则不是这样。基本的语法,没有什么特殊的地方。
1.7~1.8 先忽略 偏数学
1.9 深入了点语法,本职还是讲normal order 和app order的区别
1.10 高中函数
1.11 本来想把递归提到最外层,但是抽象思维不够。借助了Fin数列。从0开始。
代码如下:
#lang racket
(define (f n)
(if(< n 3) n
(+ (f (- n 1)) (* 2 (f (- n 2))) (* 3 (f (- n 3)))))
)
(define (f1 n)
(if (< n 3) n
(iter 2 2 0 (- n 3))
)
)
(define (iter a b c n)
(if(= n 0) (+ a b c)
(iter (+ a b c) (* 2 a) (/ (* 3 b) 2) (- n 1))))
(f 10)
(f1 10)
回应 2017-06-27 19:42 -
看到了第一章习题了 想练下手 以下是配置 参考答案 http://community.schemewiki.org/?SICP-Solutions 配置参考了stackoverflow https://stackoverflow.com/questions/260685/what-is-the-best-scheme-implementation-for-working-through-sicp 第二个答案 用Dr Racket 然后配一个sicp的插件 http://docs.racket-lang.org/sicp-manual/index.html 第二题题解 感觉效果很不错的样子。
2017-06-27 18:30
看到了第一章习题了 想练下手 以下是配置
参考答案 http://community.schemewiki.org/?SICP-Solutions
配置参考了stackoverflow https://stackoverflow.com/questions/260685/what-is-the-best-scheme-implementation-for-working-through-sicp 第二个答案
用Dr Racket 然后配一个sicp的插件 http://docs.racket-lang.org/sicp-manual/index.html
第二题题解

感觉效果很不错的样子。
回应 2017-06-27 18:30
论坛 · · · · · ·
| SICP in Python 中文版 链接 | 来自(・ω・) | 2017-12-28 | |
| 是不是需要先学习一下lisp呢? | 来自小兵 | 1 回应 | 2017-07-12 |
| 这本书使用的scheme 方言是? | 来自beckha | 1 回应 | 2017-07-12 |
| 有个疑问 | 来自wywlnenljh | 2017-06-05 | |
| SICP资源汇总 | 来自Kai | 30 回应 | 2016-01-01 |
> 浏览更多话题
在哪儿买这本书 · · · · · ·
这本书的其他版本 · · · · · · ( 全部5 )
- McGraw-Hill Science/Engineering/Math版 1996-8-1 / 3人读过
- The MIT Press版 1996-7-25 / 410人读过
- The MIT Press版 1996-9-1 / 10人读过 / 有售
- 上海交通大学出版社版 1988-8
以下豆列推荐 · · · · · · ( 全部 )
- 豆瓣评分>9的书(100人以上) (阿獠)
- 豆瓣高分书2500本:千人打分不低于8分 (偶就是那个鬼)
- 负责任推荐:算法学习经典 (atyuwen)
- 北京大学数学学院课程教材 (Kogorou)
- 程序员最应该读的图书(中译版) (hongqn)
谁读这本书?
二手市场
订阅关于计算机程序的构造和解释的评论:
feed: rss 2.0











0 有用 蓬山远 2010-01-02
越往后越发看不懂,晕乎乎
0 有用 狮子真好吃啊 2005-12-23
hard
5 有用 masterplan 2016-01-15
终于结束了,12年8月收的书,历时3年半。 现在开始动手做一个解释器。
1 有用 [已注销] 2010-03-08
那么让我们用咒语来操纵这些神灵
0 有用 pluskid 2010-05-23
被誉为经典的 SICP ,但是我总觉得似乎还是不能打五星的。
0 有用 万饿的小尾巴 2018-01-01
确实经典 读了让我重新燃起做科学家的梦想
0 有用 Pluto 2018-01-01
这本书在我心中的地位和CSAPP一样
0 有用 放下手机 2017-12-29
oh 嘿 这是一年级CS课的课本儿来着 当时没有好好读 当时没有好好读过任何一本课本。现在的我已经做好了觉悟!
0 有用 小妖怪 2017-12-20
刚看的时候并不太懂,说的好像现在就懂了一样。
0 有用 雨蟄 2017-12-11
看了两章,习题完成,第三章实在看不下去。。