最近在研究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ù)指出)。我個人認為拋開一切的偏見C#是這個星球上最好的編程語言,??上④浀恼呦拗屏薈#的推廣。 Java先生成字節(jié)碼再在Java虛擬機中解釋執(zhí)行,。 嚴格來說混合型語言屬于解釋型語言,。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,、注意: 很多人認為解釋型語言都是動態(tài)語言,,這個觀點是錯的!Java是解釋型語言但是不是動態(tài)語言,,Java不能在運行的時候改變自己結(jié)構(gòu),。反之成立嗎?動態(tài)語言都是解釋型語言。也是錯的,!Object-C是編譯型語言,,但是他是動態(tài)語言。得益于特有的run time機制(準確說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,、注意: 相當一部分程序員,也包括曾經(jīng)的我,,認為解釋型語言都是動態(tài)類型語言,,編譯型語言都是靜態(tài)類型語言,。這個也是錯的。swift是編譯型語言但是它也是動態(tài)類型語言,。C#和Java是解釋型語言也是靜態(tài)類型語言,。 強類型語言和弱類型語言1、強類型語言: 強類型語言,,一旦一個變量被指定了某個數(shù)據(jù)類型,,如果不經(jīng)過強制類型轉(zhuǎn)換,,那么它就永遠是這個數(shù)據(jù)類型,。你不能把一個整形變量當成一個字符串來處理。 主要語言: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ù)中不吝指出,,謝謝,。 |
|