編譯程式和解釋程式的區別

  你知道編譯和解釋的區別是什麼嗎?下面就讓小編來為大家介紹一下吧,希望大家喜歡。

  編譯和解釋的區別是什麼?

  編譯器是把源程式的每一條語句都編譯成機器語言,並儲存成二進位制檔案,這樣執行時計算機可以直接以機器語言來執行此程式,速度很快;

  而直譯器則是隻在執行程式時,才一條一條的解釋成機器語言給計算機來執行,所以執行速度是不如編譯後的程式執行的快的.

  這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言***是二進位制的形式***

  一、低階語言與高階語言

  最初的計算機程式都是用0和1的序列表示的,程式設計師直接使用的是機器指令,無需翻譯,從紙帶打孔輸入即可執行得到結果。後來為了方便記憶,就將用0、1序列表示的機器指令都用符號助記,這些與機器指令一一對應的助記符就成了彙編指令,從而誕生了組合語言。無論是機器指令還是彙編指令都是面向機器的,統稱為低階語言。因為是針對特定機器的機器指令的助記符,所以組合語言是無法獨立於機器***特定的CPU體系結構***的。但組合語言也是要經過翻譯成機器指令才能執行的,所以也有將執行在一種機器上的組合語言翻譯成執行在另一種機器上的機器指令的方法,那就是交叉彙編技術。

  高階語言是從人類的邏輯思維角度出發的計算機語言,抽象程度大大提高,需要經過編譯成特定機器上的目的碼才能執行,一條高階語言的語句往往需要若干條機器指令來完成。高階語言獨立於機器的特性是靠編譯器為不同機器生成不同的目的碼***或機器指令***來實現的。那具體的說,要將高階語言編譯到什麼程度呢,這又跟編譯的技術有關了,既可以編譯成直接可執行的目的碼,也可以編譯成一種中間表示,然後拿到不同的機器和系統上去執行,這種情況通常又需要支撐環境,比如直譯器或虛擬機器的支援,Java程式編譯成bytecode,再由不同平臺上的虛擬機器執行就是很好的例子。所以,說高階語言不依賴於機器,是指在不同的機器或平臺上高階語言的程式本身不變,而通過編譯器編譯得到的目的碼去適應不同的機器。從這個意義上來說,通過交叉彙編,一些彙編程式也可以獲得不同機器之間的可移植性,但這種途徑獲得的移植性遠遠不如高階語言來的方便和實用性大。

  二、編譯與解釋

  編譯是將源程式翻譯成可執行的目的碼,翻譯與執行是分開的;而解釋是對源程式的翻譯與執行一次性完成,不生成可儲存的目的碼。這只是表象,二者背後的最大區別是:對解釋執行而言,程式執行時的控制權在直譯器而不在使用者程式;對編譯執行而言,執行時的控制權在使用者程式。

  解釋具有良好的動態特性和可移植性,比如在解釋執行時可以動態改變變數的型別、對程式進行修改以及在程式中插入良好的除錯診斷資訊等,而將直譯器移植到不同的系統上,則程式不用改動就可以在移植瞭解釋器的系統上執行。同時直譯器也有很大的缺點,比如執行效率低,佔用空間大,因為不僅要給使用者程式分配空間,直譯器本身也佔用了寶貴的系統資源。

  編譯器是把源程式的每一條語句都編譯成機器語言,並儲存成二進位制檔案,這樣執行時計算機可以直接以機器語言來執行此程式,速度很快;

  而直譯器則是隻在執行程式時,才一條一條的解釋成機器語言給計算機來執行,所以執行速度是不如編譯後的程式執行的快的.

  1、編輯:用編輯軟體***EDIT.EXE或記事本***形成源程式***.ASM***,如:LX.ASM;

  2、彙編:用匯程式設計序***MASM.EXE***對源程式進行彙編,形成目標檔案***.OBJ***,格式如下:MASM LX.ASM;

  3、連線:用連線程式***LINK.EXE***對目標程式進行連線,形成可執行檔案***.EXE***,格式如下:LINK LX.OBJ;

  4、執行:如果結果在螢幕在顯示,則直接執行可執行檔案。

  5、除錯:用除錯程式***DEBUG.EXE***對可執行檔案進行除錯,格式如下:DEBUG LX.EXE

  1. 在具體計算機上實現一種語言,首先要確定的是表示該語言語義解釋的虛擬計算機,一個關鍵的問題是程式執行時的基本表示是實際計算機上的機器語言還是虛擬機器的機器語言。這個問題決定了語言的實現。根據這個問題的回答,可以將程式設計語言劃分為兩大類:編譯型語言和解釋型語言。

  2. 由編譯型語言編寫的源程式需要經過編譯、彙編和連結才能輸出目的碼,然後機器執行目的碼,得出執行結果,目的碼由機器指令組成,一般不能獨立執行,因為源程式中可能使用了某些彙編程式不能解釋引用的庫函式,而庫函式程式碼又不在源程式中,此時還需要連結程式完成外部引用和目標模組呼叫的連結任務,最後輸出可執行程式碼。C、C++、Fortran、Pascal、Ada都是編譯實現的。

  3. 解釋型語言的實現中,翻譯器並不產生目標機器程式碼,而是產生易於執行的中間程式碼,這種中間程式碼與機器程式碼是不同的,中間程式碼的解釋是由軟體支援的,不能直接使用硬體,軟體直譯器通常會導致執行效率較低。用解釋型語言編寫的程式是由另一個可以理解中間程式碼的解釋程式執行的。與編譯程式不同的是,解釋程式的任務是逐一將源程式的語句解釋成可執行的機器指令,不需要將源程式翻譯成目的碼後再執行。對於解釋型Basic語言,需要一個專門的直譯器解釋執行 Basic程式,每條語言只有在執行才被翻譯。這種解釋型語言每執行一次就翻譯一次,因而效率低下。

  4. Java很特殊,Java程式也需要編譯,但是沒有直接編譯稱為機器語言,而是編譯稱為位元組碼,然後在Java虛擬機器上用解釋方式執行位元組碼。Python 的也採用了類似Java的編譯模式,先將Python程式編譯成Python位元組碼,然後由一個專門的Python位元組碼直譯器負責解釋執行位元組碼。

  ***Java虛擬機器對位元組碼的執行相當於模擬一個cpu,而ruby1.8--在虛擬機器還未出現前--是通過解釋成語法樹執行。***

猜你喜歡