編譯型語言和解釋型語言的區別
我們所編寫的代碼,只是讓我們人類能夠理解的人類語言,但是對於計算機是無法理解的,計算機只能識別特定的二進制指令,所以我們現在所編寫的代碼,如C/C++,JAVA,Python等等都需要轉換成二進制代碼才能執行。
現在我們依據條件將這些編程語言大致分成兩類
-
編譯型語言
源代碼一次性轉換成二進制指令,即生成對應操作系統能執行的程序。
比如C語言、C++、Golang、Pascal(Delphi)、匯編等,這種編程語言稱為編譯型語言。
使用的轉換工具稱為編譯器。
-
解釋型語言
源代碼可以一邊執行一邊轉換,需要哪些源代碼就轉換哪些源代碼,不會生成可執行程序
比如 Python、JavaScript、PHP、Shell、MATLAB 等,這種編程語言稱為解釋型語言
使用的轉換工具稱為解釋器。
-
半編譯型半解釋型語言
源代碼先轉化為一種中間文件(字節文件),然后再使用中間文件在虛擬機運行
比如JAVA,C#等,這些被稱為半編譯型半解釋型語言
即擁有編譯器,也擁有解釋器。
編譯型語言的特點
對於編譯型語言一次編譯,無限運行,不需要對應的開發環境。
但是編譯型語言一般是不能跨平台的,也就是不能在不同的操作系統之間隨意切換。
主要體現在下面兩個方面
-
程序不能操作系統台運行
因為不同的操作系統的可執行程序結構截然不同,所以彼此的程序自然不能夠兼容。
除此之外,相同操作系統因版本不同,可能也會存在不兼容的問題
-
源代碼不能跨操作系統
不同平台支持的函數,類型變量都不一樣,一般情況下一套源代碼不能拿到另外一個操作系統進行編譯。下面舉兩個例子:
-
在C語言中要想讓程序暫停可以使用“睡眠”函數,在 Windows 平台下該函數是 Sleep(),在 Linux 平台下該函數是 sleep(),首字母大小寫不同。其次,Sleep() 的參數是毫秒,sleep() 的參數是秒,單位也不一樣。
-
雖然不同平台的C語言都支持 long 類型,但是不同平台的 long 的長度卻不同,例如,Windows 64 位平台下的 long 占用 4 個字節,Linux 64 位平台下的 long 占用 8 個字節。在 Linux 64 位平台下編寫代碼時,將 0x2f1e4ad23 賦值給 long 類型的變量是完全沒有問題的,但是這樣的賦值在 Windows 平台下就會導致數值溢出,讓程序產生錯誤的運行結果。
而這些錯誤都是編譯器不會進行報錯的,讓人很難察覺
-
解釋型語言
對於解釋型語言一次編寫,到處運行,每次執行程序需要一邊轉換一邊運行,用到哪些功能就將那部分的代碼轉為機器碼(二進制指令)。雖然需要對應的解釋環境,但是解決了編譯型語言的無法跨平台的問題。但也因為每次運行都需要進行轉換,他的運行效率天生低於編譯型語言,甚至存在數量級的差距。一般只有在應用層(比如網站開發、批處理、小工具等)才會使用解釋型語言。
在這里的跨平台,只是指源代碼可以跨操作系統運行,但是還是需要操作系統安裝對應的解釋器,也正是這些解釋器幫助我們屏蔽了系統之間的差異,達到一套代碼到處運行的效果。
總結
類型 | 原理 | 優點 | 缺點 |
---|---|---|---|
編譯型語言 | 通過專門的編譯器,將所有源代碼一次性轉換成特定平台(Windows、Linux 等)執行的機器碼(以可執行文件的形式存在)。 | 編譯一次后,脫離了編譯器也可以運行,並且運行效率高。 | 可移植性差,不夠靈活。 |
解釋型語言 | 由專門的解釋器,根據需要將部分源代碼臨時轉換成特定平台的機器碼。 | 跨平台性好,通過不同的解釋器,將相同的源代碼解釋成不同平台下的機器碼。 | 一邊執行一邊轉換,效率很低。 |