溫馨提示×

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

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

Python中的編譯器與解釋器的作用是什么

發(fā)布時(shí)間:2021-09-09 07:59:48 來(lái)源:億速云 閱讀:330 作者:chen 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“Python中的編譯器與解釋器的作用是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

一、數(shù)據(jù)的表示方式

我們都知道,現(xiàn)實(shí)生活中,數(shù)字的表示方式有很多種,常見(jiàn)的有二進(jìn)制、八進(jìn)制、十進(jìn)制和十六進(jìn)制。十進(jìn)制我們都很熟悉,加法口訣表我們都背過(guò),主要是使用0~9,這10個(gè)阿拉伯?dāng)?shù)字來(lái)構(gòu)建整個(gè)十進(jìn)制的體系,其中最核心的法則是“逢十進(jìn)一”,借位則是“借一當(dāng)十”。那么為什么全世界不管什么國(guó)家,什么歷史,什么文化水平基本都是用十進(jìn)制作為基本進(jìn)制呢?是因?yàn)槲覀內(nèi)擞?0個(gè)手指頭,掰起來(lái)最方便!我們對(duì)十進(jìn)制有著天然的友好度。

那么對(duì)于計(jì)算機(jī)呢?計(jì)算機(jī)不是人,沒(méi)有10個(gè)手指頭可以掰,所以它用不了十進(jìn)制。那么它用幾進(jìn)制?二進(jìn)制!二進(jìn)制是用0和1兩個(gè)數(shù)碼來(lái)表示的數(shù),也就是形如010101010的樣子。它的基數(shù)為2,進(jìn)位規(guī)則是“逢二進(jìn)一”,借位規(guī)則是“借一當(dāng)二”。

為什么計(jì)算機(jī)要使用二進(jìn)制作為自己的機(jī)器語(yǔ)言也就是數(shù)據(jù)的表示方式呢?因?yàn)橛?jì)算機(jī)最小的計(jì)算單元是根據(jù)開(kāi)關(guān)狀態(tài)高低電平來(lái)確定的,它只有開(kāi)和關(guān),高和低的概念,換成數(shù)學(xué)就是0和1的兩種。同樣的,在物理存儲(chǔ)方面,硬盤(pán)的磁道只能區(qū)分打孔和未打孔的狀態(tài),也是0和1兩種。同時(shí)二進(jìn)制便于進(jìn)行加、減運(yùn)算和計(jì)數(shù)編碼。二進(jìn)制與十進(jìn)制數(shù)易于互相轉(zhuǎn)換。二進(jìn)制便于邏輯判斷(是或非),邏輯判斷通常也是兩種狀態(tài),這和二進(jìn)制很搭配。二進(jìn)制表示數(shù)據(jù)還具有抗干擾能力強(qiáng),可靠性高的特點(diǎn),因?yàn)楫?dāng)受到一定程度的電磁干擾時(shí),只要可以分辨出它是高電平還是低電平,至于高多少或低多少并不重要,就能區(qū)分0和1,這在網(wǎng)絡(luò)信號(hào)中,就是天生自帶抗干擾能力。

Python中的編譯器與解釋器的作用是什么

但是,在人機(jī)交流上,二進(jìn)位制有致命的弱點(diǎn),數(shù)字的書(shū)寫(xiě)特別冗長(zhǎng),并且沒(méi)有人類可讀性!例如,十進(jìn)位制的100000寫(xiě)成二進(jìn)制就是11000011010100000,長(zhǎng)了好幾倍,而且你能從一個(gè)這么長(zhǎng)的二進(jìn)制數(shù)里讀出它的十進(jìn)制數(shù)是多少嗎?

計(jì)算機(jī)不能獨(dú)立存在,目前也無(wú)法自我創(chuàng)造,不管是輸入還是輸出,它的一切都必須和人交流。那么問(wèn)題來(lái)了,人類只能讀10進(jìn)制和英語(yǔ)、漢語(yǔ)等,可計(jì)算機(jī)只會(huì)010101,至于英語(yǔ)、漢語(yǔ)對(duì)它而言更是天書(shū)。那么我們是怎么和計(jì)算機(jī)交流的呢?怎么將我們的英語(yǔ)或者漢語(yǔ)編碼成計(jì)算機(jī)能夠識(shí)別的1010101呢?

