Python 編譯器與解釋器

Python 編譯器與解釋器python

Python的環境咱們已經搭建好了,能夠開始學習基礎知識了。可是,在此以前,還要先說說編譯器與解釋器相關的內容。程序員

若是這部份內容,讓你以爲難以理解或不能徹底明白,能夠暫時跳過,等之後再回過頭來從新讀一遍。算法

1、數據的表示方式

咱們都知道,現實生活中,數字的表示方式有不少種,常見的有二進制、八進制、十進制和十六進制。十進制咱們都很熟悉,加法口訣表咱們都背過,主要是使用0~9,這10個阿拉伯數字來構建整個十進制的體系,其中最核心的法則是「逢十進一」,借位則是「借一當十」。那麼爲何全世界無論什麼國家,什麼歷史,什麼文化水平基本都是用十進制做爲基本進制呢?是由於咱們人有10個手指頭,掰起來最方便!咱們對十進制有着自然的友好度。編程

image.png-139.9kB

那麼對於計算機呢?計算機不是人,沒有10個手指頭能夠掰,因此它用不了十進制。那麼它用幾進制?二進制!二進制是用0和1兩個數碼來表示的數,也就是形如010101010的樣子。它的基數爲2,進位規則是「逢二進一」,借位規則是「借一當二」。網絡

image.png-246.4kB

爲何計算機要使用二進制做爲本身的機器語言也就是數據的表示方式呢?由於計算機最小的計算單元是根據開關狀態高低電平來肯定的,它只有開和關,高和低的概念,換成數學就是0和1的兩種。一樣的,在物理存儲方面,硬盤的磁道只能區分打孔和未打孔的狀態,也是0和1兩種。同時二進制便於進行加、減運算和計數編碼。二進制與十進制數易於互相轉換。二進制便於邏輯判斷(是或非),邏輯判斷一般也是兩種狀態,這和二進制很搭配。二進制表示數據還具備抗干擾能力強,可靠性高的特色,由於當受到必定程度的電磁干擾時,只要能夠分辨出它是高電平仍是低電平,至於高多少或低多少並不重要,就能區分0和1,這在網絡信號中,就是天生自帶抗干擾能力。編程語言

image.png-46.4kB

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

計算機不能獨立存在,目前也沒法自我創造,不論是輸入仍是輸出,它的一切都必須和人交流。那麼問題來了,人類只能讀10進制和英語、漢語等,可計算機只會010101,至於英語、漢語對它而言更是天書。那麼咱們是怎麼和計算機交流的呢?怎麼將咱們的英語或者漢語編碼成計算機可以識別的1010101呢?學習

2、 編程語言發展歷程

1. 打孔紙條

咱們已經知道了計算機只懂機器語言,也就是二進制的數據表示方式,任何對它的操做和編碼,最終都要統一到這上面來,然而這是一個悲傷的故事。優化

image.png-146.2kB

起初,爲了讓計算機按咱們的想法工做,程序員不得不編寫計算機能夠讀懂看明白直接執行的機器碼,也就是01010101的樣子,打孔字條就是這麼幹的。用打沒打孔來表明0和1。OK,計算機沒問題,它能無障礙閱讀,可程序員就難受了。拍腦殼也能想獲得這裏面的問題。容易出錯,效率低,編寫困難,維護困難。可能就是個簡單的打印「hello world」,也許就須要好幾米長的字條。這簡直就是原始社會,生產效率低下的使人髮指。發生個火災什麼的,直接Over。惟一的好處就是無需轉換,可直接執行,但相對缺點來說,這點好處徹底能夠被忽略。編碼

2. 彙編語言

image.png-357.6kB

彙編語言是一種可編程器件的低級語言,亦稱爲符號語言。在彙編語言中,用助記符代替機器指令的操做碼,用地址符號或標號代替指令或操做數的地址。在不一樣的設備中,彙編語言對應着不一樣的機器語言指令集,經過彙編過程轉換成機器指令。也就是說不一樣平臺之間不可直接移植,它是平臺相關的,你在這個硬件平臺寫的彙編程序,換到另一套硬件上去是運行不了的。 所以,彙編語言一般被應用在底層,硬件操做和高要求的程序優化的場合。驅動程序、嵌入式操做系統和實時運行程序較多使用匯編語言。相比於機器碼,它更偏向人類的語言習慣,更易於編寫和閱讀,也就是有一點抽象符號概念化了,這大大提升了編程效率。可是,這依然是一種低級語言,還有改善和提升的空間。

上面一段看得暈不要緊,簡單地說就是彙編語言相比打孔紙條,對人類更友好一點了,至少能用幾個相似ADD\CALL\MOV的英文縮寫了。可是,它犧牲了必定的性能,而且依然不夠友好。

3. C語言

在C語言以前其實還有不少低級語言,咱們不關心它們。爲了讓編程更簡單,更高效,聰明的計算機程序員,一步步發明了FORTRAN、BASIC、B等許多語言,而後在1972年誕生了無人不知,應用最廣,影響最深,至今仍然地位不可動搖的C語言。

