Python編譯器與解釋器

2021-01-07 中公教育IT優就業

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

如果這部分內容,讓你覺得難以理解或不能完全明白,可以暫時跳過,等以後再回過頭來重新讀一遍。

一、數據的表示方式

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

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

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

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

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

二、 程式語言發展歷程

1. 打孔紙條

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

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

2. 彙編語言

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

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

3. C語言

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

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

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

編譯器將程式語言寫的代碼翻譯成機器能夠執行或者說「看懂」的二進位機器碼。

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

4. Python語言

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

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

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

三、 編譯器與解釋器

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

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

那麼兩者有什麼區別呢?

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

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

四、 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的字節碼。

五、 Python的運行機制

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

都說解釋器慢,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文件!!

另外,Python的pyc並不等同於JAVA的字節碼!

相關焦點

  • 11 個優秀的 Python 編譯器和解釋器
    其解釋器可在Windows、Linux 和 Mac OS 等多種作業系統上使用。它的可移植性和可伸縮性等特性使得它更加容易被運用。本文重點介紹了適用於 Python 程式設計師的 11 種優秀的 Python 編譯器和解釋器。很好的 Python 編譯器和解釋器1.Brython
  • python解釋器到底是什麼?
    有很多入門學習python的同學都沒有搞清python解釋器是怎麼回事,所以今天在這裡追根溯源的解釋一下。 計算機程式語言 從計算機程式語言說起,它主要分為三類:機器語言、彙編語言、高級語言。
  • 實例教程,用python實現字節碼編譯器和解釋器
    對於一個語言來說,有兩個最重要功能,編譯器和解釋器。實現由原始碼到字節碼的轉化,然後才能執行。本文中蟲蟲以CPython 3.6位元組碼為實例,實現一個我們自己的字節碼編譯器和解釋器,以此來熟悉基本的編譯器工作原理(),當然如果想深入理論學習,建議大家去學習了《編譯原理》這本教材。
  • 用 Python 實現 Python 解釋器(下)
    動態類型:編譯器不知道它是什麼你可能聽過 Python 是一種動態語言 —— 它是動態類型的。在我們建造解釋器的過程中,已經透露出這樣的信息。動態的一個意思是很多工作是在運行時完成的。前面我們看到 Python 的編譯器沒有很多關於代碼真正做什麼的信息。舉個例子,考慮下面這個簡單的函數mod。它取兩個參數,返回它們的模運算值。
  • 【Python面試】 說說Python解釋器種類以及特點?
    開始今天的題目:問:說說Python解釋器種類以及特點?答:Python是一門解釋器語言,代碼想運行,必須通過解釋器執行,Python存在多種解釋器,分別基於不同語言開發,每個解釋器有不同的特點,但都能正常運行Python代碼。
  • Python IDE和解釋器的區別是什麼?
    1、Python IDEIDE(Integrated Development Environment),全稱是集成開發環境 ,是用於提供程序開發環境的應用程式,一般包括代碼編輯器、編譯器2、解釋器(1)什麼是解釋器我們都知道,Python是一門解釋型語言,解釋器是Python運行必不可少的一種工具。所以,我們搭建Pyhton環境,本質上就是對Pyhton進行配置或者定製。
  • Python程序執行過程與字節碼
    程序寫好後,只需敲下 python 命令,便可將程序啟動起來並開始執行:$ python some-program.py那麼,一個文本形式的 .py 文件,是如何一步步轉換為能夠被 CPU 執行的機器指令的呢?
  • 說說Python程序的執行過程(一)
    編譯型語言在程序執行之前,先會通過編譯器對程序執行一個編譯的過程,把程序轉變成機器語言。運行時就不需要翻譯,而直接執行就可以了。最典型的例子就是C語言。解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,通過解釋器對程序逐行作出解釋,然後直接運行,最典型的例子是Ruby。
  • MicroPython的交互式解釋器模式 (又稱REPL)
    此部分介紹了MicroPython的交互式解釋器模式的特性,其常用術語為REPL(讀取read-評估eval-列印print-循環
  • 深入 Python 解釋器源碼,我終於搞明白了字符串駐留的原理!
    在本文中,我們將深入研究 Python 的內部實現,並了解 Python 如何使用一種名為字符串駐留(String Interning)的技術,實現解釋器的高性能。全文提綱如下:(在 Python貓 公眾號回複數字「0215」,下載思維導圖)字符串駐留是一種編譯器/解釋器的優化方法,它通過緩存一般性的字符串,從而節省字符串處理任務的空間和時間
  • 初識Python
    1991年2月:第一個Python編譯器(同時也是解釋器)誕生,它是用C語言實現的(後面),可以調用C語言的庫函數。在最早的版本中,Python已經提供了對「類」,「函數」,「異常處理」等構造塊的支持,還有對列表、字典等核心數據類型,同時支持以模塊為基礎來構造應用程式。1994年1月:Python 1.0正式發布。
  • python 開發編譯器
    (點擊上方藍字,快速關注我們)來源:伯樂在線專欄作者 - 下弦月如有好文章投稿,請點擊 → 這裡了解詳情如需轉載,發送「轉載」二字查看說明引言最近剛剛用python寫完了一個解析protobuf文件的簡單編譯器,深感ply實現詞法分析和語法分析的簡潔方便。
  • 迅為iTOP-iMX6ULL 開發板-Python 移植
    92.2 編譯92.2.1 編譯 host 版解釋器編譯 Python 的嵌入式版需要解釋器解析 setup.py 從而編譯Python 的模塊,因此需要先編譯出 HOST 的解釋器 。hostpython ,執行命令「mv Parser/pgen Parser/hostpgen」將生成的 PC 版解釋器移動至 Parser/hostpgen 。
  • 大佬專用的十大在線編譯器
    網上十大編譯器網站名稱:1)Ideone.com | 在線IDE和調試工具>> C / C ++,Java,PHP,Python,Perl和40+編譯器和解釋器在線IDE和調試工具www.ideone.com2)鍵盤codepad.org是一個在線編譯
  • Python 與 Unicode
    編程相關的編碼問題關於程式語言的編碼問題, 可能會涉及到這麼幾個內容:源文件自身的編碼編輯器/IDE 所理解的源文件的編碼方式編譯器/解釋器對原始碼中字符常量的處理方式下文我們會一一說明.源文件自身的編碼源文件自身的編碼是由誰決定的呢?
  • python基礎學習教程:Python基礎語法
    第一個 Python 程序交互式編程交互式編程不需要創建腳本文件,是通過 Python 解釋器的交互模式進來編寫代碼。>>> '''在學習過程中有什麼不懂得可以加我的python學習交流扣扣qun,934109170群裡有不錯的學習教程、開發工具與電子書籍。與你分享python企業當下人才需求及怎麼從零基礎學習好python,和學習什麼內容。'''
  • Python入門個人經驗之文本編譯器(IDLE、Anaconda、Pycharm)
    這篇文章主要是根據自己的血淚史想介紹一下Python的文本編譯器。在Python學習之前,選擇一個好的文本編譯器能事半功倍。入門使用的教材是《Python編程從入門到實踐》,開始使用的版本是直接在官網下載Python3.7.0版本,使用的文本編譯器是自帶的IDLE。
  • Python 1 day | 初識Phthon
    Python簡介Python的歷史1989年聖誕節:Guido von Rossum開始寫Python語言的編譯器。1991年2月:第一個Python編譯器(同時也是解釋器)誕生,它是用C語言實現的(後面),可以調用C語言的庫函數。
  • 都有Python 了,還要什麼編譯器!
    編譯的目的是將源碼轉化為機器可識別的可執行程序,在早期,每次編譯都需要重新構建所有東西,後來人們意識到可以讓編譯器自動完成一些工作,從而提升編譯效率。但「編譯器不過是用於代碼生成的軟機器,你可以使用你想要的任何語言來生成代碼」,真的是必要的嗎?
  • 科悟學院講解Python是什麼以及Python的應用
    1.1.編譯和解釋型語言的區別CPU不能直接認識並執行我們寫的語句,它只能認識機器語言(CPU指令集;二進位的形式);因此我們開發語言的Virtual Machine要將識別的開發語言轉換成機器語言讓CPU去執行;那麼就有兩種以下兩種方式:編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進位文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快