編譯型語言、解釋型語言、靜態(tài)類型語言、動態(tài)類型語言概念與區(qū)別

本文系轉(zhuǎn)載, 原文地址 http://www.cnblogs.com/zy1987/p/3784753.html?utm_source=tuicool&utm_medium=referral

最近在研究 Python 和 Erlang。反復(fù)提到動態(tài)類型語言、動態(tài)語言、解釋型語言這些概念。這些概念很生澀,在這里做一個總結(jié)。

編譯型語言和解釋型語言

1、編譯型語言

需通過編譯器(compiler)將源代碼編譯成機器碼,之后才能執(zhí)行的語言。一般需經(jīng)過編譯(compile)、鏈接(linker)這兩個步驟。編譯是把源代碼編譯成機器碼,鏈接是把各個模塊的機器碼和依賴庫串連起來生成可執(zhí)行文件。

優(yōu)點:編譯器一般會有預(yù)編譯的過程對代碼進行優(yōu)化。因為編譯只做一次,運行時不需要編譯,所以編譯型語言的程序執(zhí)行效率高??梢悦撾x語言環(huán)境獨立運行。

缺點:編譯之后如果需要修改就需要整個模塊重新編譯。編譯的時候根據(jù)對應(yīng)的運行環(huán)境生成機器碼,不同的操作系統(tǒng)之間移植就會有問題,需要根據(jù)運行的操作系統(tǒng)環(huán)境編譯不同的可執(zhí)行文件。

代表語言:C、C++、Pascal、Object-C 以及最近很火的蘋果新語言 swift

2、解釋型語言

解釋性語言的程序不需要編譯,相比編譯型語言省了道工序,解釋性語言在運行程序的時候才逐行翻譯。

優(yōu)點:有良好的平臺兼容性,在任何環(huán)境中都可以運行,前提是安裝了解釋器(虛擬機)。靈活,修改代碼的時候直接修改就可以,可以快速部署,不用停機維護。

缺點:每次運行的時候都要解釋一遍,性能上不如編譯型語言。

代表語言:JavaScript、Python、Erlang、PHP、Perl、Ruby

3、混合型語言

既然編譯型和解釋型各有缺點就會有人想到把兩種類型整合起來,取其精華去其糟粕。就出現(xiàn)了半編譯型語言。比如 C#,C# 在編譯的時候不是直接編譯成機器碼而是中間碼,.NET 平臺提供了中間語言運行庫運行中間碼,中間語言運行庫類似于 Java 虛擬機。.net 在編譯成 IL 代碼后,保存在 dll 中,首次運行時由 JIT 在編譯成機器碼緩存在內(nèi)存中,下次直接執(zhí)行(博友回復(fù)指出)。我個人認(rèn)為拋開一切的偏見 C# 是這個星球上最好的編程語言??上④浀恼呦拗屏?C# 的推廣。

Java 先生成字節(jié)碼再在 Java 虛擬機中解釋執(zhí)行。

嚴(yán)格來說混合型語言屬于解釋型語言。C# 更接近編譯型語言。

動態(tài)語言和靜態(tài)語言

1、動態(tài)語言

是一類在運行時可以改變其結(jié)構(gòu)的語言:例如新的函數(shù)、對象、甚至代碼可以被引進,已有的函數(shù)可以被刪除或是其他結(jié)構(gòu)上的變化。通俗點說就是在運行時代碼可以根據(jù)某些條件改變自身結(jié)構(gòu)。

主要動態(tài)語言:Object-C、C#、JavaScript、PHP、Python、Erlang。

2、靜態(tài)語言

與動態(tài)語言相對應(yīng)的,運行時結(jié)構(gòu)不可變的語言就是靜態(tài)語言。如 Java、C、C++。

3、注意:

很多人認(rèn)為解釋型語言都是動態(tài)語言,這個觀點是錯的!Java 是解釋型語言但是不是動態(tài)語言,Java 不能在運行的時候改變自己結(jié)構(gòu)。反之成立嗎?動態(tài)語言都是解釋型語言。也是錯的!Object-C 是編譯型語言,但是他是動態(tài)語言。得益于特有的 run time 機制(準(zhǔn)確說 run time 不是語法特性是運行時環(huán)境,這里不展開)OC 代碼是可以在運行的時候插入、替換方法的。

C# 也是動態(tài)語言,通過 C# 的反射機制可以動態(tài)的插入一段代碼執(zhí)行。所以我說 C# 是這個星球最好的編程語言。

動態(tài)類型語言和靜態(tài)類型語言

1、動態(tài)類型語言

很多網(wǎng)上資料把動態(tài)類型語言和動態(tài)語言混為一談,簡直是誤人子弟。動態(tài)類型語言和動態(tài)語言是完全不同的兩個概念。動態(tài)類型語言是指在運行期間才去做數(shù)據(jù)類型檢查的語言,說的是數(shù)據(jù)類型,動態(tài)語言說的是運行是改變結(jié)構(gòu),說的是代碼結(jié)構(gòu)。

動態(tài)類型語言的數(shù)據(jù)類型不是在編譯階段決定的,而是把類型綁定延后到了運行階段。

主要語言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。

2、靜態(tài)類型語言

靜態(tài)語言的數(shù)據(jù)類型是在編譯其間確定的或者說運行之前確定的,編寫代碼的時候要明確確定變量的數(shù)據(jù)類型。

主要語言:C、C++、C#、Java、Object-C。

3、注意:

相當(dāng)一部分程序員,也包括曾經(jīng)的我,認(rèn)為解釋型語言都是動態(tài)類型語言,編譯型語言都是靜態(tài)類型語言。這個也是錯的。swift 是編譯型語言但是它也是動態(tài)類型語言。C# 和 Java 是解釋型語言也是靜態(tài)類型語言。

強類型語言和弱類型語言

1、強類型語言:

強類型語言,一旦一個變量被指定了某個數(shù)據(jù)類型,如果不經(jīng)過強制類型轉(zhuǎn)換,那么它就永遠(yuǎn)是這個數(shù)據(jù)類型。你不能把一個整形變量當(dāng)成一個字符串來處理。

主要語言:Java、C#、Python、Object-C、Ruby

2、弱類型語言:

數(shù)據(jù)類型可以被忽略,一個變量可以賦不同數(shù)據(jù)類型的值。一旦給一個整型變量 a 賦一個字符串值,那么 a 就變成字符類型。

主要語言:JavaScript、PHP、C、C++(C 和 C++ 有爭議,但是確實可以給一個字符變量賦整形值,可能初衷是強類型,形態(tài)上接近弱類型)

3、注意:

一個語言是不是強類型語言和是不是動態(tài)類型語言也沒有必然聯(lián)系。Python 是動態(tài)類型語言,是強類型語言。JavaScript 是動態(tài)類型語言,是弱類型語言。Java 是靜態(tài)類型語言,是強類型語言。

如果我的理解有誤,請在回復(fù)中不吝指出,謝謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容