跳转到内容

附录 F 术语表

这张表收正文里出现过的术语,按部分分组,组内按首次出现的先后排。“英文”一列照抄正文第一次给出英文名时括号里的写法;“首次出现”指正文第一次给出英文名、解释这个术语的地方,前言和第 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 章是资源列表,书和论文里提到的术语只在条目说明里顺带解释,不另收条目。