Python中的編譯器與解釋器的作用是什么-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)公司成立于2013年,先為紅河等服務(wù)建站,紅河等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為紅河企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

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

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

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

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

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

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

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

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

1. 打孔紙條

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

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

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

2. 匯編語言

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

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

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

3. C語言

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

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

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

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

編譯器將編程語言寫的代碼翻譯成機器能夠執(zhí)行或者說“看懂”的二進制機器碼。

其實我們安裝JAVA也好,C也好,Python也罷,主要就是安裝的這個編程語言的“編譯器”。

4. Python語言

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

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

既然都說的是機器不懂的“人話”,那必然也需要一個Python“編譯器”。對于Python語言,廣義上的“編譯器”,叫做解釋器。

三、 編譯器與解釋器

編譯器/解釋器:高級語言與機器之間的翻譯官

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

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

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

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

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

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

至于更深入的編譯器和解釋器是如何工作的,請參考史詩巨著《編譯原理》,這本書有個外號,叫做“龍書”。

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

四、 Python解釋器種類

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

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

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

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

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

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

五、 Python的運行機制

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

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

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

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

對于pyc文件,你必須知道以下幾點:

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

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

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

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

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

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

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

“Python中的編譯器與解釋器的作用是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

分享文章:Python中的編譯器與解釋器的作用是什么-創(chuàng)新互聯(lián)
分享URL:http://bm7419.com/article32/cdissc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、外貿(mào)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站做網(wǎng)站、全網(wǎng)營銷推廣、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司