在Windows上编译CPython

写代码的时候遇到一个问题,排查出现的原因后便想调试下Python解释器来跟踪是怎么实现的,众所周知,Python官方版本的解释器是C语言的实现的CPython,那先从编译CPython解析器开始吧。

环境准备

1、CPython的源码直接从官网或者通过git从Github上获取,这里我使用的是Python 3.7.7版本
2、按照官方文档,Python 3.6版本以上需要安装Visual Studio 2017,相关的开发组件我此前已经安装过,这里列出组件吧:

目录结构

1、先看一下源码的顶级目录结构和各个目录的作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Length Name
------ ----
Doc # 官方文档
Grammar # Python的EBNF语法定义文件
Include # 头文件
Lib # 用纯Python实现的一部分标准库
m4
Mac # Mac专用代码
Misc # 此目录包含其他地方无法容纳的文件,有些文件仅具有历史意义
Modules # 用C实现的一部分标准库
Objects # 内置数据类型实现
Parser # 与解析器相关的代码
PC # Windows专用代码
PCbuild # MSVC版本的构建文件
Programs # C可执行文件的源代码,包含main函数入口
Python # 构成核心CPython运行时的代码
Tools # 用于维护Python的各种工具

关于EBNF可查看:
https://zh.wikipedia.org/wiki/%E6%89%A9%E5%B1%95%E5%B7%B4%E7%A7%91%E6%96%AF%E8%8C%83%E5%BC%8F

2、下载源代码依赖:
以管理员身份运行PowerShell进入PCbuild目录(不以管理员身份运行可能在Fetch OpenSSL时遇到无权限的问题)

1
2
3
4
5
6
7
8
9
10
11
> .\get_externals.bat
Using py -3.7 (found 3.7 with py.exe)
Fetching external libraries...
Fetching bzip2-1.0.6...
Fetching sqlite-3.31.1.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.

完成后会在解释器目录中生成externals文件夹,下载的依赖均在此文件夹中。

进行编译

1、完成上述几步后,进入PCbuild目录双击pcbuild.sln,等待解决方案加载完成:

2、在工具栏上调整DEBUG -> X64
3、解决方案->右键->属性->配置,可以看到解决方案中列出的项目,这里可以选择自己关心的项目再生成解决方案

4、启动本地Windows调试器
5、完成后会弹出解释器控制台,生成的目录为PCbuild/amd64,其中包含解释器python_d.exe和内核python37_d.dll

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Mode                LastWriteTime         Length Name
---- ------------- ------ ----
-a---- 2020/6/21 15:02 7823360 python37_d.dll
-a---- 2020/6/21 15:02 213901 python37_d.exp
-a---- 2020/6/21 15:02 7654288 python37_d.ilk
-a---- 2020/6/21 15:02 348088 python37_d.lib
-a---- 2020/6/21 15:02 7802880 python37_d.pdb
-a---- 2020/6/21 15:02 135680 python_d.exe
-a---- 2020/6/21 15:02 268072 python_d.ilk
-a---- 2020/6/21 15:02 380928 python_d.pdb
-a---- 2019/9/7 0:43 85784 vcruntime140.dll
-a---- 2020/6/21 15:02 983 _ctypes_d.exp
-a---- 2020/6/21 15:02 942508 _ctypes_d.ilk
-a---- 2020/6/21 15:02 1756 _ctypes_d.lib
-a---- 2020/6/21 15:02 757760 _ctypes_d.pdb
-a---- 2020/6/21 15:02 266240 _ctypes_d.pyd

弹出的解释器控制台如图:

接下来就可以通过调试源码来查看我关心的问题如何实现的了🤓

参考

1、https://zh.wikipedia.org/wiki/CPython
2、https://devguide.python.org/setup/#windows
3、https://cpython-core-tutorial.readthedocs.io/en/latest/build_cpython_windows.html
4、https://devguide.python.org/setup/#directory-structure
5、https://devguide.python.org/exploring/#cpython-source-code-layout

0%