天天看點

說說python解釋器及工作原理

轉載自品略圖書館  http://www.pinlue.com/article/2020/06/2120/0610781702852.html

我們編寫代碼時會得到一個.py結尾的檔案,要想運作執行此檔案就需要python解釋器。

python解釋器的構成及其各部分功能

解釋器由一個編譯器和一個虛拟機構成,編譯器負責将源代碼轉換成位元組碼檔案,而虛拟機負責執行位元組碼。

是以,解釋型語言其實也有編譯過程,隻不過這個編譯過程并不是直接生成目标代碼,而是中間代碼(位元組碼),然後再通過虛拟機來逐行解釋執行位元組碼

個人了解執行過程原理:

執行 python XX.py 後,将會啟動 Python 的解釋器,python解釋器的編譯器會将.py源檔案編譯(解釋)成位元組碼生成PyCodeObject位元組碼對象存放在記憶體中。python解釋器的虛拟機将執行記憶體中的位元組碼對象

轉化為機器語言,虛拟機與作業系統互動,使機器語言在機器硬體上運作。運作結束後python解釋器則将PyCodeObject寫回到pyc檔案中。當python程式第二次運作時,首先程式會在硬碟中尋找pyc檔案,如果找到,則直接載入,否則就重複上面的過程。

是以我們應該這樣來定位PyCodeObject和pyc檔案,我們說pyc檔案其實是PyCodeObject的一種持久化儲存方式。

pyc檔案,檔案中包含python的magic number(來說明編譯時使用的python版本号)、源檔案的mtime(使pyc和py檔案保持同步)、編譯出的code對象。

現存的python解釋器的種類:

CPython這個解釋器是用C語言開發的,是以叫CPython。在指令行下運作python就是啟動CPython解釋器。

CPython是使用最廣的Python解釋器。教程的所有代碼也都在CPython下執行。

IPython

IPython是基于CPython之上的一個互動式解釋器,也就是說,IPython隻是在互動方式上有所增強,但是執行Python代碼的功能和CPython是完全一樣的。好比很多國産浏覽器雖然外觀不同,但核心其實都是調用了IE。

CPython用>>>作為提示符,而IPython用In [序号]:作為提示符。

PyPy

PyPy是另一個Python解釋器,它的目标是執行速度。PyPy采用JIT技術,對Python代碼進行動态編譯(注意不是解釋),是以可以顯着提高Python代碼的執行速度。

絕大部分Python代碼都可以在PyPy下運作,但是PyPy和CPython有一些是不同的,這就導緻相同的Python代碼在兩種解釋器下執行可能會有不同的結果。如果你的代碼要放到PyPy下執行,就需要了解PyPy和CPython的不同點。

Jython

Jython是運作在Java平台上的Python解釋器,可以直接把Python代碼編譯成Java位元組碼執行。

IronPython

IronPython和Jython類似,隻不過IronPython是運作在微軟.Net平台上的Python解釋器,可以直接把Python代碼編譯成.Net的位元組碼。