NoteAI笔记
NoteAI笔记
SICP 计算机程序的构造与解释

SICP 计算机程序的构造与解释

共 29 篇笔记

MIT 6.001《计算机程序的构造与解释》1986 年传奇原版全 20 讲 + 课程导读 + 备选版本笔记:从 Lisp 与代换模型出发,经高阶过程、复合数据、赋值与状态、流、元循环求值器、逻辑编程,直到寄存器机器、显式控制求值器、编译与垃圾回收。

SICP 课程导读:计算机程序的构造与解释(1986 原版)
公开课笔记 · 2026-10-12 09:00:00 HTML

SICP 课程导读:计算机程序的构造与解释(1986 原版)

本集是 MIT 6.001(SICP)1986 传奇课程的导读。它定位课程为 MIT 本科核心课,点明其核心命题——人类如何用抽象控制复杂性。视频梳理了全 20 讲的五大篇章结构,从过程抽象、数据抽象,到状态与流、元语言解释器、逻辑编程,最终抵达寄存器机器与垃圾回收,并给出观看建议。

NoteAI6 评论833 阅读
SICP 第 1 讲:Lisp 导论与课程概览
公开课笔记 · 2026-10-12 09:05:00 HTML

SICP 第 1 讲:Lisp 导论与课程概览

本讲是 SICP 课程的开篇。Abelson 教授首先批判”计算机科学”这个名称,指出其本质是形式化”如何做”的过程性知识(imperative knowledge),而非关于计算机本身。随后介绍课程三大主题:黑盒抽象、约定接口、元语言抽象,并以 Lisp 语言为例讲解原始元素、组合手段与抽象手段,最后通过牛顿法求平方根引出递归定义。

NoteAI3 评论651 阅读
SICP 第 2 讲:过程与代换模型
公开课笔记 · 2026-10-12 09:10:00 HTML

SICP 第 2 讲:过程与代换模型

本讲建立”程序文本”到”过程行为”之间的机械映射——代换模型。通过 sum-of-squares、皮亚诺加法、斐波那契、汉诺塔等例子,演示如何用代换规则一步步推演过程演化,并揭示迭代过程与递归过程在时间/空间复杂度上的本质差异,以及”递归定义 ≠ 递归过程”这一关键洞见。

NoteAI1 评论731 阅读
SICP 第 3 讲:高阶过程
公开课笔记 · 2026-10-12 09:15:00 HTML

SICP 第 3 讲:高阶过程

本讲从「求和」这一简单程序出发,抽出递归程序的共同模式,把「累加什么」(term)与「如何推进」(next)做成参数,得到通用求和过程 sum;进而引入高阶过程——过程可以作为参数传入,也可以作为返回值返回。课程后半段用不动点(fixed-point)、平均阻尼与牛顿法实现平方根,实现 derivative,并以「第一类公民」收束。

NoteAI2 评论859 阅读
SICP 第 4 讲:复合数据
公开课笔记 · 2026-10-12 09:20:00 HTML

SICP 第 4 讲:复合数据

本讲以有理数算术系统为例,引入”数据抽象”这一控制复杂度的核心方法论:通过构造器(constructor)与选择器(selector)建立抽象屏障,把”数据的使用”与”数据的表示”分离。随后引入 cons/car/cdr 作为构造复合数据的”胶水”,并进一步用纯过程(lambda)实现 cons/car/cdr,揭示”数据”与”过程”边界的模糊性。

NoteAI3 评论548 阅读
SICP 第 5 讲:亨德森-埃舍尔图形语言
公开课笔记 · 2026-10-12 09:25:00 HTML

SICP 第 5 讲:亨德森-埃舍尔图形语言

本讲从向量的数据抽象出发,引出闭包(closure)概念与表(list)的约定表示,进而用递归与高阶过程实现 map/for-each。核心部分是 Peter Henderson 设计的图形语言:用过程表示”图片”,把 beside/above/rotate/flip 等组合手段实现为过程,使语言天然具备闭包性;再借助 push 与 repeated 实现递归图形,最终生成埃舍尔式的 Square Limit 图案。

NoteAI6 评论815 阅读
SICP 第 6 讲:符号微分与引用
公开课笔记 · 2026-10-12 09:30:00 HTML

SICP 第 6 讲:符号微分与引用

本讲承接上一讲的数值微分,转向符号微分:直接对代数表达式(而非函数)求导,用递归程序封装微积分教科书中的求导法则。核心要点包括:求导是归约式(reduction)规则、表达式与语言同构(用 Lisp 列表表示代数式)、引用(quote) 机制的必要性,以及通过抽象屏障更换表示层(如内建化简)来改善输出质量。

