定義
通常我們所說的動態語言、靜態語言指 動態類型語言(Dynamically Typed Language)和 靜態類型語言Statically Typed Language)。
還有一個 Dynamic Programming Language (動態編程語言),靜態編程語言。
動態類型語言:在運行期間檢查數據的類型的語言。用這類語言編程,不會給變量指定類型,而是在附值時得到數據類型。如:Python和ruby就是典型動
態類型語言。很多腳本語言vbscrīpt,javascrīpt也是這類語言。看下面javascrīpt代碼:
function add(a,b){ return a+b; } add(1,2); add('1',2); |
靜態類型語言:相反靜態類型語言是在運行前編譯時檢查類型。在寫代碼時,沒聲明一個變量必須指定類型。如:Java,c#,c,c++等等。
public int add(int a,int b){
return a+b;
}
其實比較一下代碼,你很快就會發現,其實區分動態靜態類型語言從語法上就夠了,語言語法格式基本就可確認動靜態類型。
而Dynamic Programming Language (動態編程語言)指在程序運行過程中可以改變數據類型的結構,對象的函數,變量可以被修改刪除。比如:javascrīpt就是這類語言,ruby, python也屬於這類語言。而c++,java不屬於這類語言。看javascrīpt代碼:
function Person(name){ this.name=name; } Person.prototype.getName=function(){ return this.name; } var person=new Person("okok"); alert(person.getName()); person.getName=function(){return "nono"}; alert(person.getName()); |
當然靜態編程語言 是運行時不可改變結構了。
網上有人說 類型檢查和改變結構 是靜態語言和動態語言兩個區別點。基本概念上應該就這些,是我個人理解,不一定完全正確。個人感覺沒必要很清晰分門類,掌握優點、特點就好了。這個話題說開根本不是我能說清楚的。總結思考一下。
有三個名詞容易混淆:
- Dynamic Programming Language (動態語言或動態編程語言)
- Dynamically Typed Language (動態類型語言)
- Statically Typed Language (靜態類型語言)
FantasySoft在他文章中所提到的動態語言與靜態語言實際上指的就是動態類型語言與靜態類型語言。
動態語言,準確地說,是指程序在運行時可以改變其結構:新的函數可以被引進,已有的函數可以被刪除等在結構上的變化。比如衆所周知的 ECMAScript(JavaScript)便是一個動態語言。除此之外如Ruby、Python等也都屬於動態語言,而C、C++等語言則不屬於動態 語言。
所謂的動態類型語言,意思就是類型的檢查是在運行時做的,比如如下代碼是不是合法的要到運行時才判斷(注意是運行時的類型判斷):
return a + b
而靜態類型語言的類型判斷是在運行前判斷(如編譯階段),比如C#就是一個靜態類型語言,靜態類型語言爲了達到多態會採取一些類型鑑別手段,如繼 承、接口,而動態類型語言卻不需要,所以一般動態語言都會採用dynamic typing,常出現於腳本語言中。(idior不知道這能不能回答你對動態語言多態的疑問^_^)
這裏我需要明確說明一點,那就是,是不是動態類型語言與這門語言是不是類型安全的完全不相干的,不要將它們聯繫在一起!
靜態類型語言的主要優點在於其結構非常規範,便於調試,方便類型安全;缺點是爲此需要寫更多的類型相關代碼,導致不便於閱讀、不清晰明瞭。動態類型 語言的優點在於方便閱讀,不需要寫非常多的類型相關的代碼;缺點自然就是不方便調試,命名不規範時會造成讀不懂,不利於理解等。順便說一下,現在有這樣一 種趨勢,那就是合併動態類型與靜態類型在一種語言中,這樣可以在必要的時候取長補短,Boo就是一個很好的試驗性例子。^_^
最後說一下Boo,Boo是一個靜態類型語言,雖然用duck typing可以模擬dynamic typing,但是duck並不支持所有類型的操作替代,所以即使完全使用duck typing也不能達到dynamic typing。就像FantasySoft所述,Type Inference不是動態類型語言的特性,所以支持Type Inference不代表這門語言就是dynamically typed。
再特地爲Ninputer 這個VB的fans說一下VB.NET^_^,VB.Net是dynamically typed語言。