人生苦短,我用Python。
作為一個開發人員,如何寫代碼是必須要知道的,代碼如何運行也是有必要了解的。通過了解代碼如何運行,可指導我們寫出效率更高的代碼。下午看了《Python學習手冊》第二章,了解了一些比較有趣的東西,因此做個總結。
let's do it
Python解釋器
提到Python印象大多是編程語言。其實Python是一個名為解釋器的軟件包,通俗一點解釋器就是將你的代碼解釋給計算機。
官方點,解釋器是代碼與機器的計算機硬件之間的軟件邏輯層。
當安裝Python后,他會生成一些組件:至少包括一個解釋器和一套支持庫。
根據使用情況不同,解釋器可能采取可執行程序的形式,或做為鏈接到另一個程序的庫
根據版本不同,解釋器本身可以用 C程序實現,或一些Java類實現。
無論如何Python代碼必須在解釋器上運行
程序執行
慣例,Python文件都是以.py結尾, 但是從技術上來講,這種命名方案在被“導入”時才是必須的。
當Python運行腳本時,在代碼運行前還要做一些工作。
- 將源碼編譯成字節碼(不是機器碼)
- 將編譯的字節碼放到Python虛擬機(PVM)中運行
字節碼編譯
編譯是一種簡單的翻譯步驟,字節碼是一種低級的,與平台無關的表現形式(可移植性)這些字節碼可以提高執行速度,比源碼快得多。
如果Python進程有寫入權限,那么他會把字節碼保存為一個.pyc為擴展名的文件,3.2之后版本將其放在__pycache__的子目錄中,方便下次PVM跳過編譯直接取用,沒有寫入權限的話運行程序還是會翻譯成字節碼,只不過放內存,程序殺死之后就被丟棄。
Python會檢測源文件是否改變,沒變就直接用上次的.pyc。
對於Python版本,.pyc的文件名中包含版本,因此可區別不同版本編譯的.pyc
.pyc文件起到加速啟動的作用,類似於操作系統的緩存,只不過是執行了一部分再緩存。
Python虛擬機(PVM)
PVM用來執行字節碼文件。 但實際上它不是一個獨立的程序,不用安裝,
本質其實就是一個迭代執行字節碼指令的大循環,一步步的完成操作。期間會將字節碼編譯成二進制碼。
因此,最終的效果是純Python代碼執行速度介於傳統編譯語言和傳統解釋性語言之間(cache的作用)
對開發的意義:編譯和執行的的環境是同一個,。因此編譯器總在運行時出現,這就使Python程序在運行時去構建和執行另一個Python程序成為可能
執行模型的變體
除了傳統的實現模式,Python還有很多實現,簡單說一下
- CPython:標准Python
由可移植的ANSI C語言代碼編寫而成,一般來說用的都是這個
特點:運行速度最快、最完整、最新、最健全。上面的圖便是CPython的運行時體系結構。
- Jython:基於Java的Python
與Java進行集成
- IronPython:基於.Net的Python
- Stackless:注重並發的Python
- PyPy:注重速度的Python 比較有潛力,特別是在CPU密集型代碼,計算領域(AI)
隨着Python的持續升溫,相信以后更加高效的執行模型會出來。
凍結二進制文件
最后記錄下這個,就是生成的可執行文件(獨立的二進制可執行), 有種打包發布的意思
有許多系統可以生成隨平台特性變化的凍結二進制文件
凍結二進制文件其實就是將字節碼和PVM混合在一起形成的一個獨立組件。由於代碼嵌入在凍結二進制文件中,對於接收者來說,代碼是看不見的。
這樣便實現的單文件的封裝,終端用戶都不用安裝Python就可以運行這些程序。