菜单

概述

相关源文件

本文档提供了CPython代码库的高级概述,解释了其架构、主要组件和执行流程。CPython是Python编程语言的参考实现,主要用C语言编写。本概述有助于开发人员理解解释器不同部分如何协同工作来执行Python代码。

CPython 架构

CPython 组织成几个主要子系统,它们协同工作以解析、编译和执行 Python 代码。下图说明了其高层架构。

来源:Python/bytecodes.c1-33(行号)、Python/ceval.c1-50 Objects/object.c1-30 Python/pystate.c52-70 Python/compile.c1-15

执行流程

Python 代码从源代码文本到执行会经历几个阶段。理解这个流程是理解 Python 底层工作原理的基础。

运行 Python 程序时,代码会遵循此路径:

  1. 解析:源代码被解析为抽象语法树 (AST)
  2. 编译:分析抽象语法树(AST),创建符号表,然后编译成字节码。
  3. 执行:字节码由解释器执行,解释器有两种运行模式:
    • 模式一:直接解释字节码,使用专门优化的版本。
    • 模式二:基于追踪的优化器,将字节码转换为微操作以提高执行速度。

来源:Python/compile.c1-15 Python/flowgraph.c1-50 Python/bytecodes.c145-200 Python/generated_cases.c.h1-30 Python/optimizer.c103-155 Python/executor_cases.c.h1-30

对象系统与内存管理

Python 的对象系统是该语言的基础。Python 中的一切都是一个对象,由 CPython 的内存管理系统管理。

CPython 对象系统的主要特性:

  • PyObject:所有 Python 对象共有的基本结构,包含引用计数和类型信息。
  • 引用计数:主要的内存管理机制(Py_INCREF/Py_DECREF)。
  • 垃圾回收:处理引用计数无法清理的循环引用。
  • 类型系统:定义对象的行为,PyTypeObject 存储方法和属性。

来源:Objects/object.c42-100 Include/internal/pycore_object.h20-100 Objects/typeobject.c1-50 Python/gc_free_threading.c1-30

字节码执行与解释

CPython 通过解释字节码指令来执行 Python 代码。指令执行循环是解释器的核心部分。

CPython 使用双模式执行系统:

  1. 模式一:直接字节码解释器,处理所有 Python 字节码指令。

    • 实现常见操作的专门版本以提高性能。
    • 使用分派循环来获取、解码和执行指令。
  2. 模式二:基于追踪的优化器,将字节码转换为微操作(UOps)。

    • 为热代码路径激活,以提高性能。
    • 将字节码序列转换为优化的微操作序列。
    • 可以根据观察到的类型和模式对代码进行专门化。

来源:Python/ceval.c500-550 Python/bytecodes.c145-300 Python/generated_cases.c.h20-100 Python/optimizer.c103-155 Python/optimizer_bytecodes.c1-50

全局解释器锁 (GIL)

全局解释器锁(GIL)是一个互斥锁,用于保护对 Python 对象的访问,防止多个线程同时执行 Python 字节码。

GIL 的关键方面:

  • 同一时间只有一个线程可以执行 Python 字节码。
  • 在长时间运行的操作期间,GIL 会定期释放。
  • I/O 操作通常会释放 GIL。
  • CPython 3.13+ 拥有一个实验性的“--disable-gil”模式,支持真正的并行。

来源: Python/ceval.c350-450 Python/pystate.c350-430

扩展与 C API

CPython 提供了一个 C API,允许开发者使用 C 语言编写的模块来扩展 Python,并将 Python 嵌入到其他应用程序中。

C API 提供了以下功能:

  • 创建和管理 Python 对象
  • 定义新类型和模块
  • 在 C 和 Python 数据类型之间进行转换
  • 从 C 调用 Python 函数
  • 错误处理和异常

来源: Include/internal/pycore_object.h20-100 Objects/typeobject.c90-150 Objects/object.c42-100

编译过程

Python 源代码在执行前要经过多个编译阶段。

编译过程包括:

  1. 分词 (Tokenizing):将源代码分解成词法单元 (tokens)
  2. 解析 (Parsing):将词法单元转换成抽象语法树 (AST)
  3. 符号表 (Symbol Table):创建符号表以解析变量作用域
  4. 代码生成 (Code Generation):将 AST 转换为字节码
  5. 优化 (Optimization):优化字节码以提高性能

来源: Python/compile.c1-50 Python/symtable.c1-50 Python/flowgraph.c1-50

运行时和解释器状态

CPython 维护着各种状态结构来管理执行环境。

关键状态结构包括:

  • _PyRuntimeState:整个 Python 进程的全局状态
  • PyInterpreterState:每个 Python 解释器实例的状态
  • PyThreadState:每个执行 Python 代码的线程的线程局部状态
  • _PyInterpreterFrame:当前函数调用的执行帧

来源: Python/pystate.c50-200 Include/internal/pycore_interp.h1-30 Python/pylifecycle.c1-50

标准库集成

Python 标准库与核心解释器紧密集成,一些模块使用 C 语言实现以提高性能。

标准库集成的关键方面:

  • 诸如 sys 等核心模块提供对解释器内部的访问
  • 一些模块采用 C 语言实现以获得更好的性能
  • importlib 模块负责处理导入系统
  • 标准库功能通过定义良好的 API 公开

来源: Python/sysmodule.c1-50 Python/import.c1-50

结论

CPython 是一个复杂的系统,多个组件协同工作以提供 Python 编程体验。代码执行管道将 Python 源代码转换为字节码,然后由解释器执行。对象系统和内存管理确保 Python 对象的有效处理。GIL 管理线程同步,而 C API 支持扩展开发。

了解这些核心组件为深入研究 CPython 代码库的特定部分以及为开发做出贡献奠定了坚实的基础。

有关特定组件的更详细信息,请参阅: