目录
本节以交互模式下执行print “Hello World”为例分析解释器的执行流程。
0x01 准备工作
- 打开Python-2.7.9\PCbuild目录下的visual studio解决方案pcbuild
- 设置python工程为启动工程
- 打开词法语法分析调试变量,python\pythonrun.c源码中修改int Py_DebugFlag = 1
- 编译python工程
0x02 运行输出
以Debug模式启动python工程,出现命令行提示窗口,输入print “Hello World”回车运行结果如下图所示。
0x03 主要流程分析
在解释器命令行窗口输入print “Hello World”回车后执行流程是怎样的呢? Python源码工程支持visual studio的编译和调试,加上visual studio非常强大的单步调试能力,因此对执行流程的分析基本没什么技术难度。这里简单总结下大致的运行流程,有兴趣的童鞋可以自己运行看看。
1 初始化
上一节中提到过Py_Main函数,它是python进程的入口函数,主要包括参数解析、初始化、运行等逻辑。初始化工作主要完成解释器的初始化,由Py_Main函数调用Py_Initialize函数完成,Py_Initialize函数位于Python\pythonrun.c源码文件内,初始化完成的主要流程如下图所示:
1.1 数据类型准备
这里先看下数据类型准备_Py_ReadyTypes,类型的准备主要完成各种数据类型的准备工作。Python C源码中,所有内置的数据类型都是PyTypeObject结构体的一个实例,PyTypeObject结构体中以函数指针的形式,声明了各种处理函数,包括print、repr、hash、call、str、getattro、成员函数(tp_methods)、成员变量(tp_members)等。各个内置数据类型的定义在Objects目录下相应的C源码文件中,比如list数据类型实现的源码文件是Objects\listobject.c,在listobject.c源码文件中定义了结构体实例PyList_Type对象,如下图所示。