二、 編程語(yǔ)言發(fā)展歷程

1. 打孔紙條

我們已經(jīng)知道了計(jì)算機(jī)只懂機(jī)器語(yǔ)言,也就是二進(jìn)制的數(shù)據(jù)表示方式,任何對(duì)它的操作和編碼,最終都要統(tǒng)一到這上面來(lái),然而這是一個(gè)悲傷的故事。

Python中的編譯器與解釋器的作用是什么

起初,為了讓計(jì)算機(jī)按我們的想法工作,程序員不得不編寫(xiě)計(jì)算機(jī)可以讀懂看明白直接執(zhí)行的機(jī)器碼,也就是01010101的樣子,打孔字條就是這么干的。用打沒(méi)打孔來(lái)代表0和1。OK,計(jì)算機(jī)沒(méi)問(wèn)題,它能無(wú)障礙閱讀,可程序員就難受了。拍腦袋也能想得到這里面的問(wèn)題。容易出錯(cuò),效率低,編寫(xiě)困難,維護(hù)困難。可能就是個(gè)簡(jiǎn)單的打印“hello world”,也許就需要好幾米長(zhǎng)的字條。這簡(jiǎn)直就是原始社會(huì),生產(chǎn)效率低下的令人發(fā)指。發(fā)生個(gè)火災(zāi)什么的,直接Over。唯一的好處就是無(wú)需轉(zhuǎn)換,可直接執(zhí)行,但相對(duì)缺點(diǎn)來(lái)講,這點(diǎn)好處完全可以被忽略。

2. 匯編語(yǔ)言

Python中的編譯器與解釋器的作用是什么

匯編語(yǔ)言是一種可編程器件的低級(jí)語(yǔ)言,亦稱為符號(hào)語(yǔ)言。在匯編語(yǔ)言中,用助記符代替機(jī)器指令的操作碼,用地址符號(hào)或標(biāo)號(hào)代替指令或操作數(shù)的地址。在不同的設(shè)備中,匯編語(yǔ)言對(duì)應(yīng)著不同的機(jī)器語(yǔ)言指令集,通過(guò)匯編過(guò)程轉(zhuǎn)換成機(jī)器指令。也就是說(shuō)不同平臺(tái)之間不可直接移植,它是平臺(tái)相關(guān)的,你在這個(gè)硬件平臺(tái)寫(xiě)的匯編程序,換到另外一套硬件上去是運(yùn)行不了的。 因此,匯編語(yǔ)言通常被應(yīng)用在底層,硬件操作和高要求的程序優(yōu)化的場(chǎng)合。驅(qū)動(dòng)程序、嵌入式操作系統(tǒng)和實(shí)時(shí)運(yùn)行程序較多使用匯編語(yǔ)言。相比于機(jī)器碼,它更偏向人類的語(yǔ)言習(xí)慣,更易于編寫(xiě)和閱讀,也就是有一點(diǎn)抽象符號(hào)概念化了,這大大提高了編程效率。但是,這依然是一種低級(jí)語(yǔ)言,還有改善和提高的空間。

上面一段看得暈沒(méi)關(guān)系,簡(jiǎn)單地說(shuō)就是匯編語(yǔ)言相比打孔紙條,對(duì)人類更友好一點(diǎn)了,至少能用幾個(gè)類似ADD\CALL\MOV的英文縮寫(xiě)了。但是,它犧牲了一定的性能,并且依然不夠友好。

3. C語(yǔ)言

在C語(yǔ)言之前其實(shí)還有很多低級(jí)語(yǔ)言,我們不關(guān)心它們。為了讓編程更簡(jiǎn)單,更高效,聰明的計(jì)算機(jī)程序員,一步步發(fā)明了FORTRAN、BASIC、B等許多語(yǔ)言,然后在1972年誕生了無(wú)人不知,應(yīng)用最廣,影響最深,至今仍然地位不可動(dòng)搖的C語(yǔ)言。

