名校公开课 / 麻省理工 / 经典

计算机程序的构造和解释

Structure and Interpretation of Computer Programs6.001麻省理工1986 录像(OCW Spring 2005)免费
高阶函数数据抽象状态与环境模型流解释器

这门课学什么

这门课把编程当成控制复杂度的方法,用 Scheme 语言讲。内容包括高阶函数、数据抽象、状态与赋值、流、元语言抽象,以及自己写解释器和编译器。1986 年录像按 SICP 教材顺序讲。

内容摘要

这门课用 Lisp 的方言 Scheme 教编程,但它真正讲的是怎样控制复杂度。录像拍于 1986 年,教材《计算机程序的构造和解释》(SICP)的两位作者艾贝尔森(Harold Abelson)和萨斯曼(Gerald Jay Sussman)轮流主讲。讲座顺序和教材章节一一对应。

课程分 5 个阶段。第 1 阶段(1A–2A)讲过程、过程产生的计算过程和高阶过程。第 2 阶段(2B–4B)讲数据抽象和符号数据,用 Escher 图形语言、符号求导和模式匹配做例子。第 3 阶段(5A–6B)讲赋值、状态和流,比较两种给时间建模的方法。第 4 阶段(7A–8B)讲元循环求值器和逻辑编程,演示一门语言怎样用它自己实现。第 5 阶段(9A–10B)下到机器层,讲寄存器机器、显式控制求值器、编译和垃圾回收。

录像本身不带作业。OCW 的 Spring 2005 页面提供习题集、编程项目和测验,可以配合录像使用。SICP 全文免费公开,书中练习是主要的动手材料。

学完以后,你会把程序看成描述计算过程的语言,而不只是一串指令。你能写高阶函数,能设计抽象层,能读懂解释器和编译器的骨架。这些想法今天仍出现在函数式编程、领域专用语言和语言实现中。

两位讲者风格不同。艾贝尔森讲得稳,重视概念的来龙去脉。萨斯曼讲得快,常在黑板上即兴推演。录像画质老,但信息密度高,建议边看边读书。

为什么值得学

SICP 是最有影响力的计算机教材之一。原作者亲自讲课,几十年后程序员还在学。

课程信息

学校
麻省理工(MIT)
课程号
6.001
讲师
哈罗德·艾贝尔森(Harold Abelson)、杰拉尔德·杰伊·萨斯曼(Gerald Jay Sussman)
学期
1986 录像(OCW Spring 2005)
平台
MIT OpenCourseWare
费用
免费
难度
入门
学时
20 讲(YouTube 上拆成 40 段)
先修
无(有编程经验更好)。
材料
视频、讲义、考试、教材
许可证
CC BY-NC-SA 4.0
去课程主页 ↗看视频 ↗
课程是英文的。本页的介绍、摘要和大纲由极客教育原创撰写,讲次标题为中文意译。开课时间、收费和链接以官方页面为准。

课程大纲 · 共 20 节

大纲依据:OCW Spring 2005 收录的 1986 年讲座录像列表(20 讲,编号 1A–10B)(查看原始页面 ↗)

  1. 1A
    概述与 Lisp 入门Overview and Introduction to Lisp

    说明计算机科学研究的是“怎么做”的知识,介绍 Lisp 的基本元素、组合手段和抽象手段。

  2. 1B
    过程与计算过程;代换模型Procedures and Processes; Substitution Model

    用代换模型解释过程怎样求值,比较递归和迭代两种计算过程。

  3. 2A
    高阶过程Higher-order Procedures

    把过程当作参数和返回值,用求和、不动点和牛顿法做例子。

  4. 2B
    复合数据Compound Data

    用有理数算术说明数据抽象,引入序对和抽象屏障。

  5. 3A
    Henderson 的 Escher 图形语言Henderson Escher Example

    用一门画图小语言演示怎样设计嵌入式语言的基本元素和组合手段。

  6. 3B
    符号求导与引用Symbolic Differentiation; Quotation

    用符号求导程序引入引用和符号数据,讨论表达式的表示和化简。

  7. 4A
    模式匹配与基于规则的代换Pattern Matching and Rule-based Substitution

    把求导规则写成数据,构造一个通用的模式匹配和代换系统。

  8. 4B
    通用操作Generic Operators

    用复数的多种表示讨论数据导向编程和通用操作的分派。

  9. 5A
    赋值、状态与副作用Assignment, State, and Side-effects

    引入赋值以后代换模型不再适用,改用环境模型解释求值。

  10. 5B
    计算对象Computational Objects

    用数字电路模拟器演示带状态的对象怎样组合,并引入可变数据结构。

  11. 6A
    流(上)Streams, Part 1

    用流把序列操作组合起来,介绍延迟求值的实现方法。

  12. 6B
    流(下)Streams, Part 2

    构造无穷流,讨论用流代替状态给时间建模的利弊。

  13. 7A
    元循环求值器(上)Metacircular Evaluator, Part 1

    用 Lisp 写出 Lisp 的 eval 和 apply,展示解释器的核心循环。

  14. 7B
    元循环求值器(下)Metacircular Evaluator, Part 2

    在求值器上修改和扩展语言特性,讨论不同设计选择的后果。

  15. 8A
    逻辑编程(上)Logic Programming, Part 1

    介绍查询语言,用事实和规则描述关系,而不是描述步骤。

  16. 8B
    逻辑编程(下)Logic Programming, Part 2

    讲查询系统的实现:模式匹配、合一(unification)和基于流的搜索。

  17. 9A
    寄存器机器Register Machines

    把 Lisp 过程翻译成寄存器机器的数据通路和控制器,并用栈实现递归。

  18. 9B
    显式控制求值器Explicit-control Evaluator

    用寄存器机器实现完整的 Lisp 求值器,说明尾递归为什么不占用栈空间。

  19. 10A
    编译Compilation

    把解释器改造成编译器,比较两者的效率差异。

  20. 10B
    存储分配与垃圾回收Storage Allocation and Garbage Collection

    讲表结构在内存中的表示,以及垃圾回收的基本算法。

麻省理工的其他经典课