靜態(tài)類型定義語言
一種在編譯時(shí),數(shù)據(jù)類型是固定的語言整陌。大多數(shù)靜態(tài)類型定義語言強(qiáng)制這一點(diǎn)锁荔,它要求你在使用所有變量之前要聲明它們的數(shù)據(jù)類型。Java和C是靜態(tài)類型定義語言黎做。
動(dòng)態(tài)類型定義語言
一種在執(zhí)行期間才去發(fā)現(xiàn)數(shù)據(jù)類型的語言叉跛,與靜態(tài)類型定義相反。VBScript和Python是動(dòng)態(tài)類型定義的蒸殿,因?yàn)樗鼈兪窃诘谝淮谓o一個(gè)變量賦值的時(shí)候找出它的類型的筷厘。
強(qiáng)類型定義語言
一種總是強(qiáng)制類型定義的語言。Java和Python是強(qiáng)制類型定義的宏所。如果你有一個(gè)整數(shù)敞掘,如果不顯示地進(jìn)行轉(zhuǎn)換,你不能將其視為一個(gè)字符串楣铁。
弱類型定義語言
一種類型可以被忽略的語言,與強(qiáng)類型定義相反更扁。VBScript是弱類型定義的盖腕。在VBScript中,可以將字符串'12'和整數(shù)3進(jìn)行連接得到字符串'123'浓镜,然后可以把它看成整數(shù)123溃列,而不需要顯示轉(zhuǎn)換。但其實(shí)它們的類型沒有改變,VB只是在判斷出一個(gè)表達(dá)式含有不同類型的變量之后,自動(dòng)在這些變量前加了一個(gè)clong()或(int)()這樣的轉(zhuǎn)換函數(shù)而已.能做到這一點(diǎn)其實(shí)是歸功于VB的編譯器的智能化而已,這并非是VB語言本身的長處或短處.
結(jié)論:
靜態(tài)是類型編譯時(shí)判斷膛薛;動(dòng)態(tài)是類型運(yùn)行時(shí)判斷听隐;強(qiáng)類型是類型獨(dú)立,不輕易轉(zhuǎn)化哄啄;弱類型是類型不嚴(yán)格區(qū)分雅任,一般是只要大小放得下风范,就可以轉(zhuǎn)化。這種是匯編級(jí)的觀點(diǎn)沪么。面向?qū)ο蟮挠^點(diǎn)并非這樣的硼婿,對(duì)象并不是大小差不多就是類型兼容,而是關(guān)鍵的接口要相同才叫類型兼容禽车。
動(dòng)態(tài)語言并非是弱類型寇漫,這是不等價(jià)的。恰好的殉摔,一般動(dòng)態(tài)語言都是強(qiáng)類型語言州胳,因?yàn)槎际亲裾彰嫦驅(qū)ο蟮挠^點(diǎn)來設(shè)計(jì)對(duì)象的。
動(dòng)態(tài)語言的劣勢很明顯逸月,就是缺少開發(fā)環(huán)境栓撞,運(yùn)行效率差,當(dāng)然語言設(shè)計(jì)上也不完美(靜態(tài)語言何止千萬彻采,但c++也就一個(gè))腐缤。
優(yōu)勢也很明顯,就是編寫容易肛响,層次高岭粤,接近自然語義。動(dòng)態(tài)類型語言效率低下的原因特笋,不在于變量的類型是動(dòng)態(tài)的剃浇,而在于對(duì)象的方法是動(dòng)態(tài)聯(lián)編的,在這一點(diǎn)上動(dòng)態(tài)類型語言和Java沒什么不同猎物。
靜態(tài)類型語言的優(yōu)勢究竟是什么虎囚?
觀點(diǎn)一:靜態(tài)類型語言因?yàn)轭愋蛷?qiáng)制聲明,所以IDE可以做到很好的代碼感知能力蔫磨,因?yàn)橛蠭DE的撐腰淘讥,所以開發(fā)大型系統(tǒng),復(fù)雜系統(tǒng)比較有保障堤如。
對(duì)于像Java來說蒲列,IDEA/Eclipse確實(shí)在代碼感知能力上面已經(jīng)非常強(qiáng)了,這無疑能夠增加對(duì)大型系統(tǒng)復(fù)雜系統(tǒng)的掌控能力搀罢。但是除了Java擁有這么強(qiáng)的IDE武器之外蝗岖,似乎其他語言從來沒有這么強(qiáng)的IDE。C#的Visual Studio在GUI開發(fā)方面和Wizard方面很強(qiáng)榔至,但是代碼感知能力上和Eclipse差的不是一點(diǎn)半點(diǎn)抵赢。至于Visual C++根本就是一個(gè)編譯器而已,羞于提及Visual這個(gè)字眼。更不要說那么多C/C++開發(fā)人員都是操起vi吭哧吭哧寫了幾十萬行代碼呢铅鲤。特別是像Linux Kernel這種幾百萬行代碼划提,也就是用vi寫出來的阿,夠復(fù)雜彩匕,夠大型腔剂,夠長生命周期的吧。
觀點(diǎn)二:靜態(tài)語言相對(duì)比較封閉的特點(diǎn)驼仪,使得第三方開發(fā)包對(duì)代碼的侵害性可以降到很低掸犬。動(dòng)態(tài)語言在這點(diǎn)上表現(xiàn)的就比較差,我想大家都有過從網(wǎng)上下載某個(gè)JS包绪爸,然后放到項(xiàng)目代碼里發(fā)生沖突的經(jīng)歷
也就是說靜態(tài)類型語言可以保障package的命名空間分割湾碎,從而避免命名沖突,代碼的良好隔離性奠货。但是這個(gè)觀點(diǎn)也缺乏說服力介褥。
靜態(tài)類型語言中C,VB都缺乏良好的命名空間分割,容易產(chǎn)生沖突递惋,但是并沒有影響他們做出來的系統(tǒng)就不夠大柔滔,不夠復(fù)雜。
而Visual C++開發(fā)的DLL版本沖突也是臭名昭著的萍虽,似乎C++的命名空間沒有給它帶來很大的幫助睛廊。
而動(dòng)態(tài)類型語言中Ruby/Python/Perl都有比較好的命名空間,特別是Python和Perl杉编,例如CPAN上面的第三方庫成噸成噸的超全,也從來沒有聽說什么沖突的問題。
誠然像PHP邓馒,JavaScript這樣缺乏命名空間的動(dòng)態(tài)語言很容易出現(xiàn)問題嘶朱,但是這似乎是因?yàn)樗麄內(nèi)狈O機(jī)制導(dǎo)致的,而不是因?yàn)樗麄儎?dòng)態(tài)類型導(dǎo)致的吧光酣?
說到大型系統(tǒng)疏遏,復(fù)雜業(yè)務(wù)邏輯系統(tǒng),Google公司很多東西都是用python開發(fā)的救军,這也證明了動(dòng)態(tài)類型語言并非不能做大型的復(fù)雜的系統(tǒng)改览。其實(shí)我個(gè)人認(rèn)為:
動(dòng)態(tài)類型語言,特別是高級(jí)動(dòng)態(tài)類型語言缤言,反而能夠讓人們不需要分心去考慮程序編程問題,而集中精力思考業(yè)務(wù)邏輯實(shí)現(xiàn)视事,即思考過程即實(shí)現(xiàn)過程胆萧,用DSL描述問題的過程就是編程的過程,這方面像Unix Shell,ruby跌穗,SQL订晌,甚至PHP都是相應(yīng)領(lǐng)域當(dāng)之無愧的DSL語言。而顯然靜態(tài)類型語言基本都不滿足這個(gè)要求蚌吸。
那靜態(tài)類型語言的優(yōu)勢究竟是什么呢锈拨?我認(rèn)為就是執(zhí)行效率非常高。所以但凡需要關(guān)注執(zhí)行性能的地方就得用靜態(tài)類型語言羹唠。其他方面似乎沒有什么特別的優(yōu)勢奕枢。