。。。
造成這種差異和誤解的根本原因是JAVA是一門靜態(tài)語言,而Python是一門動態(tài)語言。而恰好,JAVA又是一門編譯型的語言,而Python是一個用解釋器執(zhí)行的解釋型語言。于是有人告訴我,編譯型語言就是靜態(tài)語言,而解釋型語言就是動態(tài)語言。 編譯型語言需通過編譯器(compiler)將源代碼編譯成機器碼,之后才能執(zhí)行的語言。一般需經(jīng)過編譯(compile)、鏈接(linker)這兩個步驟。編譯是把源代碼編譯成機器碼,鏈接是把各個模塊的機器碼和依賴庫串連起來生成可執(zhí)行文件。
解釋型語言解釋性語言的程序不需要編譯,相比編譯型語言省了道工序,解釋性語言在運行程序的時候才逐行翻譯為機器碼來給機器執(zhí)行。
混合型語言既然編譯型和解釋型各有缺點就會有人想到把兩種類型整合起來,取其精華去其糟粕。就出現(xiàn)了半編譯型語言。比如C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼,.NET平臺提供了中間語言運行庫運行中間碼,中間語言運行庫類似于Java虛擬機。.net在編譯成IL代碼后,保存在dll中,首次運行時由JIT在編譯成機器碼緩存在內(nèi)存中,下次直接執(zhí)行。Java先生成字節(jié)碼再在Java虛擬機中解釋執(zhí)行。嚴(yán)格來說混合型語言屬于解釋型語言。C#更接近編譯型語言。 動態(tài)語言和靜態(tài)語言動態(tài)語言是一類在運行時可以改變其結(jié)構(gòu)的語言:例如新的函數(shù)、對象、甚至代碼可以被引進,已有的函數(shù)可以被刪除或是其他結(jié)構(gòu)上的變化。通俗點說就是在運行時代碼可以根據(jù)某些條件改變自身結(jié)構(gòu)。 靜態(tài)語言與動態(tài)語言相對應(yīng)的,運行時結(jié)構(gòu)不可變的語言就是靜態(tài)語言。如Java、C、C++。 走出誤區(qū)很多人認(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代碼是可以在運行的時候插入、替換方法的。 靜態(tài)類型語言和動態(tài)類型語言為了不混淆動態(tài)語言和動態(tài)類型語言,下面還補充說明以下幾個概念 動態(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)類型語言靜態(tài)語言的數(shù)據(jù)類型是在編譯其間確定的或者說運行之前確定的,編寫代碼的時候要明確確定變量的數(shù)據(jù)類型。 注意解釋型語言并不都是動態(tài)類型語言,編譯型語言也不全是靜態(tài)類型語言。swift是編譯型語言但是它也是動態(tài)類型語言。C#和Java是解釋型語言也是靜態(tài)類型語言,雖然它們看作解釋型語言,但是它們也有編譯過程,會在編譯過程中做數(shù)據(jù)類型的檢查 強類型語言和弱類型語言說到數(shù)據(jù)類型,就不得不提從數(shù)據(jù)類型是否嚴(yán)格定義的角度產(chǎn)生的另外兩個概念:強類型語言和弱類型語言 強類型語言:強類型語言,一旦一個變量被指定了某個數(shù)據(jù)類型,如果不經(jīng)過強制類型轉(zhuǎn)換,那么它就永遠是這個數(shù)據(jù)類型。你不能把一個整形變量當(dāng)成一個字符串來處理。 弱類型語言:數(shù)據(jù)類型可以被忽略,一個變量可以賦不同數(shù)據(jù)類型的值。一旦給一個整型變量a賦一個字符串值,那么a就變成字符類型。 3、注意:一個語言是不是強類型語言和是不是動態(tài)類型語言也沒有必然聯(lián)系。Python是動態(tài)類型語言,是強類型語言。JavaScript是動態(tài)類型語言,是弱類型語言。Java是靜態(tài)類型語言,是強類型語言。 附錄概念對照表
|
|