NoteAI4 评论816 阅读
SICP 第 7 讲:模式匹配与规则代换
公开课笔记 · 2026-10-12 09:35:00 HTML

SICP 第 7 讲:模式匹配与规则代换

本讲从”符号微分规则”出发,提出一个核心思想:不要把规则翻译成程序,而要让计算机理解规则本身。为此设计了一套规则语言(模式变量、骨架、字典),并实现三个组件:匹配器(matcher)、实例化器(instantiator)、控制结构(simplifier)。匹配器把模式与表达式比对生成”字典”,实例化器用字典填充骨架生成新表达式,控制结构则递归遍历表达式、反复套用规则直到不再变化——即一个”垃圾进垃圾出”的递归化简器。

NoteAI1 评论239 阅读
SICP 第 8 讲:通用操作符
公开课笔记 · 2026-10-12 09:40:00 HTML

SICP 第 8 讲:通用操作符

本讲把抽象屏障从「水平」推进到「垂直」:同一种抽象接口存在多种互不兼容的表示时,如何让它们共存而不互相污染。课程以复数算术为例(George 用直角坐标、Martha 用极坐标),依次讲解类型化数据、类型分派(dispatch on type)、数据导向编程与消息传递,再把复数嵌入通用算术系统,最后用多项式与递归类型塔说明这套架构的威力,以及强制类型转换(coercion)的必要性。

NoteAI5 评论226 阅读
SICP 第 9 讲:赋值、状态与副作用
公开课笔记 · 2026-10-12 09:45:00 HTML

SICP 第 9 讲:赋值、状态与副作用

本讲是全课的重大转折点:引入赋值 set! 之后,替换模型被彻底打破,课程被迫重建新的计算模型——环境模型(environment model)。内容涵盖 set! 的语法与「时间」的诞生、两种阶乘写法的对比、define / let / set! 三者的区别,并用「用对象实现模块化」和蒙特卡洛方法估算 π 展示赋值的价值,最后以「不用赋值会导致信息泄漏(leakage)」作反例。

NoteAI6 评论130 阅读
SICP 第 10 讲:计算对象
公开课笔记 · 2026-10-12 09:50:00 HTML

SICP 第 10 讲:计算对象

本讲从”世界中的对象”出发,引出面向对象编程思想,并以数字电路仿真器为例,讲解如何用 LISP 构建嵌入式语言。核心内容包括:原始对象与组合手段、抽象屏障与层次化设计、事件驱动仿真中的信号传播、议程(agenda)与队列(queue)的数据结构实现,以及引入赋值后 cons 的身份(identity)与共享(sharing)问题,最后用纯 lambda 演算实现可变 cons。

NoteAI1 评论814 阅读
SICP 第 11 讲:流(上)
公开课笔记 · 2026-10-12 09:55:00 HTML

SICP 第 11 讲:流(上)

本讲引入「流处理」范式,作为对「对象/状态/赋值」范式的替代。核心思想:把程序拆解为枚举器(enumerate)→ 过滤器(filter)→ 映射(map)→ 累加器(accumulate) 的流水线,用统一的数据结构「流(stream)」连接各部件。流通过 delay(延迟求值)与 force(强制求值)实现按需计算,从而兼顾优雅与效率。

NoteAI6 评论122 阅读
SICP 第 12 讲:流(下)
公开课笔记 · 2026-10-12 10:00:00 HTML

SICP 第 12 讲:流(下)

本讲延续”流”的主题,核心解决三个问题:流元素何时被求值(force 的时机)、如何用流表示无穷序列(整数流、素数流、斐波那契流)、流的信号处理视角(add-streams、scale-stream、积分器)。最后深入探讨延迟求值带来的根本矛盾:normal order 语言虽优雅,但与赋值/副作用不兼容,无法表达迭代,也带来”拖尾问题”和交互式调试困难。老师指出这是计算机科学中一个根本性的难题。

NoteAI6 评论295 阅读
SICP 第 13 讲:元循环求值器(上)
公开课笔记 · 2026-10-12 10:05:00 HTML

SICP 第 13 讲:元循环求值器(上)

本讲在黑板(blackboard)上完整写出一个 Lisp 求值器——即”元循环求值器”(metacircular evaluator)。核心是两个过程:eval(对表达式做分派:数字、符号、quote、lambda、cond、一般应用)与 apply(区分原始过程与复合过程)。随后用环境模型手工”代入”求值一个嵌套 lambda 表达式,并讨论不动点语义:递归定义(如 expt)可以理解为函数的不动点,引出 Y 组合子(Curry 悖论组合子)。

NoteAI0 评论831 阅读
SICP 第 14 讲:元循环求值器(下)
公开课笔记 · 2026-10-12 10:10:00 HTML

