編譯型和解釋型的區(qū)別
先來看看編譯型語言定義:
編譯型語言首先是將源代碼編譯生成機(jī)器指令,再由機(jī)器運(yùn)行機(jī)器碼(二進(jìn)制)。
再來看看解釋型語言的定義:
解釋型語言的源代碼不是直接翻譯成機(jī)器指令臭埋,而是先翻譯成中間代碼,再由解釋器對中間代碼進(jìn)行解釋運(yùn)行臀玄。
咋看一眼瓢阴,還是一臉懵逼。下面打個比方:
- 編譯型相當(dāng)于用中英文詞典(翻譯器)將一本英文書一次性翻譯(編譯)成一本中文書健无。以后查看直接就是中文了荣恐。可想而知累贤,以后讀書(運(yùn)行)會非常非常方便募胃。
- 而解釋型相當(dāng)于用中英文詞典(翻譯器)將一本英文書讀一段翻譯一段(解釋)中文。以后查看時還是需要重新翻譯畦浓。這樣效率會低一些,必須依賴解釋器检疫,但是跨平臺性好讶请。
擴(kuò)展
編譯型和解釋型的定義是對立存在的,但也可以在一個語言中同時存在。比如 java 語言同時兼有編譯型和解釋型特點(diǎn)夺溢。整個流程如下:
將源代碼(.java 文件)編譯生成字節(jié)碼(.class 文件)论巍,再通過 JVM(java 虛擬機(jī))運(yùn)行生成機(jī)器指令,由機(jī)器運(yùn)行機(jī)器碼风响。注意嘉汰,此處生成機(jī)器語言前的操作是解釋型,每次運(yùn)行都要重新解釋状勤。因此鞋怀,此處表明 java 是解釋型。
但是持搜,部分 JVM(java 虛擬機(jī))有一種 JIT(Just in time)機(jī)制密似,能夠?qū)⒉糠忠呀?jīng)解釋翻譯的常用機(jī)器指令保存。下次不需要解釋葫盼,直接運(yùn)行即可残腌。此時 java 是編譯型。
因此贫导,現(xiàn)在用編譯型和解釋型區(qū)分語言是行不通的抛猫。
動態(tài)語言和靜態(tài)語言
我們常說的動態(tài)語言和靜態(tài)語言,其實(shí)是指動態(tài)類型語言和靜態(tài)類型語言孩灯。先來看看動態(tài)類型語言:
動態(tài)類型語言闺金,是指數(shù)據(jù)類型的檢查是在運(yùn)行時做的。用動態(tài)類型語言編程時钱反,不用給變量指定數(shù)據(jù)類型掖看,該語言會在你第一次賦值給變量時,在內(nèi)部記錄數(shù)據(jù)類型面哥。
再來看看靜態(tài)類型語言的定義:
靜態(tài)類型語言哎壳,是指數(shù)據(jù)類型的檢查是在運(yùn)行前(如編譯階段)做的。
小結(jié):
- 動態(tài)類型語言的優(yōu)點(diǎn)是不需要寫多種數(shù)據(jù)類型的代碼尚卫,代碼相對簡潔一些归榕,方便代碼閱讀。缺點(diǎn)是不方便調(diào)試吱涉,代碼命名也容易混淆刹泄;
- 靜態(tài)類型語言的優(yōu)點(diǎn)是方便調(diào)試,代碼相對規(guī)范怎爵。缺點(diǎn)是需要寫很多數(shù)據(jù)類型相關(guān)的代碼特石,代碼不夠簡潔。
參考資料:
百度百科:編譯型語言
百度百科:解釋型語言
知乎:Java 是編譯型語言還是解釋型語言鳖链?
IBM:深入淺出 JIT 編譯器
逛博:編譯型與解釋型姆蘸、動態(tài)語言與靜態(tài)語言、強(qiáng)類型語言與弱類型語言的區(qū)別