摘自語言中文網-phthon-phthon編程基礎
我們編寫的源代碼是人類語言,我們自己能夠輕松理解;但是對於計算機硬件(CPU),源代碼就是天書,根本無法執行,計算機只能識別某些特定的二進制指令,在程序真正運行之前必須將源代碼轉換成二進制指令。
所謂的二進制指令,也就是機器碼,是 CPU 能夠識別的硬件層面的“代碼”,簡陋的硬件(比如古老的單片機)只能使用幾十個指令,強大的硬件(PC 和智能手機)能使用成百上千個指令。
-
有的編程語言要求必須提前將所有源代碼一次性轉換成二進制指令,也就是生成一個可執行程序(Windows 下的 .exe),比如C語言、
-
有的編程語言可以一邊執行一邊轉換,需要哪些源代碼就轉換哪些源代碼,不會生成可執行程序,比如
簡單理解,編譯器就是一個“翻譯工具”,類似於將中文翻譯成英文、將英文翻譯成俄文。但是,翻譯源代碼是一個復雜的過程,大致包括詞法分析、語法分析、語義分析、性能優化、生成可執行文件等五個步驟,期間涉及到復雜的算法和硬件架構。解釋器與此類似,有興趣的讀者請參考《編譯原理》一書,本文不再贅述。
那么,編譯型語言和解釋型語言各有什么特點呢?它們之間有什么區別?
編譯型語言
對於編譯型語言,開發完成以后需要將所有的源代碼都轉換成可執行程序,比如 Windows 下的.exe
文件,可執行程序里面包含的就是機器碼。只要我們擁有可執行程序,就可以隨時運行,不用再重新編譯了,也就是“一次編譯,無限次運行”。
在運行的時候,我們只需要編譯生成的可執行程序,不再需要源代碼和編譯器了,所以說編譯型語言可以脫離開發環境運行。
編譯型語言一般是不能跨平台的,也就是不能在不同的操作系統之間隨意切換。
編譯型語言不能跨平台表現在兩個方面:
1) 可執行程序不能跨平台
可執行程序不能跨平台很容易理解,因為不同操作系統對可執行文件的內部結構有着截然不同的要求,彼此之間也不能兼容。不能跨平台是天經地義,能跨平台反而才是奇葩。
比如,不能將 Windows 下的可執行程序拿到 Linux 下使用,也不能將 Linux 下的可執行程序拿到 Mac OS 下使用(雖然它們都是
另外,相同操作系統的不同版本之間也不一定兼容,比如不能將 x64 程序(Windows 64 位程序)拿到 x86 平台(Windows 32 位平台)下運行。但是反之一般可行,因為 64 位 Windows 對 32 位程序作了很好的兼容性處理。
2) 源代碼不能跨平台
不同平台支持的函數、類型、變量等都可能不同,基於某個平台編寫的源代碼一般不能拿到另一個平台下編譯。我們以C語言為例來說明。
【實例1】在C語言中要想讓程序暫停可以使用“睡眠”函數,在 Windows 平台下該函數是 Sleep(),在 Linux 平台下該函數是 sleep(),首字母大小寫不同。其次,Sleep() 的參數是毫秒,sleep() 的參數是秒,單位也不一樣。
以上兩個原因導致使用暫停功能的C語言程序不能跨平台,除非在代碼層面做出兼容性處理,非常麻煩。
【實例2】雖然不同平台的C語言都支持 long 類型,但是不同平台的 long 的長度卻不同,例如,Windows 64 位平台下的 long 占用 4 個字節,Linux 64 位平台下的 long 占用 8 個字節。
我們在 Linux 64 位平台下編寫代碼時,將 0x2f1e4ad23 賦值給 long 類型的變量是完全沒有問題的,但是這樣的賦值在 Windows 平台下就會導致數值溢出,讓程序產生錯誤的運行結果。
讓人苦惱的,這樣的錯誤一般不容易察覺,因為編譯器不會報錯,我們也記不住不同類型的取值范圍。
解釋型語言
對於解釋型語言,每次執行程序都需要一邊轉換一邊執行,用到哪些源代碼就將哪些源代碼轉換成機器碼,用不到的不進行任何處理。每次執行程序時可能使用不同的功能,這個時候需要轉換的源代碼也不一樣。
因為每次執行程序都需要重新轉換源代碼,所以解釋型語言的執行效率天生就低於編譯型語言,甚至存在數量級的差距。計算機的一些底層功能,或者關鍵算法,一般都使用 C/C++ 實現,只有在應用層面(比如網站開發、批處理、小工具等)才會使用解釋型語言。
在運行解釋型語言的時候,我們始終都需要源代碼和解釋器,所以說它無法脫離開發環境。
當我們說“下載一個程序(軟件)”時,不同類型的語言有不同的含義:
-
對於編譯型語言,我們下載到的是可執行文件,源代碼被作者保留,所以編譯型語言的程序一般是閉源的。
-
對於解釋型語言,我們下載到的是所有的源代碼,因為作者不給源代碼就沒法運行,所以解釋型語言的程序一般是開源的。
相比於編譯型語言,解釋型語言幾乎都能跨平台,“一次編寫,到處運行”是真是存在的,而且比比皆是。那么,為什么解釋型語言就能快平台呢?
這一切都要歸功於解釋器!
我們所說的跨平台,是指源代碼跨平台,而不是解釋器跨平台。解釋器用來將源代碼轉換成機器碼,它就是一個可執行程序,是絕對不能跨平台的。
官方需要針對不同的平台開發不同的解釋器,這些解釋器必須要能夠遵守同樣的語法,識別同樣的函數,完成同樣的功能,只有這樣,同樣的代碼在不同平台的執行結果才是相同的。
你看,解釋型語言之所以能夠跨平台,是因為有了解釋器這個中間層。在不同的平台下,解釋器會將相同的源代碼轉換成不同的機器碼,解釋器幫助我們屏蔽了不同平台之間的差異。
關於 Python
Python 屬於典型的解釋型語言,所以運行 Python 程序需要解釋器的支持,只要你在不同的平台安裝了不同的解釋器,你的代碼就可以隨時運行,不用擔心任何兼容性問題,真正的“一次編寫,到處運行”。
Python 幾乎支持所有常見的平台,比如 Linux、Windows、Mac OS、
總結
我們將編譯型語言和解釋型語言的差異總結為下表:
類型 | 原理 | 優點 | 缺點 |
---|---|---|---|
編譯型語言 | 通過專門的編譯器,將所有源代碼一次性轉換成特定平台(Windows、Linux 等)執行的機器碼(以可執行文件的形式存在)。 | 編譯一次后,脫離了編譯器也可以運行,並且運行效率高。 | 可移植性差,不夠靈活。 |
解釋型語言 | 由專門的解釋器,根據需要將部分源代碼臨時轉換成特定平台的機器碼。 | 跨平台性好,通過不同的解釋器,將相同的源代碼解釋成不同平台下的機器碼。 |