動態(tài)語言vs動態(tài)類型語言

有兩組概念容易引起混淆:

  • 靜態(tài)語言vs動態(tài)語言 ( StaticProgramming Language & Dynamic Programming Language)

  • 靜態(tài)類型語言vs動態(tài)類型語言 (Statically Typed Language & Dynamically Typed Language)

經(jīng)常造成誤解的是: 把動態(tài)語言等同于動態(tài)類型語言,把靜態(tài)語言等同于靜態(tài)類型語言。

其實,這是兩組不同的概念:

動態(tài)語言是指運行期間可以改變其結構的語言:例如增加或者刪除函數(shù)、對象、甚至代碼。比如JavaScript、Objective-C、Ruby、Python等,而C、C++等語言則不屬于動態(tài)語言。靜態(tài)語言與動態(tài)語言相反,在運行時不能改變其結構。盡管靜態(tài)語言可以通過復雜的手段實現(xiàn)動態(tài)語言的特性,但是動態(tài)語言提供了直接的方法實現(xiàn)語言的動態(tài)性。

動態(tài)類型語言是指在運行期間才去做數(shù)據(jù)類型檢查的語言。在用動態(tài)語言編程時,不用給變量指定數(shù)據(jù)類型,第一次賦值給變量時,在內(nèi)部將數(shù)據(jù)類型記錄下來。JavaScript、Ruby、Python是典型的動態(tài)類型語言。靜態(tài)類型語言與動態(tài)類型語言剛好相反,它的數(shù)據(jù)類型檢查發(fā)生在在編譯階段,也就是說在寫程序時要聲明變量的數(shù)據(jù)類型。C/C++、C#、Java都是靜態(tài)類型語言的典型代表。

大部分動態(tài)語言是動態(tài)類型的,但是不是所有都是。

動態(tài)類型語言舉例(Python):

Python是動態(tài)類型語言

# coding: utf-8

def sum(a, b):

    return a + b;

print sum(1,2);
print sum("Hello ", "Word")

輸出:
3
Hello Word
上面的Python代碼中sum函數(shù)沒有指定參數(shù)類型,只在運行時決定參數(shù)類型。

動態(tài)語言舉例(javascript):

function Person(name, age, job)
{
  this.name = name;
  this.age = age;
  this.job = job
  this.hello = function(name){
    alert("Hello, " + name);
};

person = new Person("Eric", 28, 'worker');
alert(person.name + '' + person.age + '');
person.hello("Alice");
//為對象添加方法
person.work = function(){
  alert('I am working');
}
person.work();

//刪除方法
delete person.work;
person.work();

javascript對象可以在運行時給對象添加和刪除方法。javascript是通過關聯(lián)數(shù)組實現(xiàn)語言的動態(tài)性。

動態(tài)語言舉例(Objective-C):

- (void)addMethod
{

  NSObject*obj = [[NSObjectalloc]init];

  class_addMethod([objclass],@selector(hello), (IMP)helloWorld,"v@:");

  [objperformSelector:@selector(hello)];

}

voidhelloWorld(idself,SEL_cmd){
  NSLog(@"Hello, this is a new Method!");
}

上面Objective-C代碼中,NSObject對象并沒有hello方法,但是在運行時給NSObject動態(tài)添加了一個hello方法。Objective-C語言是通過語言的runtime特性實現(xiàn)語言的動態(tài)性。

一般來說,動態(tài)語言是運行時可以給類增加或者刪除方法;而動態(tài)類型語言是推遲到運行時才去做數(shù)據(jù)類型檢查的語言,兩個概念說的不是同一個問題。

參考文獻

[1]. https://en.wikipedia.org/wiki/Dynamic_programming_language
[2]. https://martinfowler.com/bliki/DynamicTyping.html

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容