python源碼學習(一)——python的總體架構
系統:ubuntu 12.04 STL
python版本:2.7
既然要學習python的源碼,首先我們要在電腦上安裝python並且下載python的源碼,ubuntu 12.04 STL
自帶的python版本為2.7.3,這就可以了,接下來下載源碼,下載python2.7.7的源代碼,下載結束后解壓文件,我們會看到如下文件結構:,接下來介紹一下,
demo文件夾里放的是一些例子;
Doc文件夾里放的是文檔,Grammer是語法分析器,include是python所包含的一些頭文件,Lib是python的庫,都是用python語言寫的,Moduels是用C寫的python模塊,Parser是分詞器。圖片是最生動的文字,現在我來附上我所理解的python總體架構圖片:
其中,最左邊的python的庫,模塊以及用戶自定義的模塊,都依賴於python解釋器來實現,而python解釋器主要包括掃描器,分詞器,編譯器和代碼生成四部分,我們寫一個python文件之后,由python解釋器執行,其大致執行過程如下:
1、掃描器掃描python文件,將掃描結果發給分詞器;
2、在掃描過程中識別出文件中的對象,類型和結構(注:在python中類型和結構都是對象);
3、分詞器將結果發給編譯器,編譯器在此時生成相應對象同時給對象分配內存空間;
4、編譯之后將代碼生成,進行內存管理並處理當前狀態。
5、對象、類型、結構體、內存管理以及當前狀態構成了python極其復雜的runtime運行時。
還有,很多人會有疑問,python是動態語言,內存到底是如何管理的,初來乍到,我也不太明白,由於python的各種歷史原因,python的內存處理和線程管理非常復雜,打開源碼看看,如果出現類似object_new這樣的東西,那么他的內存就是用C++中的new來開辟的,如果是object_malloc這樣的東西,則表示內存是用C中的malloc來實現的。
python屬於脫管型的語言,內存不需要我們手動處理,方便了很多,其實,python在底層是用自動引用計數器來實現的,python中創建小對象時,往往直接在內存池中創建,而大對象則是使用new/malloc從內存中再創建一個。針對並不復雜的對象關系時,比如只有一個對象時,python是不會運行鏈路檢測的,而如果對象很多,過系又很復雜,就會有一個鏈路檢測,以防出現循環引用和死循環的問題,當釋放內存時,則遵守自動引用計數的規則,非常了不起。
好了,本篇先講到這里,下次繼續學習。
后續的python學習筆記: http://www.androiddev.net/python2/