SICP大纲
本文是《计算机程序的构造和解释》的笔记
序
序中其实也包含了很多睿智的观点,值得细细体会。
- “每一个计算机程序都是现实中的或者精神中的某个过程的一个模型”
- “我们很少能通过自己的程序将这种过程模拟到永远令人满意的程度”
- “不幸的是,随着程序变得更大更复杂(实际上它们几乎总是如此),这种描述本身的适宜性,一致性和正确性也都变得非常值得怀疑了”
- “如何利用一些已经证明和有价值的组织技术,将这些结构组合成更大的结构,这些都是至关重要的”
- “将我们的Lisp程序变换到‘机器’程序的过程本身也是抽象模型,是通过程序设计做出来的。研究和构造它们,能使人更加深刻地理解与任何模型的程序设计有关的程序组织问题”
- “计算机永远都不够大也不够快。硬件技术的每一次突破都带来了更大规模的程序设计事业,新的组织原理,以及更加丰富的抽象模型。每个读者都应该反复问自己‘到哪里才是头儿,到哪里才是头儿’——但是不要问的过于频繁,以免忽略了程序设计的乐趣,使自己陷入一种喜忧参半的呆滞状态中”
- “Pascal是为了建造金字塔——壮丽辉煌,令人震撼,是由各就其位的沉重巨石筑起的静态结构,而Lisp则是为了构造有机体——同样壮丽辉煌并令人震撼,由各就其位但却永不静止的无数简单的有机体片段构成的动态结构”
- “Lisp程序大大抬高了函数库的地位,使其可用性超越了催生它们的那些具体应用”
- “采用100个函数在一种数据结构上操作,远远优于用10个函数在10个数据结构上操作。作为这些情况的必然后果,金字塔矗立在那里千年不变,而有机体则必须演化,否则会死亡”
- “在任何非常大的程序设计工作中,一条有用的组织原则就是通过发明新语言,去控制和隔离作业模块之间的信息流动”
过程抽象
- 应用序和正则序
- 递归和迭代在展开式上的区分,以及尾递归
- 过程(函数)作为入参、返回值
- 匿名函数和高阶函数
数据抽象
- 构造函数和方法函数
cons
和car
、cdr
- 序对和list(层次化数据)
- 表操作和表映射
- 序列化操作
- 符号数据(类似字符串)
- 数据的多种表示(类型)与通用操作
模块化、对象和状态
- 面向对象和面向流
- 从时间角度理解赋值和局部状态
- 赋值的利与弊
- 赋值带来的环境模型解释(作用域、作用域链)
- 局部状态
- 作用域模型的解释
- 变动的表
- 区分共享和相等(相同的指针、相同的值)
- 队列与键值对
- 描述约束系统
- 并发(交错进行的读写操作)
- 串行化和串行化组
- mutex(mutual exclusion)和实现
- 死锁(多共享资源)
- 按顺序获取资源列表
- 死锁恢复
- 屏障同步
- 流
- 延时求值的表序列
- 延时求值的原理
- 无穷流的构造
- 流操作和组合
元语言设计
- 求值器(解释器)的工作与意义
- 在基本过程上提供组合与抽象构建一个语言
- 表达式的嵌套
- 变量维护
- 过程复合
- 在基本过程上提供组合与抽象构建一个语言
- 求值器内核
- eval 过程体解释
- apply 过程求值解释
- 表达式规范化和实现 / 派生表达式
- 环境模型的数据结构
- 求值器程序初始化
- 数据即程序
- 图灵机和停机问题
- 内部定义
- 内部定义是否应该具有时序
- Y结合子与lambda演算
- 语法分析与执行分离
- 惰性求值
- thunk化,关联表达式和环境
- 惰性的表
- 非确定性求值(满足约束的所有可行解)
- amb和自动回溯
- amb实现,成功与失败继续过程
- 逻辑语言设计
- 类SQL语言基于amb的实现
解释与编译
- 机器描述
- 基本指令与子程序(label)
- 堆栈实现递归
- 基本指令的实现
- 类汇编语言
- 内存管理
- 表与堆栈的实现
- garbage collection机制
- 解释
- 基础操作实现
- 尾递归优化解释
- 编译
- 与解释有何区别,各自优势
- env/argl/proc/val/continue寄存器
- 编译器结构
- 语法分派
- 入参:target(存储表达式值的寄存器)与linkage(continue寄存器)
- 指令序列的结构与构造,分析指令序列,
preserving
机制避免无谓的堆栈操作
- 表达式的编译
- linkage的编译,检查
next
或return
的情况 - 简单、条件表达式、表达式序列的编译
- lambda表达式的编译
- linkage的编译,检查
- 过程的编译
- 入参的处理
- 尾递归
- 指令序列的组合
- 代码编译的实例
- 优化变量查找
- 词法地址
- 解释与编译
- 解释:机器语言 -> 用户程序
- 编译:用户程序 -> 机器语言
最后吐槽下,书是本好书,就是翻译的不太给力,在有些地方强行提高了理解难度。