Python中的編譯器與解釋器的作用是什么

C語(yǔ)言為什么這么厲害?歸根結(jié)底是一句話:直接操作硬件!同樣的算法,用C語(yǔ)言,其執(zhí)行效率超過(guò)JAVA等語(yǔ)言很多。那可能有人會(huì)問(wèn),C和匯編和機(jī)器碼比呢?肯定是C慢,但是寫(xiě)個(gè)匯編程序和寫(xiě)個(gè)C程序的效率差別那就更大了。C語(yǔ)言在人類友好性和底層相關(guān)性上達(dá)到了一個(gè)高度的平衡。這兩者是互相矛盾的,不可同時(shí)兼得。

C干了些什么?其實(shí)它就是在人類友好性方面相比以前跨出了更大一步。人類是方便了,可機(jī)器就迷糊了!你給我這么多字符都是啥意思?機(jī)器它只懂二進(jìn)制??!那么C的代碼是如何被執(zhí)行的呢?這就得請(qǐng)出編譯器了!

編譯器將編程語(yǔ)言寫(xiě)的代碼翻譯成機(jī)器能夠執(zhí)行或者說(shuō)“看懂”的二進(jìn)制機(jī)器碼。

其實(shí)我們安裝JAVA也好,C也好,Python也罷,主要就是安裝的這個(gè)編程語(yǔ)言的“編譯器”。

4. Python語(yǔ)言

在幾十年前,C語(yǔ)言是當(dāng)之無(wú)愧的高級(jí)語(yǔ)言代表,現(xiàn)在也依然是語(yǔ)言排行榜第二的霸主。然而,在很多領(lǐng)域,它已經(jīng)不太適用了,現(xiàn)今更主流的語(yǔ)言是那些上手快、簡(jiǎn)單易懂,說(shuō)白了就是門(mén)檻低的語(yǔ)言,讓更多的人能進(jìn)入程序員行業(yè),讓編程能更容易、更快是未來(lái)的發(fā)展趨勢(shì)。也就是說(shuō),需要讓編程語(yǔ)言更貼近人類語(yǔ)言,更遠(yuǎn)離機(jī)器語(yǔ)言。

Python就是這么一種語(yǔ)言。它的語(yǔ)法簡(jiǎn)單明了,更貼近人類的使用習(xí)慣。作為一種動(dòng)態(tài)解釋性語(yǔ)言,讓人們?cè)趯?xiě)代碼的時(shí)候可以更多的關(guān)注業(yè)務(wù)邏輯細(xì)節(jié),而不需要花太多精力去關(guān)注數(shù)據(jù)類型定義、程序運(yùn)行效率等!

既然都說(shuō)的是機(jī)器不懂的“人話”,那必然也需要一個(gè)Python“編譯器”。對(duì)于Python語(yǔ)言,廣義上的“編譯器”,叫做解釋器。

三、 編譯器與解釋器

編譯器/解釋器:高級(jí)語(yǔ)言與機(jī)器之間的翻譯官

都是將代碼翻譯成機(jī)器可以執(zhí)行的二進(jìn)制機(jī)器碼,只不過(guò)在運(yùn)行原理和翻譯過(guò)程有不同而已。

Python中的編譯器與解釋器的作用是什么

那么兩者有什么區(qū)別呢?

Python中的編譯器與解釋器的作用是什么

用一個(gè)通俗的例子進(jìn)行比喻:我們?nèi)ワ堭^吃飯,點(diǎn)了八菜一湯。編譯器的方式就是廚師把所有的菜給你全做好了,一起給你端上來(lái),至于你在哪吃,怎么吃,隨便。解釋器的方式就是廚師做好一個(gè)菜給你上一個(gè)菜,你就吃這個(gè)菜,而且必須在飯店里吃。

Python中的編譯器與解釋器的作用是什么

