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



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

首先,我們編程都是用的高級語言(寫彙編和機器語言的大牛們除外),計算機不能直接理解高級語言,只能理解和運行機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能運行高級語言所編寫的程序。
     說到翻譯,其實翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式只是翻譯的時間不同。
     用編譯型語言寫的程序執行之前,需要一個專門的編譯過程,通過編譯系統(不僅僅只是通過編譯器,編譯器只是編譯系統的一部分)把高級語言翻譯成機器語言(具體翻譯過程可以參看下圖),把源高級程序編譯成爲機器語言文件,比如windows下的exe文件。以後就可以直接運行而不需要編譯了,因爲翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程序執行效率高,但也不能一概而論,部分解釋型語言的解釋器通過在運行時動態優化代碼,甚至能夠使解釋型語言的性能超過編譯型語言。
   
    一個完整的編譯系統與 一個用C編寫的程序hello.c的編譯過程 
      解釋則不同,解釋型語言編寫的程序不需要編譯。解釋型語言在運行的時候才翻譯,比如VB語言,在執行的時候,專門有一個解釋器能夠將VB語言翻譯成機器語言,每個語句都是執行的時候才翻譯。這樣解釋型語言每執行一次就要翻譯一次,效率比較低。
     編譯型與解釋型,兩者各有利弊。前者由於程序執行速度快,同等條件下對系統要求較低,因此像開發操作系統、大型應用程序、數據庫系統等時都採用它,像C/C++、Pascal/Object Pascal(Delphi)等都是編譯語言,而一些網頁腳本、服務器腳本及輔助開發接口這樣的對速度要求不高、對不同系統平臺間的兼容性有一定要求的程序則通常使用解釋性語言,如JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。
     但隨着硬件的升級和設計思想的變革,編譯型和解釋型語言越來越籠統,主要體現在一些新興的高級語言上,而解釋型語言的自身特點也使得編譯器廠商願意花費更多成本來優化解釋器,解釋型語言性能超過編譯型語言也是必然的。
      說到這裏,我們有必要說一下java與C#。解釋型語言和編譯型語言的區別
      JAVA語言是一種編譯型-解釋型語言,同時具備編譯特性和解釋特性(其實,確切的說java就是解釋型語言,其所謂的編譯過程只是將.java文件編程成平臺無關的字節碼.class文件,並不是向C一樣編譯成可執行的機器語言,在此請讀者注意Java中所謂的“編譯”和傳統的“編譯”的區別)。作爲編譯型語言,JAVA程序要被統一編譯成字節碼文件——文件後綴是class。此種文件在java中又稱爲類文件。java類文件不能再計算機上直接執行,它需要被java虛擬機翻譯成本地的機器碼後才能執行,而java虛擬機的翻譯過程則是解釋性的。java字節碼文件首先被加載到計算機內存中,然後讀出一條指令,翻譯一條指令,執行一條指令,該過程被稱爲java語言的解釋執行,是由java虛擬機完成的。而在現實中,java開發工具JDK提供了兩個很重要的命令來完成上面的編譯和解釋(翻譯)過程。兩個命令分別是javac.exe和java.exe,前者加載java類文件,並逐步對字節碼文件進行編譯,而另一個命令則對應了java語言的解釋(javac.exe)過程。在次序上,java語言是要先進行編譯的過程,接着解釋執行。
   C#語言是編譯型語言,但其“編譯”過程比較特殊,具體說明如下:
   C#程序在第一次運行的時候,會依賴其.NET Frameworker平臺,編譯成IL中間碼),然後由JIT compiler翻譯成本地的機器碼執行。從第二次在運行相同的程序,則不需要再執行以上編譯和翻譯過程,而是直接運行第一次翻譯成的機器碼。所以對於C#來說,通常第一次運行時間會很長,但從第二次開始,程序的執行時間會快很多。
   那麼,C#爲什麼要進行兩次“編譯”呢?其實,微軟想通過動態編譯(由JIT compiler工具實現)來實現其程序運行的最優化。如果代碼在運行前進行動態編譯運行,那麼JIT compiler可以很智能的根據你本地機器的硬件條件來進行優化,比如使用更好的register,機器指令等等,而不是像原來那樣,build一份程序針對所有硬件的機器跑,沒有充分利用各個機器的條件。
   另外,還有我們經常用到的腳本語言,比如JavaScript、Shell等語言都是腳本語言,本質上來說,腳本語言就是解釋型語言。
   對於以上內容,如果有什麼地方說的不妥的,敬請指出!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章