跳转到内容

第 26 章 · 按主题深入:类型系统、并发、内存、语言设计的书与论文

上一章按语言列资料,本章按主题列,收的都是不限于某一种语言的书、论文和长文。正文里提到过的经典排在每节前面,读到某一章想追到源头时可以直接来这里找。

条目格式和上一章一样,括号里写免费还是付费、页面是什么语言;论文另写作者、年份和发表处。有些论文的出版方页面要登录才能看全文,这里尽量给作者本人或所在机构的页面。所有链接都在 2026 年 10 月逐个打开核对过。

  • Null References: The Billion Dollar Mistake(免费,英文):Tony Hoare 2009 年在 QCon 伦敦大会上的演讲录像,约一小时,就是第 6 章引的“十亿美元的错误”;讲 ALGOL W 为什么加了空引用,以及类型系统本该怎样把它挡住。链接
  • The Generic Dilemma(免费,英文):Russ Cox 2009 年的博客短文,第 9 章引的“泛型困境”出自这里:程序员慢、编译慢、运行慢,三者选一。一页读完,适合先读。链接
  • On Understanding Types, Data Abstraction, and Polymorphism(免费,英文):Luca Cardelli 和 Peter Wegner,1985 年,ACM Computing Surveys 第 17 卷第 4 期;把多态分成重载、强制转换、子类型、参数化几类,这套分法至今常被引用。链接是 Cardelli 个人网站上的全文。链接
  • Types and Programming Languages(付费,英文):Benjamin C. Pierce 著,MIT Press 2002 年出版;类型系统的标准教材,从无类型 λ 演算一路讲到子类型、递归类型和多态。先读无类型和简单类型两部分,想弄懂子类型再读第三部分。链接是作者为本书做的页面,有勘误和配套代码。链接
  • Gradual Typing for Functional Languages(免费,英文):Jeremy G. Siek 和 Walid Taha,2006 年,Scheme and Functional Programming Workshop;渐进类型(gradual typing)的奠基论文,讲有标注和无标注的代码怎样混在一个程序里检查。Python 类型标注和 TypeScript 都受它影响,但都不做论文里那种运行时检查:TS 编译时擦掉类型,Python 保留标注却不检查。链接是研讨会网站上的全文。链接
  • Understanding TypeScript(付费,英文):Gavin Bierman、Martín Abadi、Mads Torgersen,2014 年,ECOOP;把 TypeScript 的核心形式化,并明确指出它的类型系统有意不可靠(unsound),哪几处不可靠、为什么这样取舍都写清楚了。链接是 Springer 的论文页。链接
  • Featherweight Go(免费,英文):Robert Griesemer、Ian Lance Taylor、Philip Wadler 等八人,2020 年,OOPSLA;Go 加泛型之前做的形式化,讲结构类型下的泛型怎么定义,并给出一套单态化翻译及其正确性证明。Go 实际采用的是第 9 章讲的 GC 形状方案,读时注意区分。链接是 arXiv 上的完整版。链接
  • The Garbage Collection Handbook(付费,英文):Richard Jones、Antony Hosking、Eliot Moss 著,第 2 版,CRC Press 出版;第 5 章讲到的引用计数、标记清除、复制、分代、并发回收,这本书都有一章专讲。链接是本书的官方网站,有目录和勘误。链接
  • On-the-fly Garbage Collection: An Exercise in Cooperation(免费,英文):Edsger W. Dijkstra、Leslie Lamport 等五人,1975 年的手稿 EWD 520,1978 年发表于 Communications of the ACM;三色标记(白、灰、黑)的出处,Go 的并发回收器至今用这套术语。链接是得克萨斯大学 Dijkstra 档案馆的全文转录。链接
  • Getting to Go: The Journey of Go’s Garbage Collector(免费,英文):Rick Hudson 在 2018 年 ISMM 的主题演讲整理稿,发在 Go 官方博客;讲 Go 的回收器为什么不移动对象、为什么试过分代又放弃,正好回答第 5 章表格里“不分代”的来由。链接
  • Trash talk: the Orinoco garbage collector(免费,英文):Peter Marshall 2019 年发在 V8 官方博客;讲 V8 新生代的半空间复制、老生代的标记整理,以及并行、增量、并发三种减少停顿的办法。链接
  • Fundamentals of garbage collection(免费,英文):.NET 官方文档;讲托管堆、0/1/2 三代、大对象堆,以及一次回收的标记、重定位、整理三个阶段。读完再看同目录下工作站与服务器 GC 的区别。链接
  • How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs(免费,英文):Leslie Lamport,1979 年,IEEE Transactions on Computers 第 C-28 卷第 9 期;两页的短文,提出顺序一致性(sequential consistency),第 17 章讲的内存模型都以它为参照。链接是作者网站上的全文。链接
  • Memory Models(免费,英文):Russ Cox 2021 年的三篇系列文章:硬件内存模型、编程语言内存模型、修订 Go 内存模型;对比了 Java、C++、JavaScript 和 Go 的做法,是从 Lamport 那篇读到 Go 1.19 内存模型最顺的一条路。链接
  • Communicating Sequential Processes(付费,英文):C. A. R. Hoare,1978 年,Communications of the ACM 第 21 卷第 8 期;1985 年扩写成同名著作,Prentice-Hall 出版。第 20 章讲的 CSP 就出自这里。链接是牛津大学计算机系的 Hoare 著作列表,两者都在其中。链接
  • A Universal Modular ACTOR Formalism for Artificial Intelligence(免费,英文):Carl Hewitt、Peter Bishop、Richard Steiger,1973 年,第三届国际人工智能联合会议(IJCAI);actor 模型和“一切都是 actor”(向 actor 发消息是唯一的计算方式)的出处;第 20 章讲的邮箱语义是后来的 actor 研究补全的。链接是 IJCAI 论文集的全文。链接
  • What Color is Your Function?(免费,英文):Bob Nystrom 2015 年的博客文章,第 19 章引的“函数染色”出自这里;用红蓝两种函数讲清 async 为什么会沿调用链传染,结尾解释 Go 为什么没有这个问题。链接
  • Notes on structured concurrency, or: Go statement considered harmful(免费,英文):Nathaniel J. Smith 2018 年的长文,第 21 章讲的结构化并发和托儿所出自这里;篇幅长,先看把 go 语句和 goto 对照的那几节。链接
  • Concurrency is not parallelism(免费,英文):Go 官方博客 2013 年的文章,介绍 Rob Pike 在 Heroku Waza 大会上的同名演讲,附幻灯片和录像;和第 16 章开头对并发与并行的区分讲的是同一件事。链接
  • Making reliable distributed systems in the presence of software errors(免费,英文):Joe Armstrong 的博士论文,2003 年,瑞典皇家理工学院;Erlang 的设计者讲进程之间互相隔离、出错的进程由监督进程处理,怎样做出可靠系统,是看消息传递在工业里怎么落地的最好材料。链接是 erlang.org 上的全文。链接
  • The Art of Multiprocessor Programming(付费,英文):Maurice Herlihy、Nir Shavit、Victor Luchangco、Michael Spear 著,第 2 版,Elsevier 2020 年出版;从互斥的原理讲到无锁队列、并发哈希表和事务内存,适合想自己写并发数据结构的人。链接是出版社页面。链接
  • Is Parallel Programming Hard, And, If So, What Can You Do About It?(免费,英文):Paul E. McKenney 著,以知识共享许可发布,持续更新;作者是 Linux 内核 RCU 的维护者,讲锁、原子操作、内存屏障在真实硬件上的代价。链接是作者在 kernel.org 上的发布页,有双栏、单栏和电子书三种排版。链接
  • Crafting Interpreters(免费,英文):Robert Nystrom 著,本书前言列出的参考书之一;用 Java 写一个树遍历解释器,再用 C 写一个字节码虚拟机,两次实现同一门小语言,闭包、类、垃圾回收都亲手做一遍。网页版全文免费,另有付费的纸质书和电子书。链接
  • Programming Language Pragmatics(付费,英文):Michael L. Scott 和 Jonathan Aldrich 著,第 5 版,Elsevier 2025 年出版,本书前言列出的另一本参考书;讲语言设计和实现怎样互相牵制,覆盖五十多种语言,新版加了所有权类型、异步和 LLVM。链接是出版社页面。链接
  • Static Program Analysis(免费,英文):Anders Møller 和 Michael I. Schwartzbach 的讲义,奥胡斯大学;讲类型推断、数据流分析、指针分析和抽象解释,是写 linter 和类型检查器的理论基础。链接
  • Roslyn Overview(免费,英文):C# 编译器仓库里的架构说明,讲编译器怎样分成解析、声明、绑定、生成四个阶段,每个阶段又怎样以语法树、符号、语义模型的形式开放成 API;想写分析器或代码生成器的人先读它。链接
  • Language Server Protocol(免费,英文):编辑器和语言服务器之间的通信协议,补全、跳转定义、查找引用都通过它;Python 的 Pyright、Go 的 gopls 都是按这个协议实现的语言服务器。官网有规范全文和各语言的实现列表。链接
  • Structure and Interpretation of Computer Programs(免费,英文):Harold Abelson、Gerald Jay Sussman、Julie Sussman 著,第 2 版,MIT Press 出版;用 Scheme 讲抽象、闭包、惰性流和解释器,第 7 章的闭包和第 13 章的惰性求值在这里都能找到源头。链接是 MIT Press 网页版的目录页,从目录可以读到各节全文。链接
  • Concepts, Techniques, and Models of Computer Programming(付费,英文):Peter Van Roy 和 Seif Haridi 著,MIT Press 2004 年出版;把函数式、面向对象、数据流、消息传递、共享状态都看成同一个核心语言上逐步加概念得到的计算模型,适合想把各种范式放在一张图里看的人。链接是作者的本书页面。链接
  • Go To Statement Considered Harmful(免费,英文):Edsger W. Dijkstra,1968 年,Communications of the ACM 第 11 卷;结构化编程的起点,Smith 那篇结构化并发的标题就是在模仿它。链接是 Dijkstra 档案馆的手稿转录,手稿原题“A Case against the GO TO Statement”。链接
  • Why Functional Programming Matters(免费,英文):John Hughes,1989 年发表于 The Computer Journal;论证高阶函数和惰性求值让程序更容易拆成小块再粘起来,第 13 章生成器和 LINQ 的思路与此相通。链接是作者主页,有 PDF。链接
  • Philip Wadler 的单子论文(免费,英文):Philip Wadler 1992 年的两篇论文,The essence of functional programming(POPL)和 Monads for functional programming;讲怎样用单子(monad)在纯函数里表达状态、异常和输出,Promise 的链式调用和 C# 的 LINQ 查询语法都可以近似看成这个结构的例子。链接是作者主页的论文列表。链接
