1. 程式人生 > >徹底明白編譯型和解釋型、動態語言和靜態語言區別

徹底明白編譯型和解釋型、動態語言和靜態語言區別

探索

編譯型和解釋型的區別

先來看看編譯型語言定義:

編譯型語言首先是將原始碼編譯生成機器指令,再由機器執行機器碼 (二進位制)。

再來看看解釋型語言的定義:

解釋型語言的原始碼不是直接翻譯成機器指令,而是先翻譯成中間程式碼,再由直譯器對中間程式碼進行解釋執行。

咋看一眼,還是一臉懵逼。下面打個比方:

  • 編譯型相當於用中英文詞典(翻譯器)將一本英文書一次性翻譯(編譯)成一本中文書。以後檢視直接就是中文了。可想而知,以後讀書(執行)會非常非常方便。
  • 解釋型相當於用中英文詞典(翻譯器)將一本英文書讀一段翻譯一段(解釋)中文。以後檢視時還是需要重新翻譯。這樣效率會低一些,必須依賴直譯器,但是跨平臺性好。

擴充套件

編譯型和解釋型的定義是對立存在的,但也可以在一個語言中同時存在。比如 java 語言同時兼有編譯型和解釋型特點。整個流程如下:

將原始碼(.java 檔案)編譯生成位元組碼(.class 檔案),再通過 JVM(java 虛擬機器)執行生成機器指令,由機器執行機器碼。注意,此處生成機器語言前的操作是解釋型,每次執行都要重新解釋。因此,此處表明 java 是解釋型
但是,部分 JVM(java 虛擬機器)有一種 JIT(Just in time)機制,能夠將部分已經解釋翻譯的常用機器指令儲存。下次不需要解釋,直接執行即可。此時 java 是編譯型

因此,現在用編譯型和解釋型區分語言是行不通的。

動態語言和靜態語言

我們常說的動態語言和靜態語言,其實是指動態型別語言和靜態型別語言。先來看看動態型別語言:

動態型別語言,是指資料型別的檢查是在執行時做的。用動態型別語言程式設計時,不用給變數指定資料型別,該語言會在你第一次賦值給變數時,在內部記錄資料型別。

再來看看靜態型別語言的定義:

靜態型別語言,是指資料型別的檢查是在執行前(如編譯階段)做的。

小結:

  • 動態型別語言的優點是不需要寫多種資料型別的程式碼,程式碼相對簡潔一些,方便程式碼閱讀。缺點是不方便除錯,程式碼命名也容易混淆;
  • 靜態型別語言的優點是方便除錯,程式碼相對規範。缺點是需要寫很多資料型別相關的程式碼,程式碼不夠簡潔。

參考資料: