1. 方向
CPython 是什么,从源代码构建、存储库布局、读取 C 代码、运行时模型以及从源代码到执行的路径。
-
1.CPython 是什么
1.CPython 是什么 CPython 是 Python 编程语言的主要实现。这是大多数人从 python.org、包管理器、Linux 发行版、Homebrew、pyenv、Docker 映像或大多数云运行时安装 Python 时使用的实现。 CPython 有两个角色。 首先,它实现了Python语言。它定义了Python源代码如何解析、编译、执行以及连接到标准库。 其次,它充当 Python 生态系统的实际参考点。其他实现可能遵循语言规范,但 CPython 是大多数包、工具、调试器、分析器和 C 扩展测试的实现。 CPython 源代码树包含解释器、编译器、对象系统、运行时、C API、标准库、测试套件、文档和构建机制。官方开发人员指南将 CPython 描述为不断变化的代码库,并在源代码树中维护内部文档。 ([Python 开发人员指南][1]) 1.1 Python 语言与 CPython 实现 Python 是一种语言。 CPython 是该语言的一种实现。 这种区别很重要,因为 Python 语言描述了可见的行为:语法、名称、表达式、语句、对象、模块、异常、迭代、异步行为、导入等等。 CPython 描述了一种使该行为在真实机器上运行的具体方法。 像这样的 Python 程序:```python def add(a, b): return a + b print(add(2, 3)) ```是语言级别的Python。语言告诉我们 def 创建一个函数对象, return 返回一个值, + 调用加法语义,并且 print 编写文本表示。 CPython 通过较低级别的机制实现这些操作:```text source text ↓ tokens ↓…
-
2. 从源代码构建 CPython
2. 从源代码构建 CPython 从源代码构建 CPython 为您提供了一个可以检查、修改、调试和测试的本地解释器。这是认真阅读内部结构之前的第一个实际步骤。 源代码构建可以让您执行打包的 Python 安装通常隐藏的操作:```text change interpreter code add debug prints inspect object layout run CPython tests use debug-only assertions trace reference counts debug crashes in C compare bytecode across builds CPython 存在于 Git 存储库中。正常的本地结帐如下所示: ``` bash git clone https : // github . com / python / cpython . git cd cpython ``` 该存储库包含解释器、标准库、测试、文档、构建文件和平台支持代码。 简化视图: ``` text cpython / Include / public and internal C…
-
3. 存储库布局
3. 存储库布局 CPython 存储库围绕解释器的主要子系统进行组织:对象实现、运行时机制、编译器管道、解析器、内置模块、标准库、测试、文档和平台构建文件。 好的第一步是将源代码树视为职责地图。```text cpython/ Include/ Objects/ Python/ Parser/ Modules/ Lib/ Programs/ Tools/ Doc/ Grammar/ PC/ PCbuild/ Mac/ ## 3.1 顶层结构 |目录 |主要角色| | ----------- | --------------------------------------------------- | |`Include/`|公共、内部和私有 C 头文件 | |`Objects/`|核心对象类型的实现 | |`Python/`|运行时、编译器、解释器循环、初始化 | |`Parser/`|分词器和解析器支持代码 | |`Grammar/`|语法输入文件 | |`Modules/`|用 C 编写的内置和扩展模块 | |`Lib/`| Python标准库| |`Lib/test/`| CPython 回归测试套件 | |`Programs/`|可执行入口点| |`Tools/`|开发人员和构建工具| |`Doc/`|文档来源| |`PC/`| Windows 特定的源文件和配置文件 | |`PCbuild/`| Windows 构建系统 | |`Mac/`| macOS 特定支持 | 内部阅读最重要的目录是:```text Include/ Objects/ Python/…
-
4. 阅读CPython C代码
4. 阅读 CPython C 代码 阅读 CPython C 代码需要同时使用两种思维模型。 第一个模型是普通的 C:结构、指针、宏、函数指针、引用所有权、分配、错误返回和条件编译。 第二个模型是Python的运行时模型:对象、类型、框架、异常、引用计数、描述符、迭代器、模块和字节码。 大多数 CPython 源文件都结合了两者。一行 C 代码可能看起来像普通的指针操作,但它通常编码 Python 语言规则。 4.1 从运行时不变量开始 中心不变量很简单: text id="vm1twr" Every Python value is represented as a PyObject pointer or a pointer to a struct whose first field is compatible with PyObject. 大多数 CPython 函数通过以下方式处理值 PyObject * 。```c id="x34zg4" PyObject *obj; 实际行为来自对象的类型: ``` c id = "y1r4zx" Py_TYPE ( obj ) ``` 类型决定哪些操作是有效的以及哪些 C 函数实现它们。 ##…
-
5. 运行时模型
5. 运行时模型 CPython 运行时是进程启动之后、Python 代码执行完成之前存在的机制。它拥有解释器状态、线程状态、模块、内置函数、内存分配器、异常状态、导入状态、帧、挂起调用、信号处理和关闭行为。 Python 程序看起来是作为一系列语句运行的。 CPython 在分层运行时系统中运行它。```text operating system process CPython runtime interpreter state thread state frame stack executing code object bytecode instructions object operations ## 5.1 进程、运行时、解释器、线程、框架 正在运行的 CPython 程序有多个嵌套的执行单元。 | 单位 | 意义 | | ---------- -- | -------------------------------------------------------------------------------- | | 流程 | 包含 CPython 可执行文件或嵌入式运行时的操作系统进程 | | 运行时 | 跨进程共享全局 CPython 状态 | | 口译 | 运行时内的隔离 Python 解释器状态 | | 线程状态 | 一个解释器的每线程执行状态 |…
-
6. 从源代码到执行
6.从源代码到执行 CPython 不直接执行Python 源文本。它在第一个字节码指令运行之前通过几种内部表示形式转换源文本。 路径是:```text source text ↓ tokens ↓ parse tree ↓ abstract syntax tree ↓ symbol table ↓ code object ↓ frame ↓ bytecode evaluation ↓ object operations ## 6.1 源文本 输入以文本开始。 ``` python x = 1 + 2 print ( x ) ``` 在 CPython 执行此操作之前,它必须知道: ``` text where statements begin and end which characters form names which characters form numbers which indentation levels define blocks which…