天天看點

什麼是動态語言和靜态語言?靜态語言動态語言的差別

定義 

通常我們所說的動态語言、靜态語言指 動态類型語言(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){

其實比較一下代碼,你很快就會發現,其實區分動态靜态類型語言從文法上就夠了,語言文法格式基本就可确認動靜态類型。

而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"};

當然靜态程式設計語言 是運作時不可改變結構了。

網上有人說 類型檢查和改變結構 是靜态語言和動态語言兩個差別點。基本概念上應該就這些,是我個人了解,不一定完全正确。個人感覺沒必要很清晰分門類,掌握優點、特點就好了。這個話題說開根本不是我能說清楚的。總結思考一下。

有三個名詞容易混淆:

  1. Dynamic Programming Language (動态語言或動态程式設計語言)
  2. Dynamically Typed Language (動态類型語言)
  3. 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語言。