Python解释器源码分析(二):print "Hello World"

目录

0x01 准备工作

0x02 运行输出

0x03 主要流程分析

1 初始化

1.1 数据类型准备 

1.2 内置对象初始化

2 运行

2.1 申请内存池

2.2 词法及语法解析

2.3 解析树节点类型

2.4 运行

0x04 总结


本节以交互模式下执行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对象,如下图所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值