溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

關(guān)于python編譯過程和執(zhí)行原理的詳細(xì)分析

發(fā)布時(shí)間:2020-07-27 10:59:12 來源:億速云 閱讀:235 作者:清晨 欄目:編程語言

不懂關(guān)于python編譯過程和執(zhí)行原理的詳細(xì)分析?其實(shí)想解決這個(gè)問題也不難,下面讓小編帶著大家一起學(xué)習(xí)怎么去解決,希望大家閱讀完這篇文章后大所收獲。

python編譯過程和執(zhí)行原理

(1)python執(zhí)行原理

這里的解釋執(zhí)行是相對于編譯執(zhí)行而言的。我們都知道,使用C/C++之類的編譯性語言編寫的程序,是需要從源文件轉(zhuǎn)換成計(jì)算機(jī)使用的

機(jī)器語言,經(jīng)過鏈接器鏈接之后形成了二進(jìn)制的可執(zhí)行文件。運(yùn)行該程序的時(shí)候,就可以把二進(jìn)制程序從硬盤載入到內(nèi)存中并運(yùn)行。

但是對于Python而言,python源碼不需要編譯成二進(jìn)制代碼,它可以直接從源代碼運(yùn)行程序。當(dāng)我們運(yùn)行python文件程序的時(shí)候,

python解釋器將源代碼轉(zhuǎn)換為字節(jié)碼,然后再由python解釋器來執(zhí)行這些字節(jié)碼。這樣,python就不用擔(dān)心程序的編譯,庫的鏈接加載

等問題了。

對于python解釋語言,有以下3方面的特性:

每次運(yùn)行都要進(jìn)行轉(zhuǎn)換成字節(jié)碼,然后再有虛擬機(jī)把字節(jié)碼轉(zhuǎn)換成機(jī)器語言,最后才能在硬件上運(yùn)行。與編譯性語言相比,每次多出了編

譯和鏈接的過程,性能肯定會(huì)受到影響;而python并不是每次都需要轉(zhuǎn)換字節(jié)碼,解釋器在轉(zhuǎn)換之前會(huì)判斷代碼文件的修改時(shí)間是否與

上一次轉(zhuǎn)換后的字節(jié)碼pyc文件的修改時(shí)間一致,若不一致才會(huì)重新轉(zhuǎn)換。

由于不用關(guān)心程序的編譯和庫的鏈接等問題,開發(fā)的工作也就更加輕松啦。

python代碼與機(jī)器底層更遠(yuǎn)了,python程序更加易于移植,基本上無需改動(dòng)就能在多平臺上運(yùn)行。

在具體計(jì)算機(jī)上實(shí)現(xiàn)一種語言,首先要確定的是表示該語言語義解釋的虛擬計(jì)算機(jī),一個(gè)關(guān)鍵的問題是程序執(zhí)行時(shí)的基本表示是實(shí)際計(jì)算

機(jī)上的機(jī)器語言還是虛擬機(jī)的機(jī)器語言。這個(gè)問題決定了語言的實(shí)現(xiàn)。根據(jù)這個(gè)問題的回答,可以將程序設(shè)計(jì)語言劃分為兩大類:編譯型

語言和解釋型語言。

編譯實(shí)現(xiàn)的語言,如:C、C++、Fortran、Pascal、Ada。由編譯型語言編寫的源程序需要經(jīng)過編譯,匯編和鏈接才能輸出目標(biāo)代碼,然

后由機(jī)器執(zhí)行目標(biāo)代碼。目標(biāo)代碼是有機(jī)器指令組成,不能獨(dú)立運(yùn)行,因?yàn)樵闯绦蛑锌赡苁褂昧艘恍﹨R編程序不能解釋引用的庫函數(shù),而

庫函數(shù)又不在源程序中,此時(shí)還需要鏈接程序完成外部引用和目標(biāo)模板調(diào)用的鏈接任務(wù),最后才能輸出可執(zhí)行代碼。

