CPython 实现原理
  • README
  • 一、简介
    • 1.1 如何使用此书
    • 1.2 额外材料和学习资料
  • 二、获取 CPython 源码
    • 2.1 源代码里有什么?
  • 三、准备你的开发环境
    • 3.1 选IDE还是编辑器?
    • 3.2 安装Visual Studio
    • 3.3 安装Visual Studio Code
    • 3.4 安装JetBrains Clion
    • 3.5 安装Vim
    • 3.6 总结
  • 四、编译 CPython
    • 4.1 在 macOS 上编译 CPython
    • 4.2 在 Linux 上编译 CPython
    • 4.3 安装自定义版本
    • 4.4 make 快速入门
    • 4.5 CPython 的 make 目标
    • 4.6 在 Windows 上编译 CPython
    • 4.7 PGO 优化
    • 4.8 总结
  • 五、Python 语言和语法
    • 5.1 为什么 CPython 是用 C 语言而不是用 Python 语言来实现
    • 5.2 Python 语言规范
    • 5.3 分析器生成器
    • 5.4 重新生成语法
    • 5.5 总结
  • 六、配置和输入
    • 6.1 配置状态
    • 6.2 构建配置
    • 6.3 从输入构建模块
    • 6.4 总结
  • 七、基于语法树的词法分析和解析
    • 7.1 具象语法树生成器
    • 7.2 CPython 解析器-分词器
    • 7.3 抽象语法树
    • 7.4 要记住的术语
    • 7.5 一个示例:添加一个约等于比较运算法
    • 7.6 总结
  • 八、编译器
    • 8.1 相关源文件
    • 8.2 重要的专业术语
    • 8.3 实例化一个编译器
    • 8.4 未来标志和编译器标志
    • 8.5 符号表
    • 8.6 核心编译过程
    • 8.7 汇编
    • 8.8 创建一个 Code Object
    • 8.9 使用 Instaviz 展示 Code Object
    • 8.10 一个示例:实现约等于操作符
    • 8.11 总结
  • 九、求值循环
    • 9.1 构建线程状态
    • 9.2 构建帧对象
    • 9.3 帧的执行
    • 9.4 值栈
    • 9.5 例子:在列表中添加元素
    • 9.6 总结
  • 十、内存管理
    • 10.1 C 中的内存分配
    • 10.2 Python 内存管理系统设计
    • 10.3 CPython 内存分配器
  • 十一、并行和并发
    • 11.1 并行和并发模型
    • 11.2 进程的结构
    • 11.3 多进程并行
    • 11.4 多线程
    • 11.5 异步编程
    • 11.6 生成器
    • 11.7 协程
    • 11.8 异步生成器
    • 11.9 子解释器
    • 11.10 总结
  • 十二、对象和类型
    • 12.1 本章的例子
    • 12.2 内置类型
    • 12.3 对象和可变长度对象类型
    • 12.4 类型类
    • 12.5 布尔和整数类型
    • 12.6 Unicode 字符串类型
    • 12.7 字典类型
    • 12.8 总结
  • 十三、标准库
    • 13.1 Python 模块
    • 13.2 Python 和 C 模块
  • 十四、测试套件
    • 14.1 在 Windows 上运行测试套件
    • 14.2 在 Linux 或 MacOS 上运行测试套件
    • 14.3 测试标志
    • 14.4 运行特定测试
    • 14.5 测试模块
    • 14.6 测试工具
    • 14.7 总结
  • 十五、调试
  • 十六、基准测试、性能分析和追踪
  • 十七、下一步计划
    • 17.1 为 CPython 编写 C 扩展
    • 17.2 改进你的 Python 应用程序
    • 17.3 为 CPython 项目做贡献
    • 17.4 继续学习
  • 十八、附录
    • 18.1 C 预处理器
    • 18.2 基础 C 语法
    • 18.3 总结
  • 致谢
Powered by GitBook
On this page
  • 安装依赖项
  • 从命令行编译
  • 从 Visual Studio 编译
Edit on GitHub
  1. 四、编译 CPython

4.6 在 Windows 上编译 CPython

有两种方法可以从 Windows 编译 CPython 二进制文件和库。

第一种从命令行编译,这需要用到 Visual Studio 自带的 Microsoft Visual C++ 编译器。第二种是通过 Visual Studio 打开 PCBuild/pcbuild.sln 直接进行构建。

安装依赖项

不论使用命令行还是 Visual Studio 进行编译,你都需要安装一些外部工具、库和 C 头文件。

在 PCBuild 文件夹中有一个 .bat 文件,可以为你自动执行上述安装操作。

在 PCBuild 中打开命令行并执行 get_externals.bat:

> get_externals.bat
Using py -3.7 (found 3.7 with py.exe)
Fetching external libraries...
Fetching bzip2-1.0.6...
Fetching sqlite-3.28.0.0...
Fetching xz-5.2.2...
Fetching zlib-1.2.11...
Fetching external binaries...
Fetching openssl-bin-1.1.1d...
Fetching tcltk-8.6.9.0...
Finished.

