《计算机程序的构造和解释》(Structure and Interpretation of ***puter Programs,简记为SICP)是MIT的基础课教材,出版后引起计算机教育界的广泛关注,对推动全世界大学计算机科学技术教育的发展和成熟产生了很大影响。这本书的第1版于1984年出版,第2版于1996年出版,至今已被全世界100多所大学采用为教材,其中包括斯坦福大学、普林斯顿大学、牛津大学等。
书号: 9787111630548 书号:9787111630548 书号:9787111630548
出版时间: 2019.07.01 出版时间:2019.07.01 出版时间:2019.07.01
机械工业出版社把SICP(第2版)引进中国,于2004年出版,至今已近20年了。令人感兴趣的是,SICP至今仍然受到国内关心计算机科学技术的人们,特别是计算机专业的优秀学生和青年计算机工作者的关注。
与许多计算机科学领域的入门教材不同,SICP的最主要关注点并不在基础语言中各种编程结构的形式和意义,也没有深入讨论巧妙或深刻的算法。与众不同地,一方面,SICP注目于帮助读者理解基于计算的观点看世界、看问题的重要性,掌握相关的基本概念和观点,建立基于计算思考问题的习惯,也就是今天人们常说的计算思维。另一方面,SICP也深入讨论了通过计算的方式处理和解决问题时必须掌握的主要技术与方法,最重要的就是分解问题和组织计算,以及建立和使用抽象的各种技术与方法。
SICP的章节目录清晰地反映了作者的基本想法:
第1、2两章分别讨论函数(或过程)抽象和数据抽象的作用,它们的建立和使用;
第3章讨论抽象数据对象本身的状态和变化,相关的模块化的问题及其在计算实践中的重要性;
第4章讨论元语言抽象,也就是设计和实现面向应用的新语言的问题;
第5章可以看作前面讨论的应用,而应用的对象问题就是JavaScript语言在寄存器机器上的实现。这里的寄存器机器是现代计算机的抽象模型,这里的讨论也说明了抽象的高级语言如何落地。
读者现在拿在手里的这本书是SICP的一个改编本(SCIP JS)。与SICP的不同之处,就在于这个改编本用更多计算机工作者熟悉的JavaScript语言作为讨论的工具,而没有用原SICP里使用的Scheme语言。因此,这里程序实例的形式更接近各种常规的编程语言,可能更容易被更多读者接受。本书的内容是原SICP的翻版,作者编写本书的基本目标是尽可能完整准确地反映原书的宗旨和精神,同时又使这些能被更多的人理解和重视。
书号: 9787111734635 书号:9787111734635 书号:9787111734635
出版时间: 2024 − 02 − 01 出版时间:2024-02-01 出版时间:2024−02−01
由于本书的根源和作者的意图,本书的基本内容和结构都来自SICP,许多一般性的讨论直接来自原书,但也有许多地方针对JavaScript做了一些调整和修改。本书比较好地反映了SICP的思想,是一本非常好的学习计算机科学技术的读物,值得每一个关心计算机领域,并有心在这个领域中深入学习和努力工作的人士阅读学习。
正如作者所言,这本书并不想作为JavaScript的入门教科书。书中对JavaScript语言的介绍远非完整,读者不应该希冀通过阅读本书学习JavaScript编程。但另一方面,由于本书的宗旨和内容,对它的学习一定会有助于读者学习JavaScript(一般而言,学习任何常见的编程语言,如Java、Python或C)。如果读者学过JavaScript(或其他编程语言),阅读这本书能帮助你更好地理解程序设计和一般的软件开发,从而有可能在这些领域中做得更出色、更高效、更得心应手。如果本书是你学习计算机科学技术的第一本书(或者学的第一门课),这段学习经历能为你今后的学习建立一个坚实的基础,帮助你更顺利地度过这段专业学习。无论如何,认真地阅读这本书,都是一件非常值得做的事情。
对于本书的学习,必须和相应的实际编程、用计算机解决问题的实践相结合。只读不做,当然不可能真正领悟计算机科学技术的真谛。另一方面,只是抄录、运行和试验书中给出代码,也不能得到其中的真传。作为这本书的真正有心的读者,你必须亲自一次次地经历使用计算机(通过编程)解决问题的实践过程。本书的作者已经为读者提供了学习所需的许多材料和资源,希望读者好好利用。
适读人群
- 计算机、电子工程及相关专业本科生
目 录
Structure and Interpretation of ***puter Programs: JavaScript Edition
译者序
序言
1984年版《计算机程序的构造和解释》的原序
前言
1996年SICP第2版的前言
1984年SICP第1版的前言
致谢
1996年SICP第2版的致谢
第1章 构造函数抽象1
1.1 程序设计的基本元素2
1.1.1 表达式3
1.1.2 命名和环境4
1.1.3 运算符组合式的求值5
1.1.4 复合函数6
1.1.5 函数应用的代换模型8
1.1.6 条件表达式和谓词11
1.1.7 实例:用牛顿法求平方根14
1.1.8 函数作为黑箱抽象17
1.2 函数与它们产生的计算20
1.2.1 线性递归和迭代21
1.2.2 树形递归24
1.2.3 增长的阶28
1.2.4 求幂29
1.2.5 最大公约数31
1.2.6 实例:素数检测33
1.3 用高阶函数做抽象37
1.3.1 函数作为参数37
1.3.2 用lambda表达式构造函数41
1.3.3 函数作为通用的方法45
1.3.4 函数作为返回值48
第2章 构造数据抽象54
2.1 初识数据抽象56
2.1.1 实例:有理数的算术运算56
2.1.2 抽象屏障59
2.1.3 数据是什么意思?61
2.1.4 扩展练习:区间算术63
2.2 层次性数据和闭包性质65
2.2.1 序列的表示66
2.2.2 层次结构72
2.2.3 序列作为约定的接口76
2.2.4 实例:一个图形语言86
2.3 符号数据96
2.3.1 字符串96
2.3.2 实例:符号求导97
2.3.3 实例:集合的表示102
2.3.4 实例:Huffman编码树108
2.4 抽象数据的多重表示114
2.4.1 复数的表示115
2.4.2 带标签数据118
2.4.3 数据导向的程序设计和可
加性121
2.5 包含通用型操作的系统127
2.5.1 通用型算术运算128
2.5.2 不同类型数据的组合131
2.5.3 实例:符号代数136
第3章 模块化、对象和状态146
3.1 赋值和局部状态146
3.1.1 局部状态变量147
3.1.2 引进赋值带来的利益152
3.1.3 引进赋值的代价155
3.2 求值的环境模型159
3.2.1 求值规则160
3.2.2 简单函数的应用163
3.2.3 框架作为局部状态的仓库165
3.2.4 内部定义169
3.3 用变动数据建模172
3.3.1 可变的表结构172
3.3.2 队列的表示179
3.3.3 表格的表示182
3.3.4 数字电路模拟器187
3.3.5 约束传播196
3.4 并发:时间是一个本质问题205
3.4.1 并发系统中时间的性质206
3.4.2 控制并发的机制209
3.5 流218
3.5.1 流作为延迟的表219
3.5.2 无穷流225
3.5.3 流计算模式的应用230
3.5.4 流和延迟求值238
3.5.5 函数式程序的模块化和对象
的模块化242
第4章 元语言抽象246
4.1 元循环求值器248
4.1.1 求值器的核心部分249
4.1.2 组件的表示254
4.1.3 求值器的数据结构263
4.1.4 把求值器作为程序运行267
4.1.5 以数据为程序270
4.1.6 内部声明272
4.1.7 分离语法分析与执行275
4.2 惰性求值280
4.2.1 正则序和应用序280
4.2.2 采用惰性求值的解释器281
4.2.3 流作为惰性的表288
4.3 非确定性计算289
4.3.1 搜索和amb291
4.3.2 非确定性程序实例294
4.3.3 实现amb求值器300
4.4 逻辑程序设计309
4.4.1 演绎式信息检索311
4.4.2 查询系统如何工作320
4.4.3 逻辑程序设计
是数理逻辑吗?326
4.4.4 实现查询系统330
第5章 寄存器机器里的计算350
5.1 寄存器机器的设计351
5.1.1 一种描述寄存器机器的语言352
5.1.2 机器设计的抽象355
5.1.3 子程序357
5.1.4 使用栈实现递归360
5.1.5 指令总结364
5.2 寄存器机器的模拟器365
5.2.1 机器模型366
5.2.2 汇编器369
5.2.3 指令和它们的执行函数372
5.2.4 监视机器执行378
5.3 存储分配和废料收集380
5.3.1 把存储器看作向量380
5.3.2 维持一种无穷存储的假象384
5.4 显式控制的求值器389
5.4.1 分派器和基本求值390
5.4.2 函数应用的求值393
5.4.3 块结构、赋值和声明400
5.4.4 求值器的运行401
5.5 编译405
5.5.1 编译器的结构407
5.5.2 组件的编译411
5.5.3 编译函数应用和返回语句417
5.5.4 指令序列的组合423
5.5.5 编译代码的实例426
5.5.6 词法地址433
5.5.7 将编译代码与求值器接口435
参考文献441
索引447
练习列表490