1. 程式人生 > >對編譯型語言和解釋型語言的理解

對編譯型語言和解釋型語言的理解

高階語言----->組合語言------>機器語言

1.編譯型語言,例如C,C++等。

在執行前,高階語言經編譯器編譯為組合語言,組合語言由彙編器彙編為機器碼並生成可執行檔案。

2.解釋語言,Python等

在執行時,高階語言由翻譯器譯為目的碼,目的碼由直譯器解釋為機器碼並執行。

下面是轉載的內容:

兩種方式的異同之處:  <1>轉換為機器碼的時機和執行效率        兩種轉換為機器碼的方式,最大不同之處是處理轉換為機器碼的時機不同。編譯型是在執行前(且只編譯一次),需要做轉換工作,並生成一個可執行的機器碼檔案,使用者每次執行該可執行檔案執行即可,效率、執行速度要比解釋型的快。因為解釋型是在執行時做轉換工作,並不生成可執行檔案,所以每次執行都需要做一下轉換工作,然後再執行,效率自然就低了。  <2>糾錯排查        編譯型語言,在編譯階段即可發現常見的語法或者連結等錯誤,此機制可在執行前幫助程式設計師排查出可能潛在的語法、語義和型別轉換錯誤,編譯型語言一般都有明確的變數型別檢測,也被稱作強型別語言,即編譯型語言至少能確保所生成的可執行檔案肯定是可執行的,至於執行的邏輯不對則屬於程式設計師業務邏輯錯誤範疇了。        而對於解釋型語言,程式碼中的錯誤必須直到執行階段方可發現,由此造成的困惑是:往往一段程式看不出問題但卻在執行階段錯誤連連且需要一個個排查:變數拼寫錯誤、方法不存在等。但也正是基於解釋是在執行期執行轉化的特性,一般的解釋型語言通常都有自己的shell,可以在不確定某些執行結果是立即“動手執行”試一下,這就比每次都需要編譯後才能執行並看到結果省去不少時間,魚和熊掌不可兼得的理念再一次被驗證了。  <3>可移植性        編譯型在編譯後生成的可執行檔案,是相對與本機機器指令集的,所生成的可執行檔案移植到不同機器指令集的機器上,勢必不一定能正常執行。而解釋型的,儘管在不同配置的機器上,也是最終會解釋成基於當前機器指令集的機器碼並執行,故解釋型的可移植性相對來說還是強於編譯型的。  <4>適用性        從第<1>點我們知道編譯型執行速度較解釋型快,因為編譯型會把大量時間花在編譯上,所以對機器和跨平臺性的要求不高,開發作業系統、大型應用程式、資料庫程式系統時一般都採用編譯型語言;而解釋型由於每次執行都需要解釋一遍,對機器有一定的配置要求(在記憶體較小的機器上去一遍遍解釋執行肯定是件很痛苦的事),適用的地方是一些例如網頁尾本、伺服器指令碼及輔助開發介面這類對機器配置要求不高、需要一定跨平臺相容性的程式。 魚和熊掌可兼得嗎?

        綜上所述,既然編譯型與解釋型各有優缺點又相互對立,所以一些語言都有把兩者折衷起來的趨勢:        Java為了實現跨平臺的特性,專門在從高階語言程式碼轉換至機器碼過程的中間加入了一層中間層JVM(java虛擬機器),Java首先依賴編譯器將程式碼(.java)編譯成JVM能識別的位元組碼檔案(.class),然後由JVM解釋並執行改位元組碼,也可結合JIT(即時編譯)技術,將解釋生成的機器碼轉換為更高效的本地機器碼,且該機器碼可被快取,來提高重複執行的效率。這樣的結合,令程式設計師在使用Java時即可享受編譯帶來的強型別編譯檢查的好處,又能在執行時享受程式碼執行的高效性和跨平臺性,何樂而不為呢?        Python是解釋型語言,但為了效率上的考慮,也提供了編譯方式,編譯後生成的也是位元組碼的檔案形式,並由Python的的VM(虛擬機器)的去執行,這點可以說和Java的編譯執行方式類似。不同點在於,Python的編譯並非強制執行的操作,確切來說Python的編譯是自動的,通常發生在對某個模組(module)的呼叫過程中,編譯成位元組碼的可以節省載入模組的時間,以此達到提高效率的目的。可見,某些先進的高階語言在對編譯和解釋方面的拿捏捨去,都採取了一種:兩手抓,兩手都要硬的態度哦:)