高階語言所編制的程式不能直接被計算機識別,必須經過轉換才能被執行,按轉換方式可將它們分為兩類:
1.解釋類:執行方式類似於我們日常生活中的“同聲翻譯”,應用程式原始碼一邊由相應語言的直譯器“翻譯”成目的碼(機器語言),一邊執行,因此效率比較低,而且不能生成可獨立執行的可執行檔案,應用程式不能脫離其直譯器,但這種方式比較靈活,可以動態地調整、修改應用程式,典型的解釋型的高階語言有BASIC。
2.編譯類:編譯是指在應用源程式執行之前,就將程式原始碼“翻譯”成目的碼(機器語言),因此其目標程式可以脫離其語言環境獨立執行,使用比較方便、效率較高。但應用程式一旦需要修改,必須先修改原始碼,再重新編譯生成新的目標檔案(*.OBJ)才能執行,只有目標檔案而沒有原始碼,修改很不方便。現在大多數的程式語言都是編譯型的,例如VisualC++、Delphi等。高階語言裡一個程式的編譯和執行大概是下面的情況:編譯器將高階語言從原始碼翻譯成與之等價的目標程式(就相當於從中文翻譯成中文),而後就隱退了。在隨後的某個時刻,使用者啟動目標程式由作業系統執行。實現高階語言的另外一種方式為解釋:與編譯不同的是,直譯器在目標程式(其實根本就沒有目標程式,只是與編譯來對比)執行期間,直譯器一直隨之執行。這種執行過程完全由直譯器控制的。從效果上看,直譯器實現了一臺“虛擬計算機”,其“機器語言”就是高階語言,直譯器一次讀入一條或多條語句,按照其自身規定的方式去執行相應的操作。一般說來,解釋比編譯有著很好的靈活性;編譯一般有著較好的效能。但是有些語言確是採用了兩者的混合形式:書中的原文:”如果初始階段的翻譯器比較簡單,我們就說這個語言是“解釋的”。如果翻譯器很複雜,我們就說這一語言是“編譯的”。現在兩者的區分變得有些模糊了,因為“簡單”和“複雜”都是修飾性術語,也因為完全可能出現用一個編譯器(複雜的翻譯過程)生成程式碼,而後又由一個複雜的虛擬機器(直譯器)執行。對於最後這種情況,如果翻譯器對程式做了徹底的分析(而不是做某種“機械的”變換),而且有關的中間語言程式與源程式並沒有很強的相似性,我們還是說這個語言是編譯的。這兩種特性----徹底的分析和非平凡的變換-----是刻畫編譯方式的標誌性特徵。“
高階語言所編制的程式不能直接被計算機識別,必須經過轉換才能被執行,按轉換方式可將它們分為兩類:
1.解釋類:執行方式類似於我們日常生活中的“同聲翻譯”,應用程式原始碼一邊由相應語言的直譯器“翻譯”成目的碼(機器語言),一邊執行,因此效率比較低,而且不能生成可獨立執行的可執行檔案,應用程式不能脫離其直譯器,但這種方式比較靈活,可以動態地調整、修改應用程式,典型的解釋型的高階語言有BASIC。
2.編譯類:編譯是指在應用源程式執行之前,就將程式原始碼“翻譯”成目的碼(機器語言),因此其目標程式可以脫離其語言環境獨立執行,使用比較方便、效率較高。但應用程式一旦需要修改,必須先修改原始碼,再重新編譯生成新的目標檔案(*.OBJ)才能執行,只有目標檔案而沒有原始碼,修改很不方便。現在大多數的程式語言都是編譯型的,例如VisualC++、Delphi等。高階語言裡一個程式的編譯和執行大概是下面的情況:編譯器將高階語言從原始碼翻譯成與之等價的目標程式(就相當於從中文翻譯成中文),而後就隱退了。在隨後的某個時刻,使用者啟動目標程式由作業系統執行。實現高階語言的另外一種方式為解釋:與編譯不同的是,直譯器在目標程式(其實根本就沒有目標程式,只是與編譯來對比)執行期間,直譯器一直隨之執行。這種執行過程完全由直譯器控制的。從效果上看,直譯器實現了一臺“虛擬計算機”,其“機器語言”就是高階語言,直譯器一次讀入一條或多條語句,按照其自身規定的方式去執行相應的操作。一般說來,解釋比編譯有著很好的靈活性;編譯一般有著較好的效能。但是有些語言確是採用了兩者的混合形式:書中的原文:”如果初始階段的翻譯器比較簡單,我們就說這個語言是“解釋的”。如果翻譯器很複雜,我們就說這一語言是“編譯的”。現在兩者的區分變得有些模糊了,因為“簡單”和“複雜”都是修飾性術語,也因為完全可能出現用一個編譯器(複雜的翻譯過程)生成程式碼,而後又由一個複雜的虛擬機器(直譯器)執行。對於最後這種情況,如果翻譯器對程式做了徹底的分析(而不是做某種“機械的”變換),而且有關的中間語言程式與源程式並沒有很強的相似性,我們還是說這個語言是編譯的。這兩種特性----徹底的分析和非平凡的變換-----是刻畫編譯方式的標誌性特徵。“