目录
0x00 口水话
0x01 源码版本
0x02 分析工具
0x03 分析方法
0x04 目录结构
1. Modules目录
2. Python目录
3. Parse目录
4. Objects目录
由于是第一次阅读开源代码,没有相关经验,只能借助相关开发工具,以调试代码的形式对Python解释器源码调用关系、层次结构进行分析,分析过程可谓是“山穷水尽疑无路,柳暗花明又一村”。经过几番风雨,终于掌握了其大致流程和一些内部机制,同时也学到不少新知识。下面对本次的源码阅读进行简单总结,同时也起到笔记之目的。
2.7.9。这里再啰嗦下,不是特意找的这个版本来分析,而是码机上刚好有此版本之源码,抱着省时(偷懒)的态度,于是乎就干脆分析此版本吧!
Visual Studio 2013、Xmind 8。
代码阅读、打开源码相关debug标志、编译并单步调试。
这里只简单列举下比较重要的源码目录,主要有Modules、Python、Parse、Objects,后续将逐渐对相关目录下的模块进行分析探讨。
Modules目录主要包含主模块main.c以及其他Python内置模块,包括json、random、math、mmap、md5、sha、time、signal、time等内置模块源码。比较重要的主模块main.c是整个解释器的入口,如下图所示。
main.c内部比较重要的函数有两个:Py_Main和RunModule:
该函数是python进程的入口函数,主要包括命令行参数解析、初始化、运行三大部分。初始化的详细过程后续分析。运行主要分三类:模块级别、命令级别、其他级别,模块级别即以“python -m xxx.xx”形式运行某个模块级函数,命令级别即以“python -c ‘print 123’”形式运行某个语句,其他主要包括交互模式等。
模块级别运行调用了RunModule函数,其内部流程如上图所示。首先导入了runpy模块,然后利用runpy模块的_run_module_as_main函数根据模块名称实现模块的运行调用。runpy模块是一个python语言实现的模块调用库,Python解释器c源码对_run_module_as_main函数的调用,使用了c函数PyObject_Call来调用对象的可调用函数,该可调用函数也就是PyType_Object结构体内tp_call变量指向的函数。这里啰嗦一句,所有的Python内置对象都是PyType_Object结构体类型变量,该结构体的定义在Include/object.h头文件中。
Python目录主要包含内存池、运行、编译、执行、内置对象以及导入等模块源码。
Parse目录包括读入读取(文件或者交互模式命令行等)、单词解析、词法分析、语法分析等模块源码。
Objects目录主要包含Python对象的相关源码,包括object对象、string对象、int对象、函数对象、类对象、类型对象等对象源码。在Python中一切皆对象,包括各种字典、数字、字符串值,以及数据类型、函数、类等都是对象。
Python脚本的运行主要是对这几个目录中相关c文件中的相关函数调用实现的,这里只简单对一些重要目录进行简单描述,接下来将以交互模式下的执行print “Hello World”语句为例分析详细执行流程。
更多文章请关注微信号