《CPython设计与实现》简介:

大模型的出现让 AI 技术经历了从量变到质变的过程,而 Python 作为 AI 首选语言,一直默默推动着 AI 技术的快速发展。你是否想过,这是为什么呢?答案就藏在 CPython 中! CPython 是用 C 语言实现的 Python 解释器,它是 Python 的官方实现,并且是使用最广泛的 Python 解释器。其实在谈论 Python 的时候,99% 的情况说的就是 CPython!本书共 16 章,从获取 CPython 源代码开始,手把手带你重新编译

CPython,我们将一起调试代码、升级组件,在这个过程中,你可以详细了解 Python 各类特性的工作原理,成长为一名更棒的Python 程序员。

编辑推荐

Python 之父 Guido van Rossum 推荐

CPython 核心开发者 Carol Willing 作序

手把手带你重新编译CPython,了解Python的内部实现

CPython 即用C语言实现的 Python 解释器,是目前使用最广泛的 Python 解释器,GitHub Star数近 50k。不了解 Python 的人可能不知道,当我们谈论 Python 的时候,99% 的情况其实说的就是 CPython!本书以一种平易近人的方式解释了 Python 解释器的概念、思想和技术细节,获得 Python 之父 Guido van Rossum 推荐!

《CPython设计与实现》目录:

