編譯型語言和解釋型語言
1、編譯型語言
需通過編譯器(compiler)將源代碼編譯成機(jī)器碼,之后才能執(zhí)行的語言。一般需經(jīng)過編譯(compile)、鏈接(linker)這兩個(gè)步驟。編譯是把源代碼編譯成機(jī)器碼,鏈接是把各個(gè)模塊的機(jī)器碼和依賴庫串連起來生成可執(zhí)行文件。
優(yōu)點(diǎn):編譯器一般會(huì)有預(yù)編譯的過程對(duì)代碼進(jìn)行優(yōu)化。因?yàn)榫幾g只做一次,運(yùn)行時(shí)不需要編譯,所以編譯型語言的程序執(zhí)行效率高。可以脫離語言環(huán)境獨(dú)立運(yùn)行。
缺點(diǎn):編譯之后如果需要修改就需要整個(gè)模塊重新編譯。編譯的時(shí)候根據(jù)對(duì)應(yīng)的運(yùn)行環(huán)境生成機(jī)器碼,不同的操作系統(tǒng)之間移植就會(huì)有問題,需要根據(jù)運(yùn)行的操作系統(tǒng)環(huán)境編譯不同的可執(zhí)行文件。
代表語言:C、C++、Pascal、Object-C以及最近很火的蘋果新語言swift
2、解釋型語言
解釋性語言的程序不需要編譯,相比編譯型語言省了道工序,解釋性語言在運(yùn)行程序的時(shí)候才逐行翻譯。
優(yōu)點(diǎn):有良好的平臺(tái)兼容性,在任何環(huán)境中都可以運(yùn)行,前提是安裝了解釋器(虛擬機(jī))。靈活,修改代碼的時(shí)候直接修改就可以,可以快速部署,不用停機(jī)維護(hù)。
缺點(diǎn):每次運(yùn)行的時(shí)候都要解釋一遍,性能上不如編譯型語言。
代表語言:JavaScript、Python、Erlang、PHP、Perl、Ruby
3、混合型語言
既然編譯型和解釋型各有缺點(diǎn)就會(huì)有人想到把兩種類型整合起來,取其精華去其糟粕。就出現(xiàn)了半編譯型語言。比如C#,C#在編譯的時(shí)候不是直接編譯成機(jī)器碼而是中間碼,.NET平臺(tái)提供了中間語言運(yùn)行庫運(yùn)行中間碼,中間語言運(yùn)行庫類似于Java虛擬機(jī)。.net在編譯成IL代碼后,保存在dll中,首次運(yùn)行時(shí)由JIT在編譯成機(jī)器碼緩存在內(nèi)存中,下次直接執(zhí)行(博友回復(fù)指出)。我個(gè)人認(rèn)為拋開一切的偏見C#是這個(gè)星球上最好的編程語言。可惜微軟的政策限制了C#的推廣。
Java先生成字節(jié)碼再在Java虛擬機(jī)中解釋執(zhí)行。嚴(yán)格來說混合型語言屬于解釋型語言。C#更接近編譯型語言。
動(dòng)態(tài)語言和靜態(tài)語言
1、動(dòng)態(tài)語言
是一類在運(yùn)行時(shí)可以改變其結(jié)構(gòu)的語言:例如新的函數(shù)、對(duì)象、甚至代碼可以被引進(jìn),已有的函數(shù)可以被刪除或是其他結(jié)構(gòu)上的變化。通俗點(diǎn)說就是在運(yùn)行時(shí)代碼可以根據(jù)某些條件改變自身結(jié)構(gòu)。
主要?jiǎng)討B(tài)語言:Object-C、C#、JavaScript、PHP、Python、Erlang。
2、靜態(tài)語言
與動(dòng)態(tài)語言相對(duì)應(yīng)的,運(yùn)行時(shí)結(jié)構(gòu)不可變的語言就是靜態(tài)語言。如Java、C、C++。
3、注意:
很多人認(rèn)為解釋型語言都是動(dòng)態(tài)語言,這個(gè)觀點(diǎn)是錯(cuò)的!Java是解釋型語言但是不是動(dòng)態(tài)語言,Java不能在運(yùn)行的時(shí)候改變自己結(jié)構(gòu)。反之成立嗎?動(dòng)態(tài)語言都是解釋型語言。也是錯(cuò)的!Object-C是編譯型語言,但是他是動(dòng)態(tài)語言。得益于特有的run time機(jī)制(準(zhǔn)確說run time不是語法特性是運(yùn)行時(shí)環(huán)境,這里不展開)OC代碼是可以在運(yùn)行的時(shí)候插入、替換方法的。
C#也是動(dòng)態(tài)語言,通過C#的反射機(jī)制可以動(dòng)態(tài)的插入一段代碼執(zhí)行。所以我說C#是這個(gè)星球最好的編程語言。
動(dòng)態(tài)類型語言和靜態(tài)類型語言
1、動(dòng)態(tài)類型語言
很多網(wǎng)上資料把動(dòng)態(tài)類型語言和動(dòng)態(tài)語言混為一談,簡直是誤人子弟。動(dòng)態(tài)類型語言和動(dòng)態(tài)語言是完全不同的兩個(gè)概念。動(dòng)態(tài)類型語言是指在運(yùn)行期間才去做數(shù)據(jù)類型檢查的語言,說的是數(shù)據(jù)類型,動(dòng)態(tài)語言說的是運(yùn)行是改變結(jié)構(gòu),說的是代碼結(jié)構(gòu)。
動(dòng)態(tài)類型語言的數(shù)據(jù)類型不是在編譯階段決定的,而是把類型綁定延后到了運(yùn)行階段。
主要語言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。
2、靜態(tài)類型語言
靜態(tài)語言的數(shù)據(jù)類型是在編譯其間確定的或者說運(yùn)行之前確定的,編寫代碼的時(shí)候要明確確定變量的數(shù)據(jù)類型。
主要語言:C、C++、C#、Java、Object-C。
3、注意:
相當(dāng)一部分程序員,也包括曾經(jīng)的我,認(rèn)為解釋型語言都是動(dòng)態(tài)類型語言,編譯型語言都是靜態(tài)類型語言。這個(gè)也是錯(cuò)的。swift是編譯型語言但是它也是動(dòng)態(tài)類型語言。C#和Java是解釋型語言也是靜態(tài)類型語言。
強(qiáng)類型語言和弱類型語言
1、強(qiáng)類型語言:
強(qiáng)類型語言,一旦一個(gè)變量被指定了某個(gè)數(shù)據(jù)類型,如果不經(jīng)過強(qiáng)制類型轉(zhuǎn)換,那么它就永遠(yuǎn)是這個(gè)數(shù)據(jù)類型。你不能把一個(gè)整形變量當(dāng)成一個(gè)字符串來處理。
主要語言:Java、C#、Python、Object-C、Ruby
2、弱類型語言:
數(shù)據(jù)類型可以被忽略,一個(gè)變量可以賦不同數(shù)據(jù)類型的值。一旦給一個(gè)整型變量a賦一個(gè)字符串值,那么a就變成字符類型。
主要語言:JavaScript、PHP、C、C++(C和C++有爭(zhēng)議,但是確實(shí)可以給一個(gè)字符變量賦整形值,可能初衷是強(qiáng)類型,形態(tài)上接近弱類型)
3、注意:
一個(gè)語言是不是強(qiáng)類型語言和是不是動(dòng)態(tài)類型語言也沒有必然聯(lián)系。Python是動(dòng)態(tài)類型語言,是強(qiáng)類型語言。JavaScript是動(dòng)態(tài)類型語言,是弱類型語言。Java是靜態(tài)類型語言,是強(qiáng)類型語言。
最近看到一篇關(guān)于講靜態(tài)動(dòng)態(tài)、強(qiáng)弱類型的文章覺得講的蠻詳細(xì)就轉(zhuǎn)載過來了,參考文章原地址http://www.cnblogs.com/zy1987/p/3784753.html?utm_source=tuicool&utm_medium=referral
我是直接從這拿的:
http://blog.csdn.net/u012050154/article/details/51206731