編譯型語言和解釋型語言的區別


編譯型語言和解釋型語言的區別

我們所編寫的代碼,只是讓我們人類能夠理解的人類語言,但是對於計算機是無法理解的,計算機只能識別特定的二進制指令,所以我們現在所編寫的代碼,如C/C++,JAVA,Python等等都需要轉換成二進制代碼才能執行。


現在我們依據條件將這些編程語言大致分成兩類

  • 編譯型語言

    源代碼一次性轉換成二進制指令,即生成對應操作系統能執行的程序。

    比如C語言、C++、Golang、Pascal(Delphi)、匯編等,這種編程語言稱為編譯型語言。

    使用的轉換工具稱為編譯器。

  • 解釋型語言

    源代碼可以一邊執行一邊轉換,需要哪些源代碼就轉換哪些源代碼,不會生成可執行程序

    比如 Python、JavaScript、PHP、Shell、MATLAB 等,這種編程語言稱為解釋型語言

    使用的轉換工具稱為解釋器。

  • 半編譯型半解釋型語言

    源代碼先轉化為一種中間文件(字節文件),然后再使用中間文件在虛擬機運行

    比如JAVA,C#等,這些被稱為半編譯型半解釋型語言

    即擁有編譯器,也擁有解釋器。

編譯型語言和解釋型語言的執行流程

編譯型語言的特點

對於編譯型語言一次編譯,無限運行,不需要對應的開發環境。

但是編譯型語言一般是不能跨平台的,也就是不能在不同的操作系統之間隨意切換

主要體現在下面兩個方面

  • 程序不能操作系統台運行

    因為不同的操作系統的可執行程序結構截然不同,所以彼此的程序自然不能夠兼容。

    除此之外,相同操作系統因版本不同,可能也會存在不兼容的問題

  • 源代碼不能跨操作系統

    不同平台支持的函數,類型變量都不一樣,一般情況下一套源代碼不能拿到另外一個操作系統進行編譯。下面舉兩個例子:

    1. 在C語言中要想讓程序暫停可以使用“睡眠”函數,在 Windows 平台下該函數是 Sleep(),在 Linux 平台下該函數是 sleep(),首字母大小寫不同。其次,Sleep() 的參數是毫秒,sleep() 的參數是秒,單位也不一樣。

    2. 雖然不同平台的C語言都支持 long 類型,但是不同平台的 long 的長度卻不同,例如,Windows 64 位平台下的 long 占用 4 個字節,Linux 64 位平台下的 long 占用 8 個字節。在 Linux 64 位平台下編寫代碼時,將 0x2f1e4ad23 賦值給 long 類型的變量是完全沒有問題的,但是這樣的賦值在 Windows 平台下就會導致數值溢出,讓程序產生錯誤的運行結果。

    而這些錯誤都是編譯器不會進行報錯的,讓人很難察覺

解釋型語言

對於解釋型語言一次編寫,到處運行,每次執行程序需要一邊轉換一邊運行,用到哪些功能就將那部分的代碼轉為機器碼(二進制指令)。雖然需要對應的解釋環境,但是解決了編譯型語言的無法跨平台的問題。但也因為每次運行都需要進行轉換,他的運行效率天生低於編譯型語言,甚至存在數量級的差距。一般只有在應用層(比如網站開發、批處理、小工具等)才會使用解釋型語言。

在這里的跨平台,只是指源代碼可以跨操作系統運行,但是還是需要操作系統安裝對應的解釋器,也正是這些解釋器幫助我們屏蔽了系統之間的差異,達到一套代碼到處運行的效果。

總結

類型 原理 優點 缺點
編譯型語言 通過專門的編譯器,將所有源代碼一次性轉換成特定平台(Windows、Linux 等)執行的機器碼(以可執行文件的形式存在)。 編譯一次后,脫離了編譯器也可以運行,並且運行效率高。 可移植性差,不夠靈活。
解釋型語言 由專門的解釋器,根據需要將部分源代碼臨時轉換成特定平台的機器碼。 跨平台性好,通過不同的解釋器,將相同的源代碼解釋成不同平台下的機器碼。 一邊執行一邊轉換,效率很低。

引用及參考

編譯型語言和解釋型語言


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM