本文較為詳細的分析了Python解釋執行的原理,對於深入理解Python可以起到一定的協助作用。具體分析如下:
首先,這裡的解釋執行是相對於編譯執行而言的。我們都知道,使用C/C++之類的編譯性語言編寫的程式,是需要從源檔案轉換成電腦使用的機器語言,經過連結器連結之後形成了二進位的可執行檔。運行該程式的時候,就可以把二進位程式從硬碟載入到記憶體中並運行。
但是對於Python而言,python源碼不需要編譯成二進位代碼,它可以直接從原始碼運行程式。當我們運行python檔案程式的時候,python解譯器將原始碼轉換為位元組碼,然後再由python解譯器來執行這些位元組碼。這樣,python就不用擔心程式的編譯,庫的連結載入等問題了。
對於python解釋語言,有以下3方面的特性:
1.每次運行都要進行轉換成位元組碼,然後再有虛擬機器把位元組碼轉換成機器語言,最後才能在硬體上運行。與編譯性語言相比,每次多出了編譯和連結的過程,效能肯定會受到影響。
2.由於不用關心程式的編譯和庫的連結等問題,開發的工作也就更加輕鬆啦。
3.python代碼與機器底層更遠了,python程式更加易於移植,基本上無需改動就能在多平台上運行。
在具體電腦上實現一種語言,首先要確定的是表示該語言語義解釋的虛擬電腦,一個關鍵的問題是程式執行時的基本表示是實際電腦上的機器語言還是虛擬機器的機器語言。這個問題決定了語言的實現。根據這個問題的回答,可以將程式設計語言劃分為兩大類:編譯型語言和解釋型語言。
1.編譯實現的語言,如:C、C++、Fortran、Pascal、Ada。由編譯型語言編寫的來源程式需要經過編譯,彙編和連結才能輸出目標代碼,然後由機器執行目標代碼。目標代碼是有機器指令組成,不能獨立運行,因為來源程式中可能使用了一些組譯工具不能解釋引用的庫函數,而庫函數又不在來源程式中,此時還需要連結程式完成外部參考和目標模板調用的連結任務,最後才能輸出可執行代碼。
2.解釋型語言,解譯器不產生目標機器代碼,而是產生中間代碼,這種中間代碼與機器代碼不同,中間代碼的解釋是由軟體支援的,不能直接使用在硬體上。該軟體解譯器通常會導致執行效率較低,用解釋型語言編寫的程式是由另一個可以理解中間代碼的解釋程式執行的。和編譯的程式不同的是, 解釋程式的任務是逐一將原始碼的語句解釋成可執行檔機器指令,不需要將來源程式翻譯成目標代碼再執行。對於解釋型語言,需要一個專門的解譯器來執行該程式,每條語句只有在執行是才能被翻譯,這種解釋型語言每執行一次就翻譯一次,因而效率低下。
3.Java解譯器,java很特殊,java是需要編譯的,但是沒有直接編譯成機器語言,而是編譯成位元組碼,然後在Java虛擬機器上用解釋的方式執行位元組碼。Python也使用了類似的方式,先將python編譯成python位元組碼,然後由一個專門的python位元組碼解譯器負責解釋執行位元組碼。
4.python是一門解釋語言,但是出於效率的考慮,提供了一種編譯的方法。編譯之後就得到pyc檔案,儲存了位元組碼。python這點和java很類似,但是java與python不同的是,python是一個解釋型的語言,所以編譯位元組碼不是一個強制的操作,事實上,編譯是一個自動的過程,一般不會在意它的存在。編譯成位元組碼可以節省載入模組的時間,提高效率。
5.除了效率之外,位元組碼的形式也增加了反向工程的難度,可以保護原始碼。這個只是一定程度上的保護,反編譯還是可以的。
相信本文所述對於大家深入理解Python可以起到一定的促進作用。