SICP 第 14 讲:元循环求值器(下)

本讲以元循环求值器为实验平台,演示如何给语言添加新特性:可变参数过程(用点对语法 x . y 表示)、动态绑定(自由变量在调用者环境求值,导致模块化危机)、以及按名调用/延迟参数(delay/thunk/force 机制)。核心结论是:词法绑定 + 一等过程是保证模块化的正确设计。

NoteAI1 评论751 阅读
SICP 第 15 讲:逻辑编程(上)
公开课笔记 · 2026-10-12 10:15:00 HTML

SICP 第 15 讲:逻辑编程(上)

本讲引入逻辑编程这一全新范式:与传统的”如何做”(how-to)过程式编程相对,逻辑编程关注声明”什么是真的”(what is true)。课程以《创世记》家谱和归并排序逻辑为例,展示同一份声明式知识可回答多种不同方向的问题。随后介绍查询语言(Query Language)的三大要素——原始查询、逻辑组合(and/or/not)、规则抽象,并演示其在人员数据库上的运行。

NoteAI4 评论395 阅读
SICP 第 16 讲:逻辑编程(下)
公开课笔记 · 2026-10-12 10:20:00 HTML

SICP 第 16 讲:逻辑编程(下)

本讲从模式匹配器与原始查询的流式实现讲起,说明 and/or/not 如何通过流的串并联与过滤实现组合,并强调闭包原则。随后讲解规则作为抽象手段、合一器(unifier)的对称匹配机制,最后深入剖析逻辑语言的三大问题:求值顺序导致的死循环、not 的闭世界假设、以及”合一”并非真正的逻辑推理。

NoteAI1 评论637 阅读
SICP 第 17 讲:寄存器机器
公开课笔记 · 2026-10-12 10:25:00 HTML

SICP 第 17 讲:寄存器机器

本讲把程序「物化」成硬件,核心命题是「程序就是机器的描述」。课程用数据通路(data paths)与控制器(controller)搭出寄存器机器,并依次分析三个案例——GCD(迭代过程)、阶乘(递归过程)、双重递归斐波那契,说明栈如何保存与恢复「后续要做的事」,以及为什么尾递归可以不增长栈空间。

NoteAI6 评论269 阅读
SICP 第 18 讲:显式控制求值器
公开课笔记 · 2026-10-12 10:30:00 HTML

SICP 第 18 讲:显式控制求值器

本讲是 6.001 课程的收尾高潮之一:把元循环求值器手工翻译成寄存器机器,用七个寄存器和栈实现整个 LISP。核心在于揭示 eval/apply 循环如何变成显式的顺序寄存器操作,以及尾递归(tail recursion)为何能让语法上递归的过程真正迭代运行、不增长栈空间。所谓”魔法”就此消失。

NoteAI4 评论856 阅读
SICP 第 19 讲:编译
公开课笔记 · 2026-10-12 10:35:00 HTML

SICP 第 19 讲:编译

本讲从上一讲的「显式控制求值器」出发,说明编译器与求值器的本质区别:求值器边分析边执行、必须极度悲观地保存寄存器;编译器把分析做一次、只生成必要的寄存器操作。课程先给出「零阶编译器」(逐条复刻求值器动作),再通过消除 X、UNEV、CONTINUE 等无关寄存器以及冗余的 save/restore,把 19 条指令压缩到 3 条。随后讲解编译器的实现骨架:用 append + preserving 组合代码序列,用「需要/修改寄存器集合」的数据结构推导保存策略,并以递归 factorial 为例展示生成代码,最后讨论内联优化与 Lisp 编译器历史。

NoteAI1 评论482 阅读
SICP 第 20 讲:存储分配与垃圾回收
公开课笔记 · 2026-10-12 10:40:00 HTML

SICP 第 20 讲:存储分配与垃圾回收

本讲揭开 SICP 最后一个”谜团”:cons、car、cdr 这些基本操作在真实机器上如何实现。先用哥德尔编码说明数据可用纯数字表示,再讲线性内存中 car/cdr 数组的实现、自由表分配法,最后深入标记-清扫(mark-sweep)与 Minsky 复制式垃圾回收算法,并以停机问题不可判定为全课收尾。

NoteAI5 评论540 阅读
SICP 第 1 讲(备选版本):Lisp 导论与课程概览
公开课笔记 · 2026-10-12 10:45:00 HTML

SICP 第 1 讲(备选版本):Lisp 导论与课程概览

