通常我們所說的動(dòng)態(tài)語言速种、靜態(tài)語言是指動(dòng)態(tài)類型語言和靜態(tài)類型語言。
對(duì)于動(dòng)態(tài)語言與靜態(tài)語言的區(qū)分低千,套用一句流行的話就是:Static typing when possible, dynamic typing when needed配阵。
(1)動(dòng)態(tài)類型語言:動(dòng)態(tài)類型語言是指在運(yùn)行期間才去做數(shù)據(jù)類型檢查的語言,也就是說,在用動(dòng)態(tài)類型的語言編程時(shí)棋傍,永遠(yuǎn)也不用給任何變量指定數(shù)據(jù)類型救拉,該語言會(huì)在你第一次賦值給變量時(shí),在內(nèi)部將數(shù)據(jù)類型記錄下來瘫拣。Python 和 Ruby 就是一種典型的動(dòng)態(tài)類型語言亿絮,其他的各種腳本語言如 JavaScript 也屬于動(dòng)態(tài)類型語言。
動(dòng)態(tài)類型語言的優(yōu)點(diǎn)
編寫的代碼數(shù)量更少麸拄,看起來更加簡(jiǎn)潔派昧,可以把精力更多地放在業(yè)務(wù)邏輯上。雖然不區(qū)分類型在某些情況下會(huì)讓程序變得難以理解感帅,但整體而言斗锭,代碼量越少,越專注于邏輯表達(dá)失球,對(duì)閱讀程序越有幫助。動(dòng)態(tài)類型語言的缺點(diǎn)
無法保證變量的類型帮毁,從而在程序的運(yùn)行期有可能發(fā)生跟類型相關(guān)的錯(cuò)誤实苞。
動(dòng)態(tài)類型語言對(duì)變量類型的寬容給實(shí)際編碼帶來了很大的靈活性。由于無需進(jìn)行類型檢測(cè)烈疚,我們可以嘗試調(diào)用任何對(duì)象的任意方法黔牵,而無需去考慮它原本是否被設(shè)計(jì)為擁有該方法。
(2)靜態(tài)類型語言:靜態(tài)類型語言與動(dòng)態(tài)類型語言剛好相反爷肝,它的數(shù)據(jù)類型是在編譯其間檢查的猾浦,也就是說在寫程序時(shí)要聲明所有變量的數(shù)據(jù)類型,C/C++ 是靜態(tài)類型語言的典型代表灯抛,其他的靜態(tài)類型語言還有 C#金赦、JAVA 等。
靜態(tài)類型語言的優(yōu)點(diǎn)
首先是在編譯時(shí)就能發(fā)現(xiàn)類型不匹配的錯(cuò)誤对嚼,編譯器可以幫助我們提前避免程序在運(yùn)行期間有可能發(fā)生的一些錯(cuò)誤夹抗。其次,如果在程序中明確規(guī)定了數(shù)據(jù)類型纵竖,編譯器還可以針對(duì)這些信息對(duì)程序進(jìn)行一些優(yōu)化工作漠烧,提高程序執(zhí)行速度。靜態(tài)類型語言的缺點(diǎn)
首先是迫使程序員依照強(qiáng)契約來編寫程序靡砌,為每個(gè)變量規(guī)定數(shù)據(jù)類型已脓,歸根結(jié)底只是輔助我們編寫可靠性高程序的一種手段,而不是編寫程序的目的通殃,畢竟大部分人編寫程序的目的是為了完成需求交付生產(chǎn)度液。其次,類型的聲明也會(huì)增加更多的代碼,在程序編寫過程中恨诱,這些細(xì)節(jié)會(huì)讓程序員的精力從思考業(yè)務(wù)邏輯上分散開來媳瞪。
一般靜態(tài)類型語言更適合用于描述數(shù)據(jù)結(jié)構(gòu)。
面向接口編程
在動(dòng)態(tài)類型語言的面向?qū)ο笤O(shè)計(jì)中照宝,我們不必借助超類型的幫助蛇受,就能輕松地在動(dòng)態(tài)類型語言中實(shí)現(xiàn)一個(gè)原則:面向接口編程,而不是面向?qū)崿F(xiàn)編程厕鹃。例如兢仰,一個(gè)對(duì)象若有 push 和 pop 方法,并且這些方法提供了正確的實(shí)現(xiàn)剂碴,它就可以被當(dāng)作棧來使用把将。一個(gè)對(duì)象如果有 length 屬性,也可以依照下標(biāo)來存取屬性忆矛,這個(gè)對(duì)象就可以被當(dāng)作數(shù)組來使用察蹲。
在靜態(tài)類型語言中,要實(shí)現(xiàn)“面向接口編程”并不是一件容易的事情催训,往往要通過抽象類或者接口等將對(duì)象進(jìn)行向上轉(zhuǎn)型洽议。當(dāng)對(duì)象的真正類型被隱藏在它的超類型身后,這些對(duì)象才能在類型檢查系統(tǒng)的“監(jiān)視”之下互相被替換使用漫拭。只有當(dāng)對(duì)象能夠被互相替換使用亚兄,才能體現(xiàn)出多態(tài)性的價(jià)值。
多態(tài)
多態(tài)的含義是:同一操作作用于不同的對(duì)象上面采驻,可以產(chǎn)生不同的解釋和不同的執(zhí)行結(jié)果审胚。換句話說,給不同的對(duì)象發(fā)送同一個(gè)消息的時(shí)候礼旅,這些對(duì)象根據(jù)這個(gè)消息分別給出不同的反饋膳叨。
靜態(tài)類型語言編譯時(shí)會(huì)進(jìn)行類型匹配檢查,所以不能給變量賦予不同類型的值各淀。為了解決這一問題懒鉴,靜態(tài)類型的面向?qū)ο笳Z言通常通過向上轉(zhuǎn)型的技術(shù)來取得多態(tài)的效果。
而動(dòng)態(tài)類型語言的變量類型在運(yùn)行期是可變的碎浇,這意味著對(duì)象的多態(tài)性是與生俱來的临谱。一個(gè)對(duì)象能否執(zhí)行某個(gè)操作,只取決于有沒有對(duì)應(yīng)的方法奴璃,而不取決于它是否是某種類型的對(duì)象悉默。