Python解釋執(zhí)行原理分析
本文較為詳細的分析了Python解釋執(zhí)行的原理,對于深入理解Python可以起到一定的幫助作用。具體分析如下:
首先,這里的解釋執(zhí)行是相對于編譯執(zhí)行而言的。我們都知道,使用C/C++之類的編譯性語言編寫的程序,是需要從源文件轉(zhuǎn)換成計算機使用的機器語言,經(jīng)過鏈接器鏈接之后形成了二進制的可執(zhí)行文件。運行該程序的時候,就可以把二進制程序從硬盤載入到內(nèi)存中并運行。
但是對于Python而言,python源碼不需要編譯成二進制代碼,它可以直接從源代碼運行程序。當(dāng)我們運行python文件程序的時候,python解釋器將源代碼轉(zhuǎn)換為字節(jié)碼,然后再由python解釋器來執(zhí)行這些字節(jié)碼。這樣,python就不用擔(dān)心程序的編譯,庫的鏈接加載等問題了。
對于python解釋語言,有以下3方面的特性:
1.每次運行都要進行轉(zhuǎn)換成字節(jié)碼,然后再有虛擬機把字節(jié)碼轉(zhuǎn)換成機器語言,最后才能在硬件上運行。與編譯性語言相比,每次多出了編譯和鏈接的過程,性能肯定會受到影響。
2.由于不用關(guān)心程序的編譯和庫的鏈接等問題,開發(fā)的工作也就更加輕松啦。
3.python代碼與機器底層更遠了,python程序更加易于移植,基本上無需改動就能在多平臺上運行。
在具體計算機上實現(xiàn)一種語言,首先要確定的是表示該語言語義解釋的虛擬計算機,一個關(guān)鍵的問題是程序執(zhí)行時的基本表示是實際計算機上的機器語言還是虛擬機的機器語言。這個問題決定了語言的實現(xiàn)。根據(jù)這個問題的回答,可以將程序設(shè)計語言劃分為兩大類:編譯型語言和解釋型語言。
1.編譯實現(xiàn)的語言,如:C、C++、Fortran、Pascal、Ada。由編譯型語言編寫的源程序需要經(jīng)過編譯,匯編和鏈接才能輸出目標代碼,然后由機器執(zhí)行目標代碼。目標代碼是有機器指令組成,不能獨立運行,因為源程序中可能使用了一些匯編程序不能解釋引用的庫函數(shù),而庫函數(shù)又不在源程序中,此時還需要鏈接程序完成外部引用和目標模板調(diào)用的鏈接任務(wù),最后才能輸出可執(zhí)行代碼。
2.解釋型語言,解釋器不產(chǎn)生目標機器代碼,而是產(chǎn)生中間代碼,這種中間代碼與機器代碼不同,中間代碼的解釋是由軟件支持的,不能直接使用在硬件上。該軟件解釋器通常會導(dǎo)致執(zhí)行效率較低,用解釋型語言編寫的程序是由另一個可以理解中間代碼的解釋程序執(zhí)行的。和編譯的程序不同的是, 解釋程序的任務(wù)是逐一將源代碼的語句解釋成可執(zhí)行的機器指令,不需要將源程序翻譯成目標代碼再執(zhí)行。對于解釋型語言,需要一個專門的解釋器來執(zhí)行該程序,每條語句只有在執(zhí)行是才能被翻譯,這種解釋型語言每執(zhí)行一次就翻譯一次,因而效率低下。
3.Java解釋器,java很特殊,java是需要編譯的,但是沒有直接編譯成機器語言,而是編譯成字節(jié)碼,然后在Java虛擬機上用解釋的方式執(zhí)行字節(jié)碼。Python也使用了類似的方式,先將python編譯成python字節(jié)碼,然后由一個專門的python字節(jié)碼解釋器負責(zé)解釋執(zhí)行字節(jié)碼。
4.python是一門解釋語言,但是出于效率的考慮,提供了一種編譯的方法。編譯之后就得到pyc文件,存儲了字節(jié)碼。python這點和java很類似,但是java與python不同的是,python是一個解釋型的語言,所以編譯字節(jié)碼不是一個強制的操作,事實上,編譯是一個自動的過程,一般不會在意它的存在。編譯成字節(jié)碼可以節(jié)省加載模塊的時間,提高效率。
5.除了效率之外,字節(jié)碼的形式也增加了反向工程的難度,可以保護源代碼。這個只是一定程度上的保護,反編譯還是可以的。
相信本文所述對于大家深入理解Python可以起到一定的促進作用。
相關(guān)文章
Python?任務(wù)自動化工具nox?的配置與?API詳情
這篇文章主要介紹了Python?任務(wù)自動化工具nox?的配置與?API詳情,Nox?會話是通過被@nox.session裝飾的標準?Python?函數(shù)來配置的,具體詳情下文相關(guān)介紹需要的小伙伴可以參考一下2022-07-07關(guān)于Pytorch的MNIST數(shù)據(jù)集的預(yù)處理詳解
今天小編就為大家分享一篇關(guān)于Pytorch的MNIST數(shù)據(jù)集的預(yù)處理詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01python2 與 pyhton3的輸入語句寫法小結(jié)
這篇文章主要給大家介紹了關(guān)于python2 與 pyhton3的輸入語句寫法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09Python?Celery動態(tài)添加定時任務(wù)生產(chǎn)實踐指南
elery是一種異步任務(wù)隊列,如果還不熟悉這個開源軟件的請先看看官方文檔,快速入門,下面這篇文章主要給大家介紹了關(guān)于Python?Celery動態(tài)添加定時任務(wù)生產(chǎn)實踐的相關(guān)資料,需要的朋友可以參考下2022-08-08python從網(wǎng)絡(luò)讀取圖片并直接進行處理的方法
這篇文章主要介紹了python從網(wǎng)絡(luò)讀取圖片并直接進行處理的方法,涉及cStringIO模塊模擬本地文件的使用技巧,需要的朋友可以參考下2015-05-05Python基礎(chǔ)之循環(huán)語句相關(guān)知識總結(jié)
今天給大家?guī)淼氖顷P(guān)于Python基礎(chǔ)的相關(guān)知識,文章圍繞著Python循環(huán)語句展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06pytorch實現(xiàn)用CNN和LSTM對文本進行分類方式
今天小編就為大家分享一篇pytorch實現(xiàn)用CNN和LSTM對文本進行分類方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01