本讲首先澄清”计算机科学”这个名称的误导性,将计算机科学与几何学类比,指出其本质是形式化”如何做”的过程性知识(imperative knowledge)。随后提出课程三大主题:黑箱抽象、常规接口、元语言抽象。最后完整演示 Lisp 的原始元素、组合手段与抽象手段,包括 define、lambda、cond、if 以及递归定义。

NoteAI3 评论114 阅读
SICP 第 2 讲(备选版本):过程与代换模型
公开课笔记 · 2026-10-12 10:50:00 HTML

SICP 第 2 讲(备选版本):过程与代换模型

本讲建立”程序文本”与”过程行为”之间的桥梁,核心是代换模型:求值组合式时,先求值运算符得到过程、求值运算对象得到实参,再把过程体中的形参代换为实参并求值。通过”求和”与”斐波那契”两个例子,引出迭代过程与递归过程在时间/空间复杂度上的本质区别,并用”官僚机构”类比和微分方程画圆等例子加深直觉。

NoteAI5 评论650 阅读
SICP 第 3 讲(备选版本):高阶过程
公开课笔记 · 2026-10-12 10:55:00 HTML

SICP 第 3 讲(备选版本):高阶过程

本讲从”求和”这一简单程序出发,揭示递归程序的通用模式,进而引入高阶过程的概念——过程可以作为参数传递、作为返回值返回。通过 sum、fixed-point、average-damp、newton-method 等例子,展示如何用高阶过程做抽象,将”做什么”与”怎么做”分离,最终引出”过程作为一等公民”的思想。

NoteAI6 评论234 阅读
SICP 第 4 讲(备选版本):复合数据
公开课笔记 · 2026-10-12 11:00:00 HTML

SICP 第 4 讲(备选版本):复合数据

本讲从程序抽象过渡到数据抽象,以有理数算术系统为例,引入构造器(constructor)与选择器(selector)的愿望思维设计法。随后引出序对(pair)作为数据的粘合剂,介绍 cons/car/cdr 与盒指针表示法。最后用纯过程(lambda)实现 cons/car/cdr,证明数据可完全由过程构建,模糊数据与过程的界限。

NoteAI3 评论844 阅读
SICP 第 5 讲(备选版本):亨德森-埃舍尔图形语言
公开课笔记 · 2026-10-12 11:05:00 HTML

SICP 第 5 讲(备选版本):亨德森-埃舍尔图形语言

本讲从向量的表示(用序对构造)出发,引入表(list)这一表示序列的约定,讲解 map 与 for-each 两个高阶过程;随后以 Peter Henderson 的图形语言为例,展示如何用”图片即过程”的表示方式在 Lisp 中嵌入一门小语言,实现 beside、above、rotate、flip 等组合手段,并借助闭包性质与高阶过程快速构建复杂递归图形(如埃舍尔风格的 square limit)。

NoteAI5 评论831 阅读
SICP 第 6 讲(备选版本):符号微分与引用
公开课笔记 · 2026-10-12 11:10:00 HTML

SICP 第 6 讲(备选版本):符号微分与引用

本讲从”程序即规则”的抽象思想切入,讲解如何用 Lisp 的列表结构表示代数表达式,并编写一个符号微分程序。核心在于:微分规则是”归约规则”,天然适合递归;而积分方向则因规则多重匹配、表达式膨胀而难以机械实现。课程后半段引入引用(quote)这一关键概念,解释”谈论表达式本身”与”求值表达式”的区别,并指出引用会破坏”等量代换”这一语言基本性质。

NoteAI4 评论548 阅读
SICP 第 7 讲(备选版本):模式匹配与规则代换
公开课笔记 · 2026-10-12 11:15:00 HTML

SICP 第 7 讲(备选版本):模式匹配与规则代换

本讲把微积分求导规则与代数化简规则写成”左模式、右骨架”的统一语言,让模式变量(?x、?c、?v)负责匹配,骨架负责实例化替换。核心是三个部件:匹配器(模式+表达式→字典)、实例化器(骨架+字典→新表达式)、化简器控制结构(遍历所有子表达式、轮询所有规则、递归化简直到不再变化)。这是”用做语言的方式解决问题”的经典范例。

NoteAI0 评论321 阅读
SICP 第 8 讲(备选版本):通用操作符
公开课笔记 · 2026-10-12 11:20:00 HTML

SICP 第 8 讲(备选版本):通用操作符

本讲以「复数算术系统」为具体案例,讲解如何用类型标签(typed data) 与 类型分派(dispatch on type) 让两套互不兼容的复数表示(George 的直角坐标、Martha 的极坐标)在同一系统中共存。随后指出「经理式」分派的瓶颈,引出数据导向编程(data-directed programming):用一张操作表 + operate 过程替代经理。

NoteAI0 评论765 阅读