第 1章 获取 CPython 源代码 1
第 2章 准备开发环境 3
2.1 使用 IDE或代码编辑器 3
2.2 安装 Visual Studio 4
2.3 安装 Visual Studio Code 6
2.3.1 安装 6
2.3.2 本书中的推荐扩展程序 6
2.3.3 使用高级代码导航和扩展 7
2.3.4 配置任务和启动文件 8
2.4 安装 JetBrains CLion 9
2.5 安装 Vim 12
2.6 小结 15
第3章 编译 CPython 16
3.1 在 macOS 系统上编译 CPython 16
3.2 在 Linux 系统上编译 CPython 18
3.3 安装自定义版本 19
3.4 make 快速入门 20
3.5 CPython 的 make 目标 21
3.5.1 构建目标 21
3.5.2 测试目标 21
3.5.3 清理目标 22
3.5.4 安装目标 22
3.5.5 其他目标 23
3.6 在 Windows 系统上编译 CPython 23
3.6.1 安装依赖项 24
3.6.2 从命令行编译 24
3.6.3 使用 Visual Studio 编译 25
3.7 PGO 28
3.8 小结 29
第4章 Python 语言和语法 30
4.1 为什么 CPython 是用 C 语言
而不是 Python 语言实现的 30
4.2 Python 语言规范 32
4.2.1 语言说明文档 32
4.2.2 语法文件 33
4.3 解析器生成器 35
4.4 重新生成语法 36
4.5 小结 39
第5章 配置和输入 41
5.1 配置状态 42
5.1.1 预初始化配置 43
5.1.2 相关源文件 43
5.1.3 运行时配置数据结构 44
5.1.4 通过命令行来设置运行时
配置 44
5.1.5 查看运行时标志 45
5.2 构建配置 45
5.3 从输入构建模块 46
5.3.1 相关的源文件 46
5.3.2 读取文件和输入 47
5.3.3 从命令行输入字符串 47
5.3.4 通过本地模块输入 48
5.3.5 来自脚本文件或标准输入的输入 49
5.3.6 从编译好的字节码输入 49
5.4 小结 50
第6章 基于语法树的词法分析和
语法解析 51
6.1 具象语法树生成器 52
6.2 CPython 解析器-分词器 54
6.2.1 相关源文件 54
6.2.2 从文件向解析器中输入数据 54
6.2.3 解析器-分词器工作流 55
6.3 抽象语法树 58
6.3.1 相关源文件 59
6.3.2 使用 instaviz 工具展示
抽象语法树 59
6.3.3 编译抽象语法树 62
6.4 要记住的术语 65
6.5 示例:添加一个约等于运算符 65
6.6 小结 69
第7章 编译器 70
7.1 相关源文件 71
7.2 重要的专业术语 71
7.3 实例化一个编译器 72
7.4 未来标志和编译器标志 73
7.4.1 未来标志 73
7.4.2 在 Python 3.9 中引用未来
标志 73
7.4.3 编译器标志 74
7.5 符号表 74
7.5.1 相关源文件 74
7.5.2 符号表数据结构 75
7.5.3 使用 symtable 标准库模块 75
7.5.4 符号表实现 77
7.6 核心编译过程 79
7.6.1 从 Python 访问编译器 79
7.6.2 编译器 C 语言API 80
7.6.3 指令 82
7.6.4 基础帧块 83
7.6.5 操作和参数 83
7.7 汇编 84
7.7.1 汇编器数据结构 84
7.7.2 汇编器深度优先搜索算法 84
7.7.3 汇编器 C 语言API 85
7.7.4 深度优先搜索 86
7.8 创建一个代码对象 87
7.9 使用 instaviz 展示代码对象 88
7.10 示例:实现约等于运算符 89
7.11 小结 94
第8章 求值循环 95
8.1 相关源文件 96
8.2 重要术语 96
8.3 构建线程状态 96
8.3.1 线程状态类型 96
8.3.2 相关源文件 97
8.4 构建帧对象 97
8.4.1 帧对象类型 97
8.4.2 相关源文件 98
8.4.3 帧对象初始化 API 98
8.5 帧的执行 102
8.6 值栈 105
8.6.1 字节码操作的例子:BINARY_OR 105
8.6.2 模拟值栈 106
8.6.3 栈效果 109
8.7 示例:在列表中添加元素 109
8.8 小结 112
第9章 内存管理 114
9.1 C 语言中的内存分配 114
9.1.1 静态内存分配 115
9.1.2 自动内存分配 115
9.1.3 动态内存分配 116
9.2 Python 内存管理系统设计 117
9.2.1 内存分配域 117
9.2.2 内存分配器 118
9.3 CPython 内存分配器 118
9.3.1 相关源文件 120
9.3.2 重要术语 120
9.3.3 内存块、内存池和堆区 120
9.3.4 内存块分配 API 125
9.3.5 使用 Python调试API 126
9.4 对象和 PyMem 内存分配域 126
9.5 原始内存分配域 129
9.6 自定义内存分配器 129
9.7 自定义的内存分配“消毒剂” 130
9.7.1 AddressSanitizer 130
9.7.2 MemorySanitizer 131
9.7.3 UndefinedBehaviorSanitizer 131
9.8 PyArena 内存堆区 132
9.9 引用计数 133
9.9.1 在 Python 中创建变量 133
9.9.2 增加引用 133
9.9.3 减少引用 134
9.9.4 字节码操作中的引用计数 135
9.9.5 CPython 引用计数的优点 137
9.10 垃圾回收 137
9.10.1 相关源文件 138
9.10.2 垃圾回收器的设计 138
9.10.3 垃圾回收器管理的容器
类型 139
9.10.4 不可追踪对象与可变性 140
9.10.5 垃圾回收算法 140
9.10.6 分代垃圾回收 143
9.10.7 使用 Python 的垃圾回收
API 144
9.11 小结 145
第 10章 并行和并发 146
10.1 并行模型和并发模型 147
10.2 进程的结构 148
10.3 多进程并行 149
10.3.1 在 POSIX 中fork 进程 149
10.3.2 Windows 系统上的
多进程 152
10.3.3 multiprocessing 包 152
10.3.4 相关源文件 152
10.3.5 spawn 进程和 fork 进程 152
10.3.6 使用队列和管道交换
数据 158
10.3.7 进程之间的共享状态 165
10.3.8 示例应用程序 165
10.3.9 多进程总结 167
10.4 多线程 167
10.4.1 全局解释器锁 168
10.4.2 相关源文件 169
10.4.3 在 Python 中启动线程 169
10.4.4 线程状态 172
10.4.5 POSIX 线程 176
10.4.6 Windows 线程 176
10.4.7 多线程总结 177
10.5 异步编程 177
10.6 生成器 177
10.6.1 生成器结构 178
10.6.2 相关源文件 179
10.6.3 创建生成器 179
10.6.4 执行生成器 181
10.7 协程 182
10.7.1 相关源文件 184
10.7.2 事件循环 184
10.7.3 示例 185
10.8 异步生成器 186
10.9 子解释器 187
10.9.1 相关源文件 189
10.9.2 示例 189
10.10 小结 190
第 11章 对象和类型 191
11.1 本章示例 192
11.2 内置类型 192
11.3 对象类型和可变长度对象类型 193
11.4 type类型 194
11.4.1 类型槽 195
11.4.2 在 C 语言中使用类型 196
11.4.3 类型属性字典 196
11.5 bool 类型和 long 类型 197
11.5.1 long类型 198
11.5.2 示例 199
11.6 Unicode 字符串类型 200
11.6.1 相关源文件 201
11.6.2 处理 Unicode 码点 202
11.6.3 UTF-8和UTF-16 202
11.6.4 宽字符类型 203
11.6.5 字节顺序标记 204
11.6.6 encodings 包 204
11.6.7 编解码器模块 205
11.6.8 编解码器的实现 205
11.6.9 内部的编解码器 206
11.6.10 示例 207
11.7 字典类型 208
11.7.1 哈希 208
11.7.2 相关源文件 210
11.7.3 字典结构 210
11.7.4 查找 211
11.8 小结 212
第 12章 标准库 213
12.1 Python 模块 213
12.2 Python 模块和 C 语言模块 214
第 13章 测试套件 217
13.1 在 Windows 系统上运行测试
套件 217
13.2 在 Linux 系统或 macOS 系统上
运行测试套件 217
13.3 测试标志 218
13.4 运行特定测试 218
13.5 测试模块 220
13.6 测试工具 220
13.7 小结 221
第 14章 调试 222
14.1 使用崩溃处理程序 222
14.2 编译调试的支持 223
14.2.1 Windows系统 223
14.2.2 macOS 系统或 Linux
系统 223
14.3 在 macOS 系统上使用LLDB 223
14.3.1 创建断点 224
14.3.2 启动 CPython 224
14.3.3 附加到正在运行的 CPython 解释器中 224
14.3.4 处理断点 225
14.3.5 使用 cpython_lldb 扩展 226
14.4 使用 GDB 227
14.4.1 创建断点 227
14.4.2 启动 CPython 227
14.4.3 附加到正在运行的 CPython 解释器中 227
14.4.4 处理断点 228
14.4.5 使用 python-gdb 扩展 228
14.5 使用 Visual Studio 调试器 228
14.5.1 添加断点 229
14.5.2 启动调试器 229
14.5.3 处理断点 230
14.6 使用 CLion 调试器 231
14.6.1 调试 make 应用程序 232
14.6.2 附加调试器 232
14.6.3 创建断点 232
14.6.4 处理断点 234
14.7 小结 235
第 15章 基准测试、性能分析和追踪 236
15.1 使用 timeit 进行微基准测试 237
15.2 使用 Python 基准测试套件进行
运行时基准测试 238
15.2.1 执行基准测试 240
15.2.2 对比基准测试 240
15.3 使用 cProfile 分析 Python 代码 242
15.4 使用 DTrace 分析 C 语言代码 245
15.4.1 相关源文件 245
15.4.2 安装 DTrace 246
15.4.3 编译 DTrace 支持 246
15.4.4 使用 CLion 中的 DTrace 246
15.4.5 DTrace 示例 247
15.5 小结 248
第 16章 下一步计划 249
16.1 为 CPython 编写 C 语言扩展
模块 249
16.2 改进 Python 应用程序 249
16.3 为 CPython 项目做贡献 250
16.3.1 问题分类 250
16.3.2 创建一个拉取请求来修复问题 251
16.3.3 其他贡献 252
16.4 继续学习 252
附录A 面向Python程序员的 C 语言
简介 253
· · · · · ·