『無為則無心』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 的可移植性是很強的。