文章目录

    • 适读人群
    • 目 录

《计算机程序的构造和解释》(Structure and Interpretation of Computer 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 出版时间:20240201

由于本书的根源和作者的意图,本书的基本内容和结构都来自SICP,许多一般性的讨论直接来自原书,但也有许多地方针对JavaScript做了一些调整和修改。本书比较好地反映了SICP的思想,是一本非常好的学习计算机科学技术的读物,值得每一个关心计算机领域,并有心在这个领域中深入学习和努力工作的人士阅读学习。

正如作者所言,这本书并不想作为JavaScript的入门教科书。书中对JavaScript语言的介绍远非完整,读者不应该希冀通过阅读本书学习JavaScript编程。但另一方面,由于本书的宗旨和内容,对它的学习一定会有助于读者学习JavaScript(一般而言,学习任何常见的编程语言,如Java、Python或C)。如果读者学过JavaScript(或其他编程语言),阅读这本书能帮助你更好地理解程序设计和一般的软件开发,从而有可能在这些领域中做得更出色、更高效、更得心应手。如果本书是你学习计算机科学技术的第一本书(或者学的第一门课),这段学习经历能为你今后的学习建立一个坚实的基础,帮助你更顺利地度过这段专业学习。无论如何,认真地阅读这本书,都是一件非常值得做的事情。

对于本书的学习,必须和相应的实际编程、用计算机解决问题的实践相结合。只读不做,当然不可能真正领悟计算机科学技术的真谛。另一方面,只是抄录、运行和试验书中给出代码,也不能得到其中的真传。作为这本书的真正有心的读者,你必须亲自一次次地经历使用计算机(通过编程)解决问题的实践过程。本书的作者已经为读者提供了学习所需的许多材料和资源,希望读者好好利用。

适读人群

  • 计算机、电子工程及相关专业本科生

目 录

Structure and Interpretation of Computer Programs: JavaScript Edition译者序序言1984年版《计算机程序的构造和解释》的原序前言1996SICP2版的前言1984SICP1版的前言致谢1996SICP2版的致谢第1章 构造函数抽象11.1 程序设计的基本元素21.1.1 表达式31.1.2 命名和环境41.1.3 运算符组合式的求值51.1.4 复合函数61.1.5 函数应用的代换模型81.1.6 条件表达式和谓词111.1.7 实例:用牛顿法求平方根141.1.8 函数作为黑箱抽象171.2 函数与它们产生的计算201.2.1 线性递归和迭代211.2.2 树形递归241.2.3 增长的阶281.2.4 求幂291.2.5 最大公约数311.2.6 实例:素数检测331.3 用高阶函数做抽象371.3.1 函数作为参数371.3.2 用lambda表达式构造函数411.3.3 函数作为通用的方法451.3.4 函数作为返回值482章 构造数据抽象542.1 初识数据抽象562.1.1 实例:有理数的算术运算562.1.2 抽象屏障592.1.3 数据是什么意思?612.1.4 扩展练习:区间算术632.2 层次性数据和闭包性质652.2.1 序列的表示662.2.2 层次结构722.2.3 序列作为约定的接口762.2.4 实例:一个图形语言862.3 符号数据962.3.1 字符串962.3.2 实例:符号求导972.3.3 实例:集合的表示1022.3.4 实例:Huffman编码树1082.4 抽象数据的多重表示1142.4.1 复数的表示1152.4.2 带标签数据1182.4.3 数据导向的程序设计和可   加性1212.5 包含通用型操作的系统1272.5.1 通用型算术运算1282.5.2 不同类型数据的组合1312.5.3 实例:符号代数1363章 模块化、对象和状态1463.1 赋值和局部状态1463.1.1 局部状态变量1473.1.2 引进赋值带来的利益1523.1.3 引进赋值的代价1553.2 求值的环境模型1593.2.1 求值规则1603.2.2 简单函数的应用1633.2.3 框架作为局部状态的仓库1653.2.4 内部定义1693.3 用变动数据建模1723.3.1 可变的表结构1723.3.2 队列的表示1793.3.3 表格的表示1823.3.4 数字电路模拟器1873.3.5 约束传播1963.4 并发:时间是一个本质问题2053.4.1 并发系统中时间的性质2063.4.2 控制并发的机制2093.5 流2183.5.1 流作为延迟的表2193.5.2 无穷流2253.5.3 流计算模式的应用2303.5.4 流和延迟求值2383.5.5 函数式程序的模块化和对象   的模块化2424章 元语言抽象2464.1 元循环求值器2484.1.1 求值器的核心部分2494.1.2 组件的表示2544.1.3 求值器的数据结构2634.1.4 把求值器作为程序运行2674.1.5 以数据为程序2704.1.6 内部声明2724.1.7 分离语法分析与执行2754.2 惰性求值2804.2.1 正则序和应用序2804.2.2 采用惰性求值的解释器2814.2.3 流作为惰性的表2884.3 非确定性计算2894.3.1 搜索和amb2914.3.2 非确定性程序实例2944.3.3 实现amb求值器3004.4 逻辑程序设计3094.4.1 演绎式信息检索3114.4.2 查询系统如何工作3204.4.3 逻辑程序设计   是数理逻辑吗?3264.4.4 实现查询系统3305章 寄存器机器里的计算3505.1 寄存器机器的设计3515.1.1 一种描述寄存器机器的语言3525.1.2 机器设计的抽象3555.1.3 子程序3575.1.4 使用栈实现递归3605.1.5 指令总结3645.2 寄存器机器的模拟器3655.2.1 机器模型3665.2.2 汇编器3695.2.3 指令和它们的执行函数3725.2.4 监视机器执行3785.3 存储分配和废料收集3805.3.1 把存储器看作向量3805.3.2 维持一种无穷存储的假象3845.4 显式控制的求值器3895.4.1 分派器和基本求值3905.4.2 函数应用的求值3935.4.3 块结构、赋值和声明4005.4.4 求值器的运行4015.5 编译4055.5.1 编译器的结构4075.5.2 组件的编译4115.5.3 编译函数应用和返回语句4175.5.4 指令序列的组合4235.5.5 编译代码的实例4265.5.6 词法地址4335.5.7 将编译代码与求值器接口435参考文献441索引447练习列表490