Python源码剖析之编译Python
在剖析源码的过程中,最好的学习方法是不断根据掌握的知识修改Python源代码,以印证自己的知识和猜想。
一、Python总体架构
在最高的层次上,Python的整体架构可以分为三个主要部分,如上图,左边的Core Modules(内置模块)、Library(库)以及User-defined Modules(用户自定义模块)。
在图的右边,是Python的运行时环境,包括对象/类型系统(Object/Type stuctures)、内存分配器(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),最后由Code Evaluator来执行这些字节码。因此,Code Evaluator又可以被称为虚拟机。
图中,在解释器与右边的对象/类型系统、内存分配器之间的箭头表示"使用"关系;而与运行时状态之间的箭头表示“修改”关系,即Python在执行的过程中会不断地修改当前解释器所处的状态,在不同的状态之间切换。
二、Python源代码结构
Python源码下载地址:https://www.python.org/downloads/
选择相应的版本下载,本文以最新版Python3.5.1进行分析。 wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
下载了Python源码并解压后可以看到如下图所示的目录结构:
Include: 该目录下包含了Python提供的所有头文件,如果用户需要自己用C或C++来编写自定义模块扩展Python,就需要用到这里提供的头文件。
Lib: 该目录包含了Python自带的所有标准库,Lib中的库都是用Python语言编写的。
Modules: 该目录中包含了所有用C语言编写的模块,比如random、cStringIO等。Modules中的模块是那些对速度要求非常严格的模块,而有一些对速度没有太严格要求的模块,比如os,就是用Python编写的,并且放在Lib目录下。
Parser: 该目录中包含了Python解释器中的Scanner和Parser部分,即对Python源代码进行词法分析和语法分析的部分。除了这些,Parse目录下还包含了一些有用的工具,这些工具能够根据Python语言的语法自动生成Python语言的词法和语法分析器,与YACC非常类似。
Objects: 该目录中包含了所有Python的内建对象,包括整数、list、dict等。同时,该目录还包括了Python在运行时需要的所有的内部使用对象的实现。
Python: 该目录下包含了Python解释器中的Compiler和执行引擎部分,是Python运行的核心所在。
三、编译安装
./configure
make all
make install