天天看点

0. Python3源码—编译0.1. 整体架构0.2. 目录组织0.3. 编译源码0.4. 修改源码0.5 参考

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源码剖析