SICP大纲

本文是《计算机程序的构造和解释》的笔记

序中其实也包含了很多睿智的观点,值得细细体会。

  • “每一个计算机程序都是现实中的或者精神中的某个过程的一个模型”
  • “我们很少能通过自己的程序将这种过程模拟到永远令人满意的程度”
  • “不幸的是,随着程序变得更大更复杂(实际上它们几乎总是如此),这种描述本身的适宜性,一致性和正确性也都变得非常值得怀疑了”
  • “如何利用一些已经证明和有价值的组织技术,将这些结构组合成更大的结构,这些都是至关重要的”
  • “将我们的Lisp程序变换到‘机器’程序的过程本身也是抽象模型,是通过程序设计做出来的。研究和构造它们,能使人更加深刻地理解与任何模型的程序设计有关的程序组织问题”
  • “计算机永远都不够大也不够快。硬件技术的每一次突破都带来了更大规模的程序设计事业,新的组织原理,以及更加丰富的抽象模型。每个读者都应该反复问自己‘到哪里才是头儿,到哪里才是头儿’——但是不要问的过于频繁,以免忽略了程序设计的乐趣,使自己陷入一种喜忧参半的呆滞状态中”
  • “Pascal是为了建造金字塔——壮丽辉煌,令人震撼,是由各就其位的沉重巨石筑起的静态结构,而Lisp则是为了构造有机体——同样壮丽辉煌并令人震撼,由各就其位但却永不静止的无数简单的有机体片段构成的动态结构”
  • “Lisp程序大大抬高了函数库的地位,使其可用性超越了催生它们的那些具体应用”
  • “采用100个函数在一种数据结构上操作,远远优于用10个函数在10个数据结构上操作。作为这些情况的必然后果,金字塔矗立在那里千年不变,而有机体则必须演化,否则会死亡”
  • “在任何非常大的程序设计工作中,一条有用的组织原则就是通过发明新语言,去控制和隔离作业模块之间的信息流动”

过程抽象

  • 应用序和正则序
  • 递归和迭代在展开式上的区分,以及尾递归
  • 过程(函数)作为入参、返回值
  • 匿名函数和高阶函数

数据抽象

  • 构造函数和方法函数
  • conscarcdr
  • 序对和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的编译,检查nextreturn的情况
      • 简单、条件表达式、表达式序列的编译
      • lambda表达式的编译
    • 过程的编译
      • 入参的处理
      • 尾递归
    • 指令序列的组合
    • 代码编译的实例
    • 优化变量查找
      • 词法地址
    • 解释与编译
      • 解释:机器语言 -> 用户程序
      • 编译:用户程序 -> 机器语言

最后吐槽下,书是本好书,就是翻译的不太给力,在有些地方强行提高了理解难度。