在剖析源碼的過程中,最好的學習方法是不斷根據掌握的知識修改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