最近想读读Python源码,任何东西学习方法基本都是一样的,先从总体框架进行了解,再从自己侧重的方面逐步深入。
1. Python总体架构
左边是Python提供的大量的模块、库以及用户自定义的模块。比如在执行import os时,这个os就是Python内建的模块,当然用户还可以通过自定义模块来扩展Python系统。
右边是Python的运行时环境,包括对象/类型系统(Object/Type structures)、内存分配器(Memory Allocator)和运行时状态信息(Current State of Python)。运行时状态维护了解释器在执行字节码时不同的状态(比如正常状态和异常状态)之间切换的动作,我们可以将它视为一个巨大而复杂的有穷状态机。内存分配器则全权负责Python中创建对象时,对内存的申请工作,实际上它就是Python运行时与C中malloc的一层接口。而对象/类型系统则包含了Python中存在的各种内建对象,比如整数、list、dict,以及各种用户自定义的类型对象。
在中间的部分,可以看到Python的核心——解释器(interpreter),或者成为虚拟机。在解释器中,箭头的方向指示了Python运行过程中的数据流方向。其中Scanner对应词法分析,将文件输入的Python源代码或从命令行输入的一行行Python代码切分为一个个的token;Parser对应语法分析,在Scanner的分析结果上进行语法分析,建立抽象语法树(AST);Compiler是根据建立的AST生成指令集合——Python字节码(byte code),就像Java编译器和C#编译器所做的那样;最后由Code Evaluator来执行这些字节码。因此,Code Evaluator又可以被称为虚拟机。
在解释器与右边的对象/类型系统、内存分配器之间的箭头表示“使用”关系;而与运行时状态之间的箭头表示“修改”关系,即Python在执行过程中会不断地修改当前解释器所处的状态,在不同状态之间切换。
2. Python源码的组织
Python源码下载地址:https://www.python.org/downloads/
Python源码压缩包解压后目录结构为:
Include:该目录下包含了Python提供的所有文件头,如果用户需要自己用C或者C++来编写自定义模块扩展Python,那么就需要用到这里提供的头文件。
Lib:该目录包含了Python自带的所有标准库,Lib中的库都是用Python语言编写的。
Modules:该目录中包含了所有用C语言编写的模块,比如random、cStringIO等。Modules中的模块是那些对速度要求非常严格的模块,而有一些对速度没有太严格要求的模块,比如os,就是用Python编写,并且放在Lib目录下的。
Parser:该目录中包含了Python解释器中的Scanner和Parser部分,即对Python源码进行词法分析和语法分析的部分。除了这些,Parser目录下还包含了一些有用的工具,这些工具能够根据Python语言的语法自动生成Python语言的词法和语法分析器,与YACC非常类似。
Objects:该目录中包含了所有Python的内建对象,包括整数、list、dict等。同时,该目录还包括了Python在运行时需要的所有的内部使用对象的实现。
Python:该目录中包含了Python解释器中的Compiler和执行引擎部分,是Python运行的核心所在。
PCBuild:包含了Visual Studio的工程文件,研究Python源码就从这里开始。
3. 学习目标
接下来学习目标是彻底剖析Python在运行时的行为,从而为彻底理解Python的运行机制。
因此,接下来主要从三个方面进行学习:
(1)Python内建对象
(2)Python虚拟机:分析Python虚拟机执行字节码指令的过程。Python是如何通过虚拟机实现各种表达式、控制流、异常机制、函数机制及类机制。
(3)Python高级话题:剖析Python的运行环境以及一些高级话题。Python运行环境的初始化、动态加载机制、多线程机制和内存管理机制。
转载:https://blog.csdn.net/qq_33254870/article/details/85054559