1. 程式人生 > >Python 編譯器與直譯器

Python 編譯器與直譯器

Python 編譯器與直譯器

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 編譯器直譯器

Python 編譯器與直譯器 Python的環境我們已經搭建好了,可以開始學習基礎知識了。但是,在此之前,還要先說說編譯器與直譯器相關的內容。 如果這部分內容,讓你覺得難以理解或不能完全明白,可以暫時跳過,等以後再回過頭來重新讀一遍。 一、資料的表示方式 我們都知道,現實生活中,數字的表示方式有很多種,常見的

學習筆記 --- JVM JITJVM,編譯器直譯器

JVM---包括直譯器 JVM:是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種利用軟體方法實現的抽象的計算機基於下層的作業系統和硬體平臺,可以在上面執行java的位元組碼程式。 java編譯器只要面向JVM,生成JVM能理解的程式碼或位元組碼檔案。Java原始檔經編譯成

編譯器直譯器的區別

為了讓更多的人能夠從本質上理解編譯器和直譯器的區別,我杜撰了一個小故事 來福與旺財的養牛場 來福和旺財有一 個養 牛場。本來養牛不是一件太難的事情,但是偏偏他倆養的牛都有特別的怪癖。奶牛阿圓只吃切成圓形的牧草,而奶牛阿方和阿三(印度來的?)分別只吃切成正方形 和三角形的牧草。

11 個最佳的 Python 編譯器直譯器

原作:Archie Mistry 翻譯:豌豆花下貓@Python貓 原文:https://morioh.com/p/765b19f066a4 Python 是一門對初學者友好的程式語言,是一種多用途的、解釋性的和麵向物件的高階語言。 它擁有非常小的程式集,非常易於學習、閱讀和維護。其直譯器可在Windows、

python學習篇:python簡介入門

1-1 一行代碼 組合 python代碼 index python語言 cmd https turn 簡介與特點 python語言是由Guido van Rossum在1989年開發的,並最終於1991年初發表。 python是一種面向對象、解釋型的計算機語言,語法簡潔清

Python type __bases__

src ont tls ces true 模板 href dict enc type 字面意思是類型,可以理解為模具,通過模具生成各種各樣的實例。 Python中內置函數type()可以查看實例的具體類型。 什麽樣子的類型是type呢 ? 看看下面的例子。  >&

python版本編碼的區別

而是 hang 什麽 and ati 傳統 格式 字符編碼 com 主要編碼介紹 python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill) ASCII(American Standard Code for Information Interch

C++編譯器鏈接器工作原理

方式 成了 ble pro 需要 symbols ron oid 名稱 http://blog.csdn.net/success041000/article/details/6714195 1. 幾個概念 1)編譯:把源文件中的源代碼翻譯成機器語言,保存到目

C++之編譯器鏈接器工作原理

www 重復項 export 容易 區域 修改 direct 自身 默認 http://www.cnblogs.com/kunhu/p/3629636.html 原文來自:http://blog.sina.com.cn/s/blog_5f8817250100i3oz.htm

程序員必知的Python陷阱缺陷列表

pyc 效果 ror call .org before multi sys pythonic   本文關註的主要是python陷阱,具體而言,是指CPython,而且除非特別說明,所有代碼示例都是在python2.7運行的。   我個人對陷阱的定義是這樣的:代碼看起來可以

python爬蟲——不斷變化的頁面死磕和更新換代(3)

幸好 python爬蟲 不能 mat 實戰 抓包 數字 32bit 進行   經過上一次的實戰,手感有了,普羅西(霧)池也有了,再戰taobao/tmall   試著使用phantomJS爬手機端,結果發現爬來的tmall頁面全是亂碼,taobao頁面xpath識別錯誤。一

python安裝配置

可執行文件 通過 主題 .py arm community 下載 打開 外觀 首先下載python地址: https://www.python.org/downloads/release/python-361/下載頁面中有多個版本: web-based installe

Python 開發接口測試學習筆記

width text googl test ocs 技巧 結構 res line 這是我跟著蟲師學習中積累下來的學習筆記,寫得比較簡單,適合想學習Python開發與接口測試的初學者學習。 一、開發投票系統 1、參考官網文檔,創建投票系統。 https://docs.djan

[轉]python strbytes之間的轉換

color eth bsp nat alter .com http log com 原文:http://www.cnblogs.com/zqifa/p/python-7.html # bytes object b = b"example" # str object

python——時間時間戳之間的轉換

python mktime var arr oca string new per 函數 1、將時間轉換成時間戳 將如上的時間2017-09-16 11:28:54轉換成時間戳 利用strptime()函數將時間轉換成時間數組 利用mktime()函數將時間數組轉換成時間戳

[python基礎] python 2python 3之間的區別 —— round

遇到 2.6 float 變化 pre 之間 問題 span 數據 round()在 py2和py3之間有些區別 在默認精度下, round返回值的數據類型發生了變化: py2 >>> round(2.6) 3.0 >>> >

python字典集合操作

成員 創建 error: 技術分享 blog lap 關系 size pen 字典操作 字典一種key - value 的數據類型,使用就像我們上學用的字典,通過筆劃、字母來查對應頁的詳細內容。 語法: info = { ‘s1‘: "jack",

程序員老司機都要錯的 Python 陷阱缺陷列表

入門 python 我個人對陷阱的定義是這樣的:代碼看起來可以工作,但不是以你“想當然“”的方式。如果一段代碼直接出錯,拋出了異常,我不認為這是陷阱。比如,Python程序員應該都遇到過的“UnboundLocalError”, 示例:>>> a=1 >>> def

第二天---介紹Python編譯器,pycharm設置以及編寫第一個Python程序

python學習記錄介紹Python編譯器1.linux下:一般使用vi或者vim直接編譯以.py為後綴的文件,使用vi需要自己搜索vim python 自動補全以方便我們編寫。2.windos下:(1)使用submit選擇Python類型進行編譯,但是對於初學者submit需要安裝許多插件,很麻煩。這些後面

1 python簡介安裝

python安裝在學習一門語言之前,咱們先了解為什麽我們要學它。python是一個腳本語言,語言簡單,兼容各版本系統,學習這門語言將對以後的運維日常工作提供極大的便利。1.1 Linux 下 python 安裝首先從官網下載所需要的 python 版本,解壓後直接編譯安裝即可,[root@server /]#