至于更深入的編譯器和解釋器是如何工作的,請(qǐng)參考史詩(shī)巨著《編譯原理》,這本書(shū)有個(gè)外號(hào),叫做“龍書(shū)”。

Python中的編譯器與解釋器的作用是什么

四、 Python解釋器種類

Python有好幾種版本的解釋器:

CPython:官方版本的解釋器。這個(gè)解釋器是用C語(yǔ)言開(kāi)發(fā)的,所以叫CPython。CPython是使用最廣的Python解釋器。我們通常說(shuō)的、下載的、討論的、使用的都是這個(gè)解釋器。

Ipython:基于CPython之上的一個(gè)交互式解釋器,在交互方式上有所增強(qiáng),執(zhí)行Python代碼的功能和CPython是完全一樣的。CPython用>>>作為提示符,而IPython用In [序號(hào)]:作為提示符。

PyPy:一個(gè)追求執(zhí)行速度的Python解釋器。采用JIT技術(shù),對(duì)Python代碼進(jìn)行動(dòng)態(tài)編譯(注意,不是解釋),可以顯著提高Python代碼的執(zhí)行速度。絕大部分CPython代碼都可以在PyPy下運(yùn)行,但還是有一些不同的,這就導(dǎo)致相同的Python代碼在兩種解釋器下執(zhí)行可能會(huì)有不同的結(jié)果。

Jython:運(yùn)行在Java平臺(tái)上的Python解釋器,可以直接把Python代碼編譯成Java字節(jié)碼執(zhí)行。

IronPython:和Jython類似,只不過(guò)IronPython是運(yùn)行在微軟.Net平臺(tái)上的Python解釋器,可以直接把Python代碼編譯成.Net的字節(jié)碼。

五、 Python的運(yùn)行機(jī)制

Python作為動(dòng)態(tài)解釋性語(yǔ)言,其運(yùn)行機(jī)制可參考下圖(圖片來(lái)自網(wǎng)絡(luò),其中的“編譯器”是對(duì)解釋器的廣義稱呼):

Python中的編譯器與解釋器的作用是什么

都說(shuō)解釋器慢,Python也有想辦法提高一下運(yùn)行速度的,那就是使用pyc文件。這點(diǎn)參考了JAVA的字節(jié)碼做法,但并不完全類同。

我們編寫(xiě)的代碼一般都會(huì)保存在以.py為后綴的文件中。在執(zhí)行程序時(shí),解釋器逐行讀取源代碼并逐行解釋運(yùn)行。每執(zhí)行一次,就重復(fù)一次這個(gè)過(guò)程,這其中耗費(fèi)了大量的重復(fù)性的解釋工作。為了減少這一重復(fù)性的解釋工作,Python引入了pyc文件,pyc文件是將py文件的解釋結(jié)果保存下來(lái)的文件,這樣,下次再運(yùn)行的時(shí)候就不用再解釋了,直接使用pyc文件就可以了,這無(wú)疑大大提高了程序運(yùn)行速度。

對(duì)于pyc文件,你必須知道以下幾點(diǎn):

  • 對(duì)于當(dāng)前調(diào)用的主程序不會(huì)生成pyc文件;

  • 以import xxx或from xxx import xxx等方式導(dǎo)入主程序的模塊才會(huì)生成pyc文件;

  • 每次使用pyc文件時(shí),都會(huì)根據(jù)pyc文件的創(chuàng)建時(shí)間和源模塊進(jìn)行對(duì)比,如果源模塊有修改,則重新創(chuàng)建pyc文件,并覆蓋先前的pyc文件,如果沒(méi)有修改,直接使用pyc文件代替模塊;

  • pyc文件統(tǒng)一保存在模塊所在目錄的__pycache__文件夾內(nèi)。

如下圖所示,modula_a被module_main導(dǎo)入后會(huì)生成對(duì)應(yīng)的pyc文件,但是module_main不會(huì)生成pyc文件??!

Python中的編譯器與解釋器的作用是什么

另外,Python的pyc并不等同于JAVA的字節(jié)碼!

“Python中的編譯器與解釋器的作用是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

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

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

AI