今天打算开一个新的系列,本系列将和大家一起对Python的源码进行分析,有参考陈儒的《Python 源码剖析》(强烈推荐这本书),做到知其然知其所以然。
首先我们先从总体结构看一下Python源码的整体架构:
大致分为三个模块
File Groups
- python所提供的的大量的模块、库、以及用户自定义的模块。用户还可以通过自定义模块来扩展python系统。Python Core
- 又称Python虚拟机,对代码分析理解,翻译成字节流,并运行这些字节代码。
Scanner
负责词法分析的工作,将代码一行一行切分为 tokenParser
则负责语法分析,将 Token 组织为抽象语法树Compiler
则将语法树转化为指令集合的字节码流,最后由 Code Evaluator
来执行这些字节码。Runtime Env
- 包括运行时的对象、基础类型结构、内存分配器和实时的运行状态信息。
Object
和 Type Structure
分别是程序在运行过程中生成的对象和Python中的自带内建对象,如int、List、dict等。Memory Allocator
则负责申请创建对象需要的内存,本质就是封装了 C 语言里面的 malloc()
函数。Current State
负责维护运行时的各类状态信息,以便在程序执行过程中如果发生状态变化(正常态和异常态)时,仍然能正常运行。然后可以看一下Python源码的目录结构:
这里有几个目录值得关注一下:
Include:包含了 Python 提供的所有头文件,如果用户需要自己用 C 或 C++来编写自定义模块扩展 Python,那么就需要用到这里提供的头文件。
Lib:包含了 Python 自带的所有标准库,且都是用 Python 语言编写的。
Modules:包含了所有用 C 语言编写的模块,比如 math、hashlib 等。它们都是那些对速度要求非常严格的模块。而相比而言,Lib 目录下则是存放一些对速度 没有太严格要求的模块,比如 os。
Parser:包含了 Python 解释器中的 Scanner 和 Parser 部分,即对 Python 源代码进行词法分析和语法分析的部分。除此以外,此目录还包含了一些有用的工 具,这些工具能够根据 Python 语言的语法自动生成 Python 语言的词法和语法分析器,与 YACC 非常类似。
Objects:包含了所有 Python 的内建对象,包括整数、list、dict 等。同时,该目录还包括了 Python 在运行时需要的所有的内部使用对象的实现。
Python:包含了 Python 解释器中的 Compiler 和执行引擎部分,是 Python 运行的核心所在。
PCbuild:包含了 Visual Studio 2003 的工程文件,研究 Python 源代码就从这里开始。
Programs:包含了 Python 二进制可执行文件的源码。