編譯型編程語言與解釋型編程語言的區別


我們先看編譯型,其實它和匯編語言是一樣的:也是有一個負責翻譯的程序來對我們的源代碼進行轉換,生成相對應的可執行代碼。這個過程說得專業一點,就稱為編譯(Compile),而負責編譯的程序自然就稱為編譯器(Compiler)。如果我們寫的程序代碼都包含在一個源文件中,那么通常編譯之后就會直接生成一個可執行文件,我們就可以直接運行了。但對於一個比較復雜的項目,為了方便管理,我們通常把代碼分散在各個源文件中,作為不同的模塊來組織。這時編譯各個文件時就會生成目標文件(Object file)而不是前面說的可執行文件。一般一個源文件的編譯都會對應一個目標文件。這些目標文件里的內容基本上已經是可執行代碼了,但由於只是整個項目的一部分,所以我們還不能直接運行。待所有的源文件的編譯都大功告成,我們就可以最后把這些半成品的目標文件“打包”成一個可執行文件了,這個工作由另一個程序負責完成,由於此過程好像是把包含可執行代碼的目標文件連接裝配起來,所以又稱為鏈接(Link),而負責鏈接的程序就叫就叫鏈接程序(Linker)。鏈接程序除了鏈接目標文件外,可能還有各種資源,像圖標文件啊、聲音文件啊什么的,還要負責去除目標文件之間的冗余重復代碼,等等。鏈接完成之后,一般就可以得到我們想要的可執行文件了。

一個完整的編譯系統與 一個用C編寫的程序hello.c的編譯過程
 
 

現在再看看解釋型。從字面上看,“編譯”和“解釋”的確都有“翻譯”的意思,它們的區別則在於翻譯的時機安排不大一樣。打個比方:假如你打算閱讀一本外文書,而你不知道這門外語,那么你可以找一名翻譯,給他足夠的時間讓他從頭到尾把整本書翻譯好,然后把書的母語版交給你閱讀;或者,你也立刻讓這名翻譯輔助你閱讀,讓他一句一句給你翻譯,如果你想往回看某個章節,他也得重新給你翻譯。

兩種方式,前者就相當於我們剛才所說的編譯型:一次把所有的代碼轉換成機器語言,然后寫成可執行文件;而后者就相當於我們要說的解釋型:在程序運行的前一刻,還只有源程序而沒有可執行程序;而程序每執行到源程序的某一條指令,則會有一個稱之為解釋程序的外殼程序將源代碼轉換成二進制代碼以供執行,總言之,就是不斷地解釋、執行、解釋、執行。所以,解釋型程序是離不開解釋程序的。解釋型程序中,由於程序總是以源代碼的形式出現,因此只要有相應的解釋器,移植幾乎不成問題。編譯型程序雖然源代碼也可以移植,但前提是必須針對不同的系統分別進行編譯,對於復雜的工程來說,的確是一件不小的時間消耗,況且很可能一些細節的地方還是要修改源代碼。而且,解釋型程序省卻了編譯的步驟,修改調試也非常方便,編輯完畢之后即可立即運行,不必像編譯型程序一樣每次進行小小改動都要耐心等待漫長的 Compiling…Linking… 這樣的編譯鏈接過程。不過凡事有利有弊,由於解釋型程序是將編譯的過程放到執行過程中,這就決定了解釋型程序注定要比編譯型慢上一大截,像幾百倍的速度差距也是不足為奇的。

編譯型與解釋型,兩者各有利弊。前者由於程序執行速度快,同等條件下對系統要求較低,因此像開發操作系統、大型應用程序、數據庫系統等時都采用它,像 C/C++、Pascal/Object、Pascal(Delphi)、VB 等基本都可視為編譯語言,而一些網頁腳本、服務器腳本及輔助開發接口這樣的對速度要求不高、對不同系統平台間的兼容性有一定要求的程序則通常使用解釋性語言,如 Java、JavaScript、VBScript、Perl、Python 等等。

 

但既然編譯型與解釋型各有優缺點又相互對立,所以一批新興的語言都有把兩者折衷起來的趨勢。說到這里,我們有必要說一下 Java 。

JAVA 語言是一種編譯型-解釋型語言,同時具備編譯特性和解釋特性。其實,確切的說 Java 就是解釋型語言,其所謂的(預)編譯過程只是將 .java 文件編程成平台無關的字節碼 .class 文件(生成的代碼是介於機器碼和Java源代碼之間的中介代碼),並不是向 C 一樣編譯成可執行的機器語言。作為編譯型語言,JAVA 程序要被統一編譯成字節碼文件——文件后綴是 .class 。此種文件在 Java 中又稱為類文件。Java 類文件不能在計算機上直接執行,它需要被 JVM(Java 的虛擬機平台,可視為解釋器)翻譯成本地的機器碼后才能執行,而 Java 虛擬機的翻譯過程則是解釋性的。Java 字節碼文件首先被加載到計算機內存中,然后讀出一條指令,翻譯一條指令,執行一條指令,該過程被稱為 Java 語言的解釋執行。而在現實中,Java 開發工具 JDK 提供了兩個很重要的命令來完成上面的編譯和解釋(翻譯)過程。兩個命令分別是 java.exe 和 javac.exe,前者加載 Java 類文件,並逐步對字節碼文件進行編譯,而另一個命令則對應了 Java 語言的解釋(javac.exe)過程。在次序上,Java 語言是要先進行編譯的過程,接着解釋執行。這樣既保留了源代碼的高抽象、可移植的特點,又已經完成了對源代碼的大部分預編譯工作,所以執行起來比“純解釋型”程序要快許多。

總結

C/C++、Pascal、Go、匯編等,必須在程序運行之前將所有代碼都翻譯成二進制形式,也就是生成可執行文件,用戶拿到的是最終生成的可執行文件,看不到源碼。

這個過程叫做編譯(Compile),這樣的編程語言叫做編譯型語言,完成編譯過程的軟件叫做編譯器(Compiler)。

而有的編程語言,如 Shell、JavaScript、Python、PHP 等,需要一邊翻譯一邊執行,不會生成任何可執行文件,用戶必須拿到源碼才能運行程序。程序運行后會即時翻譯,翻譯完一部分執行一部分,不用等到所有代碼都翻譯完。

這個過程叫做解釋,這樣的編程語言叫做解釋型語言或者腳本語言(Script),完成解釋過程的軟件叫做解釋器。

編譯型語言的優點是執行速度快、對硬件要求低、保密性好,適合開發操作系統、大型應用程序、數據庫等。

腳本語言的優點是使用靈活、部署容易、跨平台性好,非常適合 Web 開發以及小工具的制作。


參考:
https://www.jianshu.com/p/d21010003bb7
http://c.biancheng.net/view/4136.html
 


免責聲明!

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



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