现在你可以从命令行或 Visual Studio 进行编译了。

从命令行编译

从命令行进行编译时,需要选择要编译的 CPU 架构。默认值为 win32,但你可能需要 64 位 (amd64) 二进制文件。

如果你进行任何调试,调试版本提供了在源代码中添加断点的能力。要构建调试版本,请添加 -c Debug 以指定调试配置。

默认情况下,build.bat 将获取外部依赖项,但由于我们已经完成了该步骤,它会打印一条跳过下载的消息:

> build.bat -p x64 -c Debug

此命令将生成 Python 二进制文件 PCbuild/amd64/python_d.exe。该二进制文件可以直接从命令行启动:

> amd64\python_d.exe

Python 3.9.0b1 (tags/v3.9.0b1:97fe9cf, May 19 2020, 10:00:00)
[MSC v.1922 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

现在已经进入了你编译的 CPython 二进制文件的 REPL 中。

要编译二进制文件发行版:

> build.bat -p x64 -c Release

上述命令将生成二进制文件 PCbuild/amd64/python.exe。

后缀 _d 表明 CPython 是基于 Debug 配置构建的。

python.org 上发布的二进制文件在基于 Profile-Guided-Optimization (PGO) 配置编译的。有关 PGO 的更多详细信息,请参阅本章末尾的 Profile-Guided-Optimization (PGO) 部分。

参数

build.bat 支持以下参数:

标记
作用
可选值

-p

指定构建平台的 CPU 架构

x64,Win32 (默认值),ARM,ARM64

-c

指定构建配置

Release (默认值),Debug,PGInstrument,PGUpdate

-t

指定构建目标

Build (默认值),Rebuild,Clean,CleanAll

标记

下面是一些可用于 build.bat 的可选标志。如需完整列表,请运行 build.bat -h。

标记
作用

-v

详细模式。在构建期间显示信息性消息

-vv

非常详细的模式。在构建期间显示详细消息

-q

安静模式。仅在构建期间显示警告和错误

-e

下载并安装外部依赖项(默认)

-E

不下载和安装外部依赖项

--pgo

编译时开启 PGO

--regen

当更新语言时,使用该选项重新生成新语法和 token

从 Visual Studio 编译

PCBuild 文件夹中有一个 Visual Studio 解决方案文件 PCBuild/pcbuild.sln,其用于构建和探索 CPython 源代码。

加载解决方案文件时,它会提示将解决方案中的项目重定向到安装的 C/C++ 编译器版本。Visual Studio 也会定位已安装的 Windows SDK 的版本。

确保将 Windows SDK 版本更改为最新安装的版本,并将平台工具集更改为最新版本。如果错过了这个窗口,你可以在 Solutions and Projects 窗口中右键单击解决方案文件,然后单击 Retarget Solution。

导航到 Build/Configuration Manager,确保 Active solution configuration 设置为 Debug 且 Active Solution Platform 设置为 x64(64 位 CPU 架构)或 win32(32 位)。

接下来,通过按 CTRL + SHIFT + B 或选择 Build/Build Solution 来构建 CPython。若收到有关缺少 Windows SDK 的任何错误,请确保在 Retarget Solution 窗口中设置了正确的定位设置。在开始菜单中应该能看到 Windows Kits 文件夹,文件夹内有 Windows Software Development Kit(Windows 软件开发工具包)。

第一次构建可能需要 10 分钟或更长时间。构建完成后,可能会看到一些可以忽略的警告。

若需启动调试版本的 CPython,请按 F5,CPython 将以调试模式启动且直接进入 REPL:

图片不翻译。

你可以通过在顶部菜单栏上将构建配置从 Debug 更改为 Release 并重新运行 Build/Build Solution,来运行发布版本的构建。现在在目录 PCbuild/amd64 中同时拥有了 Python 二进制文件的调试和发布版本。

通过在顶部菜单中选择 Tools/Python/Python Environments,可以将 Visual Studio 设置为使用发布或调试版本打开 REPL。在 Python Environments 面板中,单击 Add Environment,然后可以选择调试或发布二进制文件作为目标。调试二进制文件以 _d.exe 结尾,例如 python_d.exe 或 pythonw_d.exe。

你或许更希望使用调试二进制文件,因为它在 Visual Studio 中提供调试支持,这在你通读本书时会很有用。

在 Add Environment 窗口中,分别将解释器路径和窗口解释器设置为 PCbuild/amd64 中的 python_d.exe 文件和 pythonw\_d.exe 文件:

图片不翻译。

在 Python Environments 窗口中单击 Open Interactive Window 来启动 REPL 会话,你将看到 Python 编译版本的 REPL:

图片不翻译。

本书中将有带有示例命令的 REPL 会话。如果你想在代码中设置任何断点,我鼓励使用调试二进制文件来运行这些 REPL 会话。

为了更轻松地浏览代码,在 Solution 视图中,单击 Home 图标旁边的切换按钮以切换到 Folder 视图:

图片不翻译。

Previous4.5 CPython 的 make 目标Next4.7 PGO 优化

Last updated 2 years ago