天天看點

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