Python解释器源码分析(一):目录结构

目录

0x00 口水话

0x01 源码版本

0x02 分析工具

0x03 分析方法

0x04 目录结构

1. Modules目录

2. Python目录

3. Parse目录

4. Objects目录


0x00 口水话

由于是第一次阅读开源代码,没有相关经验,只能借助相关开发工具,以调试代码的形式对Python解释器源码调用关系、层次结构进行分析,分析过程可谓是“山穷水尽疑无路,柳暗花明又一村”。经过几番风雨,终于掌握了其大致流程和一些内部机制,同时也学到不少新知识。下面对本次的源码阅读进行简单总结,同时也起到笔记之目的。

0x01 源码版本

2.7.9。这里再啰嗦下,不是特意找的这个版本来分析,而是码机上刚好有此版本之源码,抱着省时(偷懒)的态度,于是乎就干脆分析此版本吧!

0x02 分析工具

Visual Studio 2013、Xmind 8。

0x03 分析方法

代码阅读、打开源码相关debug标志、编译并单步调试。

0x04 目录结构

这里只简单列举下比较重要的源码目录,主要有Modules、Python、Parse、Objects,后续将逐渐对相关目录下的模块进行分析探讨。

1. Modules目录

Modules目录主要包含主模块main.c以及其他Python内置模块,包括json、random、math、mmap、md5、sha、time、signal、time等内置模块源码。比较重要的主模块main.c是整个解释器的入口,如下图所示。

main.c内部比较重要的函数有两个:Py_Main和RunModule:

  • Py_Main

该函数是python进程的入口函数,主要包括命令行参数解析、初始化、运行三大部分。初始化的详细过程后续分析。运行主要分三类:模块级别、命令级别、其他级别,模块级别即以“python -m xxx.xx”形式运行某个模块级函数,命令级别即以“python -c ‘print 123’”形式运行某个语句,其他主要包括交互模式等。

  • RunModule

模块级别运行调用了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头文件中。

2. Python目录

Python目录主要包含内存池、运行、编译、执行、内置对象以及导入等模块源码。

3. Parse目录

Parse目录包括读入读取(文件或者交互模式命令行等)、单词解析、词法分析、语法分析等模块源码。

4. Objects目录

Objects目录主要包含Python对象的相关源码,包括object对象、string对象、int对象、函数对象、类对象、类型对象等对象源码。在Python中一切皆对象,包括各种字典、数字、字符串值,以及数据类型、函数、类等都是对象。

Python脚本的运行主要是对这几个目录中相关c文件中的相关函数调用实现的,这里只简单对一些重要目录进行简单描述,接下来将以交互模式下的执行print “Hello World”语句为例分析详细执行流程。

更多文章请关注微信号

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

「已注销」

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

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

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

打赏作者

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

抵扣说明:

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

余额充值