image.png-125.5kB

C語言爲何這麼厲害?歸根結底是一句話:直接操做硬件!一樣的算法,用C語言,其執行效率超過JAVA等語言不少。那可能有人會問,C和彙編和機器碼比呢?確定是C慢,可是寫個彙編程序和寫個C程序的效率差異那就更大了。C語言在人類友好性和底層相關性上達到了一個高度的平衡。這二者是互相矛盾的,不可同時兼得。

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

編譯器將編程語言寫的代碼翻譯成機器可以執行或者說「看懂」的二進制機器碼。

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

4. Python語言

在幾十年前,C語言是當之無愧的高級語言表明,如今也依然是語言排行榜第二的霸主。然而,在不少領域,它已經不太適用了,現今更主流的語言是那些上手快、簡單易懂,說白了就是門檻低的語言,讓更多的人能進入程序員行業,讓編程能更容易、更快是將來的發展趨勢。也就是說,須要進一步讓編程語言更貼近人類語言,更遠離機器語言。

Python就是這麼一種語言。它的語法簡單明瞭,更貼近人類的使用習慣。做爲一種動態解釋性語言,讓人們在寫代碼的時候能夠更多的關注業務邏輯細節,而不須要花太多精力去關注數據類型定義、程序運行效率等!

既然都說的是機器不懂的「人話」,那必然也須要一個Python「編譯器」。對於Python語言,廣義上的「編譯器」,叫作解釋器。

3、 編譯器與解釋器

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

都是將代碼翻譯成機器能夠執行的二進制機器碼,只不過在運行原理和翻譯過程有不一樣而已。

image.png-515.5kB

那麼二者有什麼區別呢?

image.png-182.8kB

用一個通俗的例子進行比喻:咱們去飯館吃飯,點了八菜一湯。編譯器的方式就是廚師把全部的菜給你全作好了,一塊兒給你端上來,至於你在哪吃,怎麼吃,隨便。解釋器的方式就是廚師作好一個菜給你上一個菜,你就吃這個菜,並且必須在飯店裏吃。

image.png-125.7kB

至於更深刻的編譯器和解釋器是如何工做的,請參考史詩鉅著《編譯原理》,這本書有個外號,叫作「龍書」。

image.png-305.4kB

4、 Python解釋器種類

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

CPython:官方版本的解釋器。這個解釋器是用C語言開發的,因此叫CPython。CPython是使用最廣的Python解釋器。咱們一般說的、下載的、討論的、使用的都是這個解釋器。

Ipython:基於CPython之上的一個交互式解釋器,在交互方式上有所加強,執行Python代碼的功能和CPython是徹底同樣的。CPython用>>>做爲提示符,而IPython用In [序號]:做爲提示符。

PyPy:一個追求執行速度的Python解釋器。採用JIT技術,對Python代碼進行動態編譯(注意,不是解釋),能夠顯著提升Python代碼的執行速度。絕大部分CPython代碼均可以在PyPy下運行,但仍是有一些不一樣的,這就致使相同的Python代碼在兩種解釋器下執行可能會有不一樣的結果。

Jython:運行在Java平臺上的Python解釋器,能夠直接把Python代碼編譯成Java字節碼執行。

IronPython:和Jython相似,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,能夠直接把Python代碼編譯成.Net的字節碼。

5、 Python的運行機制

Python做爲動態解釋性語言,其運行機制可參考下圖(圖片來自網絡,其中的「編譯器」是對解釋器的廣義稱呼):

image.png-157.1kB

都說解釋器慢,Python也有想辦法提升一下運行速度的,那就是使用pyc文件。這點參考了JAVA的字節碼作法,但並不徹底類同。

咱們編寫的代碼通常都會保存在以.py爲後綴的文件中。在執行程序時,解釋器逐行讀取源代碼並逐行解釋運行。每執行一次,就重複一次這個過程,這其中耗費了大量的重複性的解釋工做。爲了減小這一重複性的解釋工做,Python引入了pyc文件,pyc文件是將py文件的解釋結果保存下來的文件,這樣,下次再運行的時候就不用再解釋了,直接使用pyc文件就能夠了,這無疑大大提升了程序運行速度。

對於pyc文件,你必須知道如下幾點:

  • 對於當前調用的主程序不會生成pyc文件
  • 以import xxx或from xxx import xxx等方式導入主程序的模塊纔會生成pyc文件
  • 每次使用pyc文件時,都會根據pyc文件的建立時間和源模塊進行對比,若是源模塊有修改,則從新建立pyc文件,並覆蓋先前的pyc文件,若是沒有修改,直接使用pyc文件代替模塊;
  • pyc文件統一保存在模塊所在目錄的__pycache__文件夾內。

以下圖所示,modula_a被module_main導入後會生成對應的pyc文件,可是module_main不會生成pyc文件!!

image.png-68.9kB

相關文章
相關標籤/搜索