解釋型語言,解釋器不產(chǎn)生目標(biāo)機(jī)器代碼,而是產(chǎn)生中間代碼,這種中間代碼與機(jī)器代碼不同,中間代碼的解釋是由軟件支持的,不能

直接使用在硬件上。該軟件解釋器通常會(huì)導(dǎo)致執(zhí)行效率較低,用解釋型語言編寫的程序是由另一個(gè)可以理解中間代碼的解釋程序執(zhí)行的。

和編譯的程序不同的是, 解釋程序的任務(wù)是逐一將源代碼的語句解釋成可執(zhí)行的機(jī)器指令,不需要將源程序翻譯成目標(biāo)代碼再執(zhí)行。對于

解釋型語言,需要一個(gè)專門的解釋器來執(zhí)行該程序,每條語句只有在執(zhí)行是才能被翻譯,這種解釋型語言每執(zhí)行一次就翻譯一次,因而效

率低下。

Java解釋器,java很特殊,java是需要編譯的,但是沒有直接編譯成機(jī)器語言,而是編譯成字節(jié)碼,然后在Java虛擬機(jī)上用解釋的方式執(zhí)

行字節(jié)碼。Python也使用了類似的方式,先將python編譯成python字節(jié)碼,然后由一個(gè)專門的python字節(jié)碼解釋器負(fù)責(zé)解釋執(zhí)行字節(jié)

碼。

python是一門解釋語言,但是出于效率的考慮,提供了一種編譯的方法。編譯之后就得到pyc文件,存儲(chǔ)了字節(jié)碼。python這點(diǎn)和java

很類似,但是java與python不同的是,python是一個(gè)解釋型的語言,所以編譯字節(jié)碼不是一個(gè)強(qiáng)制的操作,事實(shí)上,編譯是一個(gè)自動(dòng)的

過程,一般不會(huì)在意它的存在。編譯成字節(jié)碼可以節(jié)省加載模塊的時(shí)間,提高效率。

除了效率之外,字節(jié)碼的形式也增加了反向工程的難度,可以保護(hù)源代碼。這個(gè)只是一定程度上的保護(hù),反編譯還是可以的。

(2)Python內(nèi)部執(zhí)行過程

一、編譯過程概述

當(dāng)我們執(zhí)行Python代碼的時(shí)候,在Python解釋器用四個(gè)過程“拆解”我們的代碼,最終被CPU執(zhí)行返回給用戶。

首先當(dāng)用戶鍵入代碼交給Python處理的時(shí)候會(huì)先進(jìn)行詞法分析,例如用戶鍵入關(guān)鍵字或者當(dāng)輸入關(guān)鍵字有誤時(shí),都會(huì)被詞法分析所觸

發(fā),不正確的代碼將不會(huì)被執(zhí)行。

下一步Python會(huì)進(jìn)行語法分析,例如當(dāng)"for i in test:"中,test后面的冒號如果被寫為其他符號,代碼依舊不會(huì)被執(zhí)行。

下面進(jìn)入最關(guān)鍵的過程,在執(zhí)行Python前,Python會(huì)生成.pyc文件,這個(gè)文件就是字節(jié)碼,如果我們不小心修改了字節(jié)碼,Python下次

重新編譯該程序時(shí)會(huì)和其上次生成的字節(jié)碼文件進(jìn)行比較,如果不匹配則會(huì)將被修改過的字節(jié)碼文件進(jìn)行覆蓋,以確保每次編譯后字節(jié)碼

的準(zhǔn)確性。

那么什么是字節(jié)碼?字節(jié)碼在Python虛擬機(jī)程序里對應(yīng)的是PyCodeObject對象。.pyc文件是字節(jié)碼在磁盤上的表現(xiàn)形式。簡單來說就是

在編譯代碼的過程中,首先會(huì)將代碼中的函數(shù)、類等對象分類處理,然后生成字節(jié)碼文件。有了字節(jié)碼文件,CPU可以直接識別字節(jié)碼文

件進(jìn)行處理,接著Python就可執(zhí)行了。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享關(guān)于python編譯過程和執(zhí)行原理的詳細(xì)分析內(nèi)容對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI