標籤:pos 合并 cti 實驗 new 總結 ram div 過程
定義
通常我們所說的動態語言、靜態語言指 動態類型語言(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++等語言則不屬於動態 語言。
所謂的動態類型語言,意思就是類型的檢查是在運行時做的,比如如下代碼是不是合法的要到運行時才判斷(注意是運行時的類型判斷):
defsum(a,b):
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語言。
什麼是動態語言和靜態語言?靜態語言動態語言的區別