Python源码剖析 - Python的总体架构
01. 前言
Python程序的代碼是如何組織的,在代碼完成編寫后,又是如何運(yùn)行的,它其中的原理是怎么回事,大家對這些問題一定很感興趣。
接下來,兔子先生帶著大家一探究竟。
02. Python的總體架構(gòu)
從頂層設(shè)計上來看,Python可以分為三大部分:
- 代碼文件?File Groups?- 包括模塊、庫及用戶自定義的模塊。
- 解釋器?Interpreter?- 又稱Python虛擬機(jī),對代碼分析理解,翻譯成字節(jié)流,并運(yùn)行這些字節(jié)代碼。
- 運(yùn)行環(huán)境?Runtime Env?- 包括運(yùn)行時的對象、基礎(chǔ)類型結(jié)構(gòu)、內(nèi)存分配器和實時的運(yùn)行狀態(tài)信息。
其中,最左邊的python的庫,模塊以及用戶自定義的模塊,都依賴于python解釋器來實現(xiàn),而python解釋器主要包括掃描器,分詞器,編譯器和代碼生成四部分,我們寫一個python文件之后,由python解釋器執(zhí)行,其大致執(zhí)行過程如下:
1、掃描器掃描python文件,將掃描結(jié)果發(fā)給分詞器;
2、在掃描過程中識別出文件中的對象,類型和結(jié)構(gòu)(注:在python中類型和結(jié)構(gòu)都是對象);
3、分詞器將結(jié)果發(fā)給編譯器,編譯器在此時生成相應(yīng)對象同時給對象分配內(nèi)存空間;
4、編譯之后將代碼生成,進(jìn)行內(nèi)存管理并處理當(dāng)前狀態(tài)。
5、對象、類型、結(jié)構(gòu)體、內(nèi)存管理以及當(dāng)前狀態(tài)構(gòu)成了python極其復(fù)雜的runtime運(yùn)行時。
還有,很多人會有疑問,python是動態(tài)語言,內(nèi)存到底是如何管理的,初來乍到,我也不太明白,由于python的各種歷史原因,python的內(nèi)存處理和線程管理非常復(fù)雜,打開源碼看看,如果出現(xiàn)類似object_new這樣的東西,那么他的內(nèi)存就是用C++中的new來開辟的,如果是object_malloc這樣的東西,則表示內(nèi)存是用C中的malloc來實現(xiàn)的。
python屬于脫管型的語言,內(nèi)存不需要我們手動處理,方便了很多,其實,python在底層是用自動引用計數(shù)器來實現(xiàn)的,python中創(chuàng)建小對象時,往往直接在內(nèi)存池中創(chuàng)建,而大對象則是使用new/malloc從內(nèi)存中再創(chuàng)建一個。針對并不復(fù)雜的對象關(guān)系時,比如只有一個對象時,python是不會運(yùn)行鏈路檢測的,而如果對象很多,過系又很復(fù)雜,就會有一個鏈路檢測,以防出現(xiàn)循環(huán)引用和死循環(huán)的問題,當(dāng)釋放內(nèi)存時,則遵守自動引用計數(shù)的規(guī)則,非常了不起。
參考鏈接
https://www.cnblogs.com/skyfree/p/3834030.html
03. File Groups
File Groups就是咱們的代碼,在Python的代碼的編寫過程中,會包含自己編寫的代碼模塊、依賴核心的模塊、第三方模塊和庫文件(Linux下是so庫,而Windows下面則是dll庫)
比如下面一段代碼:
from datetime import date now = date.today()import requests r = requests.get('https://www.xtuz.net')其中?datetime?就是核心模塊,?requests?則屬于第三方模塊,這段代碼本身就屬于用戶的自定義代碼模塊了。
04. Interpreter
Scanner?負(fù)責(zé)詞法分析的工作,將代碼一行一行切分為 token,Parser?則負(fù)責(zé)語法分析,將 Token 組織為抽象語法樹,Compiler?則將語法樹轉(zhuǎn)化為指令集合的字節(jié)碼流,最后由?Code Evaluator?來執(zhí)行這些字節(jié)碼。
下圖是.pyc文件內(nèi)容,即字節(jié)碼流。
05. Runtime Env
Object?和?Type Structure?分別是程序在運(yùn)行過程中生成的對象和Python中的自帶內(nèi)建對象,如int、List、dict等。
而?Memory Allocator?則負(fù)責(zé)申請創(chuàng)建對象需要的內(nèi)存,本質(zhì)就是封裝了 C 語言里面的?malloc()?函數(shù)。
Current State?負(fù)責(zé)維護(hù)運(yùn)行時的各類狀態(tài)信息,以便在程序執(zhí)行過程中如果發(fā)生狀態(tài)變化(正常態(tài)和異常態(tài))時,仍然能正常運(yùn)行。
更多內(nèi)容
原文來自兔子先生網(wǎng)站:https://www.xtuz.net/detail-130.html
總結(jié)
以上是生活随笔為你收集整理的Python源码剖析 - Python的总体架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Axure 共享强制签出签入
- 下一篇: 怎么把python写的程序打包成软件_p