方向 先读什么 再读什么 配合本书哪几章
想做语言实现 Crafting Interpreters,两个解释器都动手写一遍 Programming Language Pragmatics;The Garbage Collection Handbook 第 2 章(编译与解释)、第 5 章(内存与 GC)、第 7 章(闭包)、第 13 章(生成器)、第 19 章(async 的状态机)
想做高并发服务 Nystrom 的函数染色、Smith 的结构化并发、Pike 的并发不是并行 The Art of Multiprocessor Programming 或 McKenney 的书;Russ Cox 的 Memory Models 第 5 章(GC 停顿),第 16 至 21 章(并发全部)
想做工具链 Roslyn Overview 和 Language Server Protocol 规范;Types and Programming Languages 前两部分 Static Program Analysis 第 2 章(编译流程)、第 3 章(类型系统)、第 9 章(泛型)、第 11 章(模块与依赖)、第 22 章(反射与元编程)

三条路线都先读能动手的材料,再读体系化的书;配合的章节可以在读“再读什么”之前先回头翻一遍,带着本书里四种语言的具体做法去读理论,比反过来容易。

本章的条目分三类:正文引过的经典论文和文章,追到源头时读;体系化的教材,想把一个主题系统学一遍时读;运行时团队自己写的文档和博客,想知道某种语言此刻怎么实现时读。老论文不过时,它们定义的概念至今在用;运行时文档变得快,读的时候看清发布日期,和各语言最新的发布说明对照。

上一章和本章合起来是第七部分。按语言还是按主题入手都可以:手上的项目决定语言,就从上一章开始;想弄懂某个机制在四种语言里为什么不一样,就从本章开始。