CPython設計與實現 CPython Internals: Your Guide to the Python 3 Interpreter

[英]安東尼·肖(Anthony Shaw)

  • CPython設計與實現-preview-1
  • CPython設計與實現-preview-2
CPython設計與實現-preview-1

相關主題

商品描述

大模型的出現讓 AI 技術經歷了從量變到質變的過程,而 Python 作為 AI 首選語言,一直默默推動著 AI 技術的快速發展。你是否想過,這是為什麽呢?答案就藏在 CPython 中! CPython 是用 C 語言實現的 Python 解釋器,它是 Python 的官方實現,並且是使用最廣泛的 Python 解釋器。其實在談論 Python 的時候,99% 的情況說的就是 CPython!本書共 16 章,從獲取 CPython 源代碼開始,手把手帶你重新編譯

CPython,我們將一起調試代碼、升級組件,在這個過程中,你可以詳細瞭解 Python 各類特性的工作原理,成長為一名更棒的Python 程序員。

作者簡介

安东尼 · 肖(Anthony Shaw),CPython 项目贡献者,Apache 软件基金会成员。安东尼是一个狂热的 Python 爱好者,擅长理解复杂的系统,然后简化它们,并教给其他人。

 

译者介绍:

 

史海,Python 语言组成员,CPython Top100 贡献者,原 OpenStack 社区核心开发者,原华为云计算编程语言 Lab 负责人,目前负责华为云计算 IAAS 软件工程能力建设和优化。

 

赵羽,华为云计算编程语言 Lab 核心成员,华为公司 Python 编程语言生态建设及开源管理负责人。长期从事 Python 虚拟机的开发及研究工作。

 

陈啸,华为软件开发工程师。

 

李俊辰,拥有多年编译器开发经验。

目錄大綱

第 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