閱讀目錄:
我們編寫代碼時會得到一個.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
CPython這個解釋器是用C語言開發的,所以叫CPython。在命令行下運行python就是啟動CPython解釋器。
CPython是使用最廣的Python解釋器。
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的字節碼。