这张表收正文里出现过的术语,按部分分组,组内按首次出现的先后排。“英文”一列照抄正文第一次给出英文名时括号里的写法;“首次出现”指正文第一次给出英文名、解释这个术语的地方,前言和第 1 章的术语并入第一部分。一句话解释只取正文里的用法,完整的讲法回到对应章节去看。
| 术语 |
英文 |
一句话解释 |
首次出现 |
| 静态类型 |
static typing |
编译时检查类型,类型不对的程序跑不起来 |
第 1 章 |
| 垃圾回收 |
garbage collection |
由运行时找出不再用到的对象并释放内存 |
第 1 章 |
| 隐式类型转换 |
implicit type coercion |
运算时悄悄把值转成另一种类型再算 |
第 1 章 |
| 字节码 |
bytecode |
为虚拟机设计的紧凑指令,不依赖具体 CPU |
第 1 章 |
| 即时编译 |
JIT, just-in-time |
程序运行时把热点代码翻译成机器码 |
第 1 章 |
| 提前编译 |
AOT, ahead-of-time |
运行之前就把整个程序翻译成机器码 |
第 1 章 |
| 引用计数 |
reference counting |
记下有几个引用指向对象,减到 0 立刻释放 |
第 1 章 |
| 分代垃圾回收 |
generational GC |
按对象存活时间分代,新对象回收得更勤 |
第 1 章 |
| 事件循环 |
event loop |
一条线程轮流取出就绪的任务和回调来执行 |
第 1 章 |
| 全局解释器锁 |
Global Interpreter Lock, GIL |
让同一时刻只有一个线程执行 Python 字节码 |
第 1 章 |
| 虚拟机 |
virtual machine |
执行字节码的程序,逐条解释指令或再编译成机器码 |
第 2 章 |
| 分层编译 |
tiered compilation |
先用便宜的方式跑起来,热点再交给更强的编译器 |
第 2 章 |
| 无 GIL 构建 |
free-threaded build |
去掉 GIL、线程能并行执行的 CPython 构建 |
第 2 章 |
| 中间语言 |
Intermediate Language, IL |
.NET 的字节码,带着完整的类型信息 |
第 2 章 |
| 元数据 |
metadata |
描述类型、方法签名等程序结构的数据,和代码一起存放 |
第 2 章 |
| 程序集 |
assembly |
.NET 编译的产物,一个 .dll 文件,装着 IL 和元数据 |
第 2 章 |
| 公共语言运行时 |
Common Language Runtime, CLR |
加载程序集、用 JIT 把 IL 编译成机器码 |
第 2 章 |
| 源生成器 |
source generator |
编译期运行、为项目生成额外源码的组件 |
第 2 章 |
| 逃逸分析 |
escape analysis |
编译器判断变量是否活过函数,决定放栈还是放堆 |
第 2 章 |
| 类型系统 |
type system |
找出“把值当成错误类型来用”这类错误的规则 |
第 3 章 |
| 动态类型 |
dynamic typing |
类型挂在值上,运行到那一行才检查 |
第 3 章 |
| 强类型 |
strong typing |
遇到类型不匹配的运算就报错 |
第 3 章 |
| 弱类型 |
weak typing |
类型不匹配时悄悄把一边转换后再算 |
第 3 章 |
| 渐进类型 |
gradual typing |
同一程序里一部分写类型、一部分不写 |
第 3 章 |
| 类型推断 |
type inference |
编译器从初始值和用法算出类型,不必处处写 |
第 3 章 |
| 名义类型 |
nominal typing |
看名字和声明,须写明实现了某类型才算兼容 |
第 3 章 |
| 结构类型 |
structural typing |
看形状,成员齐全就算兼容,不必事先声明 |
第 3 章 |
| 鸭子类型 |
duck typing |
动态语言里按行为认类型,到运行时才去看 |
第 3 章 |
| 收窄 |
narrowing |
经过判断后把宽泛的类型缩成更具体的类型 |
第 3 章 |
| 类型擦除 |
type erasure |
检查完就删掉类型信息,运行时不再保留 |
第 3 章 |
| 可空引用类型 |
nullable reference types |
C# 8 起在编译期区分可空与不可空的引用 |
第 3 章 |
| 值类型 |
value type |
变量直接装着值、赋值时整块复制的类型 |
第 3 章 |
| 引用类型 |
reference type |
变量里装的是指向对象的引用的类型 |
第 3 章 |
| 装箱 |
boxing |
把值类型的值包成堆上的对象 |
第 3 章 |
| 绑定 |
binding |
变量只是一个名字,指向某个对象,本身不装数据 |
第 4 章 |
| 存储 |
storage |
变量就是一块装着值的内存 |
第 4 章 |
| 绑定不可变 |
immutable binding |
这个名字不能再指向别的东西 |
第 4 章 |
| 值不可变 |
immutable value |
对象本身的内容不能修改 |
第 4 章 |
| 隐藏类 |
hidden class |
V8 记录对象有哪些属性、排在什么位置的结构 |
第 4 章 |
| 值语义 |
value semantics |
赋值时复制数据本身,两边各管各的 |
第 5 章 |
| 引用语义 |
reference semantics |
赋值只复制引用,两边看到同一份数据 |
第 5 章 |
| 栈 |
stack |
随函数调用分配、随返回释放的内存,不用回收 |
第 5 章 |
| 堆 |
heap |
存放寿命不跟函数走的对象,要靠回收释放 |
第 5 章 |
| 内容相等 |
value equality |
两份数据的内容是否一样 |
第 5 章 |
| 引用相等 |
reference equality |
两个引用是否指向同一个对象,也叫同一性 |
第 5 章 |
| 循环引用 |
reference cycle |
对象互相引用,引用计数永远不为 0 |
第 5 章 |
| 追踪式回收 |
tracing GC |
从根出发找出能到达的对象,其余都当垃圾 |
第 5 章 |
| 根 |
root |
追踪式回收的起点,如全局变量、栈上的变量 |
第 5 章 |
| 标记清除 |
mark-sweep |
标出活对象后原地释放垃圾,会留下碎片 |
第 5 章 |
| 并发三色标记清除 |
concurrent tri-color mark-sweep |
Go 的回收方式,标记与程序同时运行 |
第 5 章 |
| 空引用 |
null reference |
能放进任何引用变量、表示“没有”的值 |
第 6 章 |
| 零值 |
zero value |
变量总有默认值,数字是 0、字符串是空串 |
第 6 章 |
| 可选类型 |
option type |
把“可能没有”写进类型本身 |
第 6 章 |
| 特性 |
attribute |
C# 附在代码上、记进元数据的声明信息 |
第 6 章 |
| 术语 |
英文 |
一句话解释 |
首次出现 |
| 一等函数 |
first-class function |
函数和整数一样是值,能赋值、传参、返回 |
第 7 章 |
| 高阶函数 |
higher-order function |
接收或返回函数的函数 |
第 7 章 |
| 闭包 |
closure |
函数值带着它创建时能看到的变量 |
第 7 章 |
| 默认参数 |
default parameter |
调用方不写就用默认值的参数 |
第 7 章 |
| 可变参数 |
variadic parameter |
一个参数收下任意多个值 |
第 7 章 |
| 命名参数 |
named argument |
调用时写出参数名,不靠位置对应 |
第 7 章 |
| 元组 |
tuple |
把几个值按位置打包成一个值 |
第 7 章 |
| 重载 |
overloading |
同名函数按参数的个数和类型区分多个版本 |
第 7 章 |
| 晚绑定 |
late binding |
闭包调用时才读变量,循环里的闭包共用一个值 |
第 7 章 |
| 解构 |
destructuring |
按位置或名字从数组、对象里取出各项 |
第 7 章 |
| 箭头函数 |
arrow function |
JS 的简写函数,没有自己的 this |
第 7 章 |
| 委托 |
delegate |
C# 的函数值,存着目标对象和方法指针 |
第 7 章 |
| 接口 |
interface |
约定一个类型要有哪些方法 |
第 8 章 |
| 多态 |
polymorphism |
同一句调用对不同对象执行各自的实现 |
第 8 章 |
| 类 |
class |
把数据和方法定义在一起的类型 |
第 8 章 |
| 继承 |
inheritance |
子类沿用父类的公共部分 |
第 8 章 |
| 重写 |
override |
子类重新实现父类的某个方法 |
第 8 章 |
| 组合 |
composition |
对象持有另一个对象,需要时调用它 |
第 8 章 |
| 动态分派 |
dynamic dispatch |
到运行时才决定执行哪段方法代码 |
第 8 章 |
| 虚方法表 |
virtual method table, vtable |
每个虚方法占固定槽位,调用时按槽跳转 |
第 8 章 |
| 混入类 |
mixin |
只提供一块共享行为、靠多重继承拼进来的类 |
第 8 章 |
| 方法解析顺序 |
method resolution order, MRO |
Python 查找方法时依次检查的类的顺序 |
第 8 章 |
| 原型 |
prototype |
JS 对象查不到属性时接着去找的对象 |
第 8 章 |
| 内联缓存 |
inline cache |
记下上次查找的结果,下次同形对象直接取 |
第 8 章 |
| 接收者 |
receiver |
Go 方法挂到类型上时声明的那个参数 |
第 8 章 |
| 嵌入 |
embedding |
Go 把一个类型作为匿名字段放进结构体 |
第 8 章 |
| 泛型 |
generics |
把类型当参数,写一次代码用于多种类型 |
第 9 章 |
| 类型参数 |
type parameter |
泛型定义里的占位符,如 T |
第 9 章 |
| 类型实参 |
type argument |
使用泛型时实际填进去的类型 |
第 9 章 |
| 约束 |
constraint |
规定类型参数至少要具备哪些能力 |
第 9 章 |
| 具化 |
reification |
运行时保留类型实参,能被查询 |
第 9 章 |
| 单态化 |
monomorphization |
为每个类型实参生成一份专门的代码 |
第 9 章 |
| 上界 |
bound |
类型参数只能是某类型或它的子类型 |
第 9 章 |
| 型变 |
variance |
泛型类型随类型参数的子类型关系怎样变 |
第 9 章 |
| 类型集合 |
type set |
Go 接口约束里列出的一组允许的类型 |
第 9 章 |
| GC 形状模板化加字典 |
GC shape stenciling with dictionaries |
Go 泛型按形状生成代码,差异放进字典 |
第 9 章 |
| 异常 |
exception |
出错时抛出对象,沿调用栈找处理代码 |
第 10 章 |
| 调用栈 |
call stack |
当前正在执行的各层函数调用 |
第 10 章 |
| 错误值 |
error value |
错误作为普通值返回,每层显式检查 |
第 10 章 |
| 包装 |
wrapping |
用新错误把旧错误裹在里面,补上上下文 |
第 10 章 |
| 异常链 |
exception chaining |
新异常记住自己由哪个旧异常引起 |
第 10 章 |
| 上下文管理器 |
context manager |
with 后的对象,保证离开块时做清理 |
第 10 章 |
| 栈展开 |
stack unwinding |
异常沿调用栈逐帧退出、寻找处理者的过程 |
第 10 章 |
| 竞态条件 |
race condition |
结果取决于几件事的先后,两步之间状态被改 |
第 10 章 |
| 异常过滤器 |
exception filter |
C# 用 when 给 catch 加条件 |
第 10 章 |
| 哨兵错误 |
sentinel error |
专供比较的预先定义的错误值 |
第 10 章 |
| 受检异常 |
checked exception |
Java 要求在签名里声明、调用方必须处理的异常 |
第 10 章 |
| 模块 |
module |
有自己命名空间的代码单元 |
第 11 章 |
| 命名空间 |
namespace |
让同名的东西各在各的范围里,不互相覆盖 |
第 11 章 |
| 封装 |
encapsulation |
只公开该公开的,内部实现可以随意改 |
第 11 章 |
| 依赖管理 |
dependency management |
用清单、锁文件和仓库管理第三方包 |
第 11 章 |
| 包 |
package |
一组源文件组成的代码单元,Go 里一个目录是一个包 |
第 11 章 |
| ES 模块 |
ESM |
ES2015 写进标准的 import/export 模块系统 |
第 11 章 |
| 活绑定 |
live binding |
ES 模块的导出被修改后,导入方看到新值 |
第 11 章 |
| 类型剥离 |
type stripping |
只删掉类型标注、不做类型检查地运行 TS |
第 11 章 |
| 最小版本选择 |
Minimal Version Selection, MVS |
Go 对每个模块取各处要求里最高的那个版本 |
第 11 章 |
| 术语 |
英文 |
一句话解释 |
首次出现 |
| 列表 |
list |
按位置存一串元素的容器 |
第 12 章 |
| 动态数组 |
dynamic array |
元素连续存放,满了按比例换一块更大的内存 |
第 12 章 |
| 字典 |
dictionary |
按键存取值的容器,也叫映射 |
第 12 章 |
| 哈希表 |
hash table |
对键算哈希值、直接跳到对应槽位存取 |
第 12 章 |
| 冲突 |
collision |
两个键落到同一个槽位 |
第 12 章 |
| 集合 |
set |
只有键、没有值的哈希表 |
第 12 章 |
| 不可变集合 |
immutable collection |
建好之后谁也改不了的集合 |
第 12 章 |
| 紧凑字典 |
compact dict |
索引表只存编号,条目按插入顺序另存 |
第 12 章 |
| 可哈希 |
hashable |
能算出稳定的哈希值,因而能当字典的键 |
第 12 章 |
| 切片 |
slice |
Go 指向底层数组一段的视图,可以追加 |
第 12 章 |
| 瑞士表 |
Swiss table |
Go 1.24 起 map 用的哈希表,槽位八个一组 |
第 12 章 |
| 迭代器协议 |
iterator protocol |
“给我下一个”和“已经没有了”两句约定 |
第 13 章 |
| 迭代器 |
iterator |
能逐个给出元素、自己记着进度的对象 |
第 13 章 |
| 可迭代对象 |
iterable |
能造出新迭代器的对象,如列表 |
第 13 章 |
| 生成器 |
generator |
可以暂停和恢复的函数,停在哪里就是进度 |
第 13 章 |
| 惰性求值 |
lazy evaluation |
用到时才算,一次只算一个 |
第 13 章 |
| 急切求值 |
eager evaluation |
每一步先把整批结果算完再交给下一步 |
第 13 章 |
| 延迟执行 |
deferred execution |
LINQ 查询到被遍历时才真正执行 |
第 13 章 |
| 码点 |
code point |
Unicode 给字符的编号,如 U+00E9 |
第 14 章 |
| 编码 |
encoding |
把码点变成存储用的单元的规则 |
第 14 章 |
| 码元 |
code unit |
编码的存储单元,UTF-16 是 16 位 |
第 14 章 |
| 代理对 |
surrogate pair |
UTF-16 用两个码元表示 U+FFFF 以外的码点 |
第 14 章 |
| 字形簇 |
grapheme cluster |
用户眼里的“一个字”,可能由几个码点组成 |
第 14 章 |
| 字节序标记 |
BOM |
加在文本开头、标明字节顺序的几个字节 |
第 14 章 |
| 枚举 |
enumeration |
一组有名字的常量 |
第 15 章 |
| 积类型 |
product type |
“既有 A 又有 B”的类型,如结构体、元组 |
第 15 章 |
| 和类型 |
sum type |
“要么是 A、要么是 B”的类型 |
第 15 章 |
| 标签联合 |
tagged union |
和类型的别名,每个值带一个标明种类的标签 |
第 15 章 |
| 可辨识联合 |
discriminated union |
和类型的别名,TS 里靠辨识字段区分 |
第 15 章 |
| 代数数据类型 |
algebraic data type, ADT |
积类型与和类型的合称 |
第 15 章 |
| 模式匹配 |
pattern matching |
按值的形状逐条比对,成功时取出里面的数据 |
第 15 章 |
| 穷尽性检查 |
exhaustiveness checking |
编译器检查每种情况是否都有分支处理 |
第 15 章 |
| 结构模式匹配 |
structural pattern matching |
Python 3.10 起 match 语句做的模式匹配 |
第 15 章 |
| 守卫 |
guard |
模式后面附加的条件,满足才算匹配 |
第 15 章 |
| 元类 |
metaclass |
创建类的类,Python 的 Enum 靠它工作 |
第 15 章 |
| 字面量类型 |
literal type |
只含一个具体值的类型,如 "success" |
第 15 章 |
| 辨识字段 |
discriminant |
可辨识联合里标明是哪一种的字段 |
第 15 章 |
| 术语 |
英文 |
一句话解释 |
首次出现 |
| I/O 密集 |
I/O-bound |
瓶颈在等外部设备,如网络和磁盘 |
第 16 章 |
| 并发 |
concurrency |
结构上同时处理多件事,进度交错推进 |
第 16 章 |
| 并行 |
parallelism |
物理上同时执行多件事,需要多个核 |
第 16 章 |
| 进程 |
process |
操作系统分配资源的单位,有独立的内存空间 |
第 16 章 |
| 线程 |
thread |
操作系统调度的单位,同一进程的线程共享内存 |
第 16 章 |
| 协程 |
coroutine |
由语言运行时调度的用户态轻量任务 |
第 16 章 |
| 抢占式调度 |
preemptive scheduling |
调度者强行打断,任务不用配合 |
第 16 章 |
| 协作式调度 |
cooperative scheduling |
任务走到让出点才交出控制权 |
第 16 章 |
| 任务 |
Task |
包装协程、交给事件循环调度的对象 |
第 16 章 |
| 宏任务 |
macrotask |
事件循环每轮取一个执行到底的任务,如定时器、I/O 完成的回调 |
第 16 章 |
| 微任务队列 |
microtask queue |
存放 Promise 回调,每轮宏任务后清空 |
第 16 章 |
| 状态机 |
state machine |
编译器把 async 方法改写成的结构,每个 await 一个状态 |
第 16 章 |
| 延续 |
continuation |
任务完成后要接着执行的那段代码 |
第 16 章 |
| 工作窃取 |
work stealing |
线程自己的队列空了,去别的线程队列里取任务 |
第 16 章 |
| 通道 |
channel |
一端写、一端读、先进先出的交接管道 |
第 16 章 |
| 数据竞争 |
data race |
多个线程同时访问同一数据且至少一个在写 |
第 16 章 |
| 通信顺序进程 |
Communicating Sequential Processes, CSP |
进程之间只靠通道传消息协作的模型 |
第 16 章 |
| 共享内存并发 |
shared-memory concurrency |
线程直接读写同一块堆内存来交换数据 |
第 17 章 |
| 读改写 |
read-modify-write |
读出旧值、计算、写回三步,中间可被插入 |
第 17 章 |
| 互斥锁 |
mutex, mutual exclusion |
同一时刻只让拿到锁的线程进入 |
第 17 章 |
| 临界区 |
critical section |
受锁保护、同一时刻只有一个线程执行的代码 |
第 17 章 |
| 原子操作 |
atomic operation |
CPU 提供的不可打断的读改写指令 |
第 17 章 |
| 可见性 |
visibility |
一个线程写的值另一个线程能否看到 |
第 17 章 |
| 内存模型 |
memory model |
规定一次写入何时保证被另一次读取看到 |
第 17 章 |
| 先行发生 |
happens-before |
内存模型里保证前者结果对后者可见的关系 |
第 17 章 |
| 死锁 |
deadlock |
几个线程各拿一把锁又等对方的,永远等下去 |
第 17 章 |
| 地址空间 |
address space |
进程独有的内存范围,别的进程看不到 |
第 18 章 |
| 序列化 |
serialization |
把对象变成字节以便传输或保存 |
第 18 章 |
| 写时复制 |
copy-on-write |
父子先共用内存页,谁写哪页才复制哪页 |
第 18 章 |
| 进程间通信 |
inter-process communication, IPC |
进程之间交换数据的各种机制 |
第 18 章 |
| 共享内存 |
shared memory |
同一块物理内存映射进几个进程,要自己加锁 |
第 18 章 |
| 阻塞调用 |
blocking call |
结果回来之前不返回,线程停在那里等 |
第 19 章 |
| 非阻塞 |
non-blocking |
发起操作后立刻返回,结果到了再通知 |
第 19 章 |
| 回调 |
callback |
把后续工作包成函数传进去,完成时调用 |
第 19 章 |
| 函数染色 |
function coloring |
异步函数只能被异步函数直接等待,像传染的颜色 |
第 19 章 |
| 消息传递 |
message passing |
数据不共享,要交给别人时发送过去 |
第 20 章 |
| 无缓冲 |
unbuffered |
通道没有存储空间,发送方等接收方来取 |
第 20 章 |
| 有缓冲 |
buffered |
通道带一个容量为 n 的队列,满了才等 |
第 20 章 |
| 背压 |
backpressure |
下游忙不过来时压力沿流水线传回上游 |
第 20 章 |
| 邮箱 |
mailbox |
actor 接收消息的队列 |
第 20 章 |
| 协作式取消 |
cooperative cancellation |
外面只发信号,任务在安全处自己检查并退出 |
第 21 章 |
| 取消令牌 |
cancellation token |
C# 传递取消信号的载体 |
第 21 章 |
| 中止信号 |
abort signal |
JS 传递取消信号的载体 |
第 21 章 |
| 上下文 |
context |
Go 传递取消信号和截止时间的载体 |
第 21 章 |
| 孤儿任务 |
orphan task |
没人等也没人通知、在后台继续跑的任务 |
第 21 章 |
| 结构化并发 |
structured concurrency |
子任务都结束,启动它们的代码块才返回 |
第 21 章 |
| 术语 |
英文 |
一句话解释 |
首次出现 |
| 反射 |
reflection |
运行时查看值的类型、成员和成员上的注解 |
第五部分导读 |
| 元编程 |
metaprogramming |
处理对象是程序本身的代码 |
第 22 章 |
| 装饰器模式 |
Decorator pattern |
包装对象与被包装对象实现同一接口、层层叠加 |
第 22 章 |
| 裁剪 |
trimming |
发布时删掉看起来没用的成员,反射会找不到 |
第 22 章 |
| 结构标签 |
struct tag |
Go 附在字段上、由 reflect 读取的字符串 |
第 22 章 |
第 23、24 章回头比较前面讲过的机制,用的都是前五部分的术语,没有新收的条目。
第 25、26 章是资源列表,书和论文里提到的术语只在条目说明里顺带解释,不另收条目。