0.1. 整体架构
在最高的层次上,Python的整体架构可以分为三个主要的部分:
- 左:Python提供的大量的模块、库以及用户自定义的模块;
- 右:Python的运行时环境,包括对象/类型系统(Object/Type structures)、内存分配器(Memory Allocator)和运行时状态信息(Current State of Python);
- 中:Python的核心——解释器(interpreter),或者称为虚拟机,包括词法分析(Scanner),语法分析(Parser),Compiler和Code Evaluator;
0.2. 目录组织
- Include :该目录下包含了Python提供的所有头文件,如果用户需要自己用C或C++来编写自定义模块扩展Python,那么就需要用到这里提供的头文件;
- Lib :该目录包含了Python自带的所有标准库,Lib中的库都是用Python语言编写的;
- Modules :该目录中包含了所有用C语言编写的模块,比如random、StringIO等。Modules中的模块是那些对速度要求非常严格的模块,而有一些对速度没有太严格要求的模块,比如os,就是用Python编写,并且放在Lib目录下的;
- Parser :该目录中包含了Python解释器中的Scanner和Parser部分,即对Python源代码进行词法分析和语法分析的部分;
- Objects :该目录中包含了所有Python的内建对象,包括整数、list、dict等;
- Python :该目录下包含了Python解释器中的Compiler和执行引擎部分,是Python运行的核心所在;
0.3. 编译源码
./configure -prefix=/Users/l.wang/Documents/pythonindepth
make
make install
0.4. 修改源码
试验一下修改源码再编译,此处修改会影响Python中的print方法,多输出一条hello world。
//bltinmodule.c
static PyMethodDef builtin_methods[] = {
// ……
BUILTIN_OCT_METHODDEF
BUILTIN_ORD_METHODDEF
BUILTIN_POW_METHODDEF
{"print", (PyCFunction)builtin_print, METH_FASTCALL | METH_KEYWORDS, print_doc},
// ……
};
static PyObject *
builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject* str = PyUnicode_FromString("hello world\n");
PyObject_Print(str, stdout, Py_PRINT_RAW);
// ……
}
重新make及make install,运行Python,打印:
0.5 参考
- Python源码剖析