『無為則無心』Python基礎 — 2、編譯型語言和解釋型語言的區別
1、什麼是電腦語言
電腦就是一台用來電腦的機器,人讓電腦幹什麼電腦就幹什麼。我們需要通過電腦的語言來控制電腦,所謂電腦的語言就是程式語言。
電腦語言其實和人類的語言沒有本質的區別,不同點就是交流的主體不同。也就是說中文、英文是人和人之間的交流語言,而電腦語言(程式語言)是人和電腦交流的語言。
電腦語言發展經歷了三個階段:
(1)機器語言
- 最早的一種電腦語言。
- 機器語言通過二進位編碼來編寫程式,二進位編碼就是1和0,電腦也只認識1和0。
- 執行效率高,但編寫起來太麻煩。
(2)彙編語言
- 使用符號(如ABC和各種符號)來代替二進位編碼。
編寫程式時,不需要使用二進位,而是直接編寫符號。
編寫完成後,需要將符號轉換為機器碼,然後再由電腦執行。 - 符號轉換為機器碼的過程稱為彙編。
- 將機器碼轉換為符號的過程,稱為反彙編 。
- 彙編語言一般只適用於某些硬體,和硬體的關係太緊密,兼容性比較差 。
就好比不同硬體廠商識別符號的標準是不一樣的。 - 現在的一些硬體驅動還是會用到彙編語言進行編寫。
(3)高級語言
- 高級語言的語法基本和現在英語語法類似,並且和硬體的關係沒有那麼緊密了。
也就是說通過高級語言開發程式可以在不同的硬體系統中運行。 - 高級語言都會有自己的編譯器,所編寫的程式碼都會運行在自己的編譯器上。
不同系統上安裝想對應的編譯器,實現一份源碼一次編譯,到處運行。 - 高級語言學習起來也更加的容易,現在我們知道的語言基本都是高級語言。如
C
、C++
、C#
、Java
、Golang
、Python
等等。
2、高級語言中的編譯型語言和解釋型語言
電腦是不能理解高級語言的,更不能直接執行高級語言,它只能直接理解機器語言(二進位編碼)。所以使用任何高級語言編寫的程式,若想被電腦運行,都必須將其轉換成電腦語言,也就是機器碼,這個過程就叫編譯。比如,一行Python的命令print('hello')
,必需要轉換為類似1010101
這樣的機器碼 ,電腦才能夠識別你的命令。
根據從源碼轉換二進位編碼的時機不同,語言分成了兩大類:編譯型語言和解釋型語言。
(1)編譯型語言
對於編譯型語言,開發完成以後需要將所有的源程式碼都轉換成可執行程式,比如 Windows 下的.exe
文件,可執行程式裡面包含的就是機器碼。只要我們擁有可執行程式,就可以隨時運行,不用再重新編譯了,也就是「一次編譯,無限次運行」。
在運行的時候,我們只需要運行編譯生成的可執行程式,不再需要源程式碼和編譯器了,所以說編譯型語言可以脫離開發環境運行。
編譯型語言一般是不能跨平台的,也就是不能在不同的作業系統之間隨意切換。
編譯型語言使用的轉換工具稱為編譯器。常見的編譯型語言有C
、C++
、Golang
等。
總結:
- 編譯一次後,脫離了編譯器也可以運行,並且運行效率高。
- 可移植性差,跨平台性比較差。
(2)解釋型語言
對於解釋型語言,每次執行程式都需要一邊轉換一邊執行,用到哪些源程式碼就將哪些源程式碼轉換成機器碼,用不到的不進行任何處理。每次執行程式時可能使用的功能不同,這個時候需要轉換的源程式碼也不一樣。
因為每次執行程式都需要重新轉換源程式碼,所以解釋型語言的執行效率天生就低於編譯型語言,甚至存在數量級的差距。電腦的一些底層功能,或者關鍵演算法,一般都使用 C/C++
實現,只有在應用層面(比如網站開發、批處理、小工具等)才會使用解釋型語言。
在運行解釋型語言的時候,我們始終都需要源程式碼和解釋器,所以說它無法脫離開發環境或者運行環境 。
解釋型語言使用的轉換工具稱為解釋器。常見的解釋型語言有Python
、JavaScript
、PHP
、Shell
等。
總結:
- 每次執行程式碼都需要解釋一次,執行速度比較慢。
- 不能脫離解釋器獨立運行。
- 跨平台性比較好。
(3)編譯型語言和解釋型語言執行流程
如下圖所示:
3、知識擴展:
(1)擴展1
當我們說「下載一個程式(軟體)」時,不同類型的語言有不同的含義:
- 對於編譯型語言,我們下載到的是可執行文件,源程式碼被作者保留,所以編譯型語言的程式一般是閉源的。
- 對於解釋型語言,我們下載到的是所有的源程式碼,因為作者不給源程式碼就沒法運行,所以解釋型語言的程式一般是開源的。
(2)擴展2
編譯器就是一個「翻譯工具」,類似於將中文翻譯成英文、將英文翻譯成俄文。但是,翻譯源程式碼是一個複雜的過程,大致包括詞法分析、語法分析、語義分析、性能優化、生成可執行文件等五個步驟,期間涉及到複雜的演算法和硬體架構。解釋器與此類似,有興趣的讀者請參考《編譯原理》一書,本文不再贅述。
(3)擴展3
Java
和 C#
是一種比較奇葩的存在,它們是半編譯半解釋型的語言,源程式碼需要先轉換成一種中間文件(位元組碼文件),然後再將中間文件拿到虛擬機(JVM)中執行。Java
引領了這種風潮,它的初衷是在跨平台的同時兼顧執行效率。C#
是後來的跟隨者,但是 C#
一直止步於 Windows 平台,在其它平台鮮有作為。
4、關於Python
Python 屬於典型的解釋型語言,所以運行 Python 程式只需要解釋器的支援,只要你在不同的平台安裝了不同的解釋器,你的程式碼就可以隨處運行,不用擔心任何兼容性問題,真正的「一次編寫,到處運行」。
Python 幾乎支援所有常見的平台,比如 Linux、Windows、Mac OS 等,你所寫的 Python程式碼無需修改,就能在這些平台上正確運行,Python 的可移植性是很強的。