解釋和編譯的區別
計算機並不能直接地接受和執行用高階語言編寫的源程式,源程式在輸入計算機時,通過"翻譯程式"翻譯成機器語言形式的目標程式,計算機才能識別和執行。這種"翻譯"通常有兩種方式,即編譯方式和解釋方式。編譯方式是指利用事先編好的一個稱為編譯程式的機器語言程式,作為系統軟體存放在計算機內,當使用者將高階語言編寫的源程式輸入計算機後,編譯程式便把源程式整個地翻譯成用機器語言表示的與之等價的目標程式,然後計算機再執行該目標程式,以完成源程式要處理的運算並取得結果。解釋方式是指源程式進入計算機後,解釋程式邊掃描邊解釋,逐句輸入逐句翻譯,計算機一句句執行,並不產生目標程式。如PASCAL、 FORTRAN、COBOL等高階語言執行編譯方式;BASIC語言則以執行解釋方式為主;而PASCAL、C語言是能書寫編譯程式的高階程式設計語言。
編譯程式、解釋程式、彙編程式是3種語言處理程式。其區別主要為:彙編程式(為低階服務)是將組合語言書寫的源程式翻譯成由機器指令和其他資訊組成的目標程式。解釋程式(為高階服務)直接執行源程式或源程式的內部形式,一般是讀一句源程式,翻譯一句,執行一句,不產生目的碼,如BASIC解釋程式。編譯程式(為高階服務)是將高階語言書寫的源程式翻譯成與之等價的低階語言的目標程式。編譯程式與解釋程式最大的區別之一在於前者生成目的碼,而後者不生成;此外,前者產生的目的碼的執行速度比解釋程式的執行速度要快;後者人機互動好,適於初學者使用。用COBOL、FORTRAN等語言編寫的程式考慮到執行速度一般都是編譯執行。
解釋程式
所謂解釋程式是高階語言翻譯程式的一種,它將源語言(如BASIC)書寫的源程式作為輸入,解釋一句後就提交計算機執行一句,並不形成目標程式。就像外語翻譯中的“口譯”一樣,說一句翻一句,不產生全文的翻譯文字。這種工作方式非常適合於人通過終端裝置與計算機會話,如在終端上打一條命令或語句,解釋程式就立即將此語句解釋成一條或幾條指令並提交硬體立即執行且將執行結果反映到終端,從終端把命令打入後,就能立即得到計算結果。這的確是很方便的,很適合於一些小型機的計算問題。但解釋程式執行速度很慢,例如源程式中出現迴圈,則解釋程式也重複地解釋並提交執行這一組語句,這就造成很大浪費。
編譯程式
這是一類很重要的語言處理程式,它把高階語言(如FORTRAN、COBOL、Pascal、C等)源程式作為輸入,進行翻譯轉換,產生出機器語言的目標程式,然後再讓計算機去執行這個目標程式,得到計算結果。編譯程式工作時,先分析,後綜合,從而得到目標程式。所謂分析,是指詞法分析和語法分析;所謂綜合是指程式碼優化,儲存分配和程式碼生成。為了完成這些分析綜合任務,編譯程式採用對源程式進行多次掃描的辦法,每次掃描集中完成一項或幾項任務,也有一項任務分散到幾次掃描去完成的。下面舉一個四遍掃描的例子:第一遍掃描做詞法分析;第二遍掃描做語法分析;第三遍掃描做程式碼優化和儲存分配;第四遍掃描做程式碼生成。
值得一提的是,大多數的編譯程式直接產生機器語言的目的碼,形成可執行的目標檔案,但也有的編譯程式則先產生組合語言一級的符號程式碼檔案,然後再呼叫匯程式設計序進行翻譯加工處理,最後產生可執行的機器語言目標檔案。
在實際應用中,對於需要經常使用的有大量計算的大型題目,採用招待速度較快的編譯型的高階語言較好,雖然編譯過程本身較為複雜,但一旦形成目標檔案,以後可多次使用。相反,對於小型題目或計算簡單不太費機時的題目,則多選用解釋型的會話式高階語言,如BASIC,這樣可以大大縮短程式設計及除錯的時間。
相關文章
- 編譯程式與解釋程式區別?編譯
- 你知道「編譯」與「解釋」的區別嗎?編譯
- 解釋型語言、編譯型語言 區別編譯
- 解釋型語言與編譯型語言的區別?編譯
- (轉)編譯和連結的區別編譯
- 堆和棧的解釋和區別
- 編譯語言、解釋語言與指令碼語言之間的區別編譯指令碼
- 編譯型語言和解釋型語言的區別編譯
- 註解和註釋區別
- JAVA之編譯期和執行期區別Java編譯
- apache動態編譯/靜態編譯區別Apache編譯
- 《作業系統真象還原》——0.18編譯型程式與解釋型程式的區別作業系統編譯
- gcc 和 g++ 的聯絡和區別,使用 gcc 編譯 c++GC編譯C++
- python---之編譯型語言和解釋型語言的區別Python編譯
- 異常-編譯期異常和執行期異常的區別編譯
- java 和c++在編譯和執行上有什麼區別?JavaC++編譯
- 在C,C++,java和python執行時直譯器和編譯器的區別C++JavaPython編譯
- 關於機器學習和AI的區別最經典的解釋機器學習AI
- 圖解Java程式編譯解釋過程圖解Java編譯
- 10個句子看直譯和意譯的區別
- ==和is的區別 以及編碼和解碼
- .NET 編譯執行or解釋執行?編譯
- 電位器和編碼器的區別
- MySQL中普通sql與預編譯sql 區別MySql編譯
- MyBatis中#{}和${}的區別詳解MyBatis
- cookie 和session 的區別詳解CookieSession
- @Autowire和@Resource註解的區別
- Redis 和 Memcached 的區別詳解Redis
- Cookie和Session的區別詳解CookieSession
- 編譯執行、解釋執行的一些思考編譯
- Webpack中Loader和Plugin的區別和編寫思路WebPlugin
- ask Tom解釋 connect processes sesssions 的區別
- Java 中 field 和 variable 區別及相關術語解釋Java
- 庫克和賈伯斯在釋出會的區別
- 編譯型語言與解釋型語言編譯
- 編譯器的自展和自舉、交叉編譯編譯
- [譯] Jquery中 .bind() .live() .delegate() 和 .on() 之間的區別jQuery
- 『無為則無心』Python基礎 — 2、編譯型語言和解釋型語言的區別Python編譯