有兩組概念容易引起混淆:
靜態語言vs動態語言 ( StaticProgramming Language & Dynamic Programming Language)
靜態類型語言vs動態類型語言 (Statically Typed Language & Dynamically Typed Language)
經常造成誤解的是: 把動態語言等同于動態類型語言,把靜態語言等同于靜態類型語言。
其實,這是兩組不同的概念:
動態語言是指運行期間可以改變其結構的語言:例如增加或者刪除函數、對象、甚至代碼。比如JavaScript、Objective-C、Ruby、Python等,而C、C++等語言則不屬于動態語言。靜態語言與動態語言相反,在運行時不能改變其結構。盡管靜態語言可以通過復雜的手段實現動態語言的特性,但是動態語言提供了直接的方法實現語言的動態性。
動態類型語言是指在運行期間才去做數據類型檢查的語言。在用動態語言編程時,不用給變量指定數據類型,第一次賦值給變量時,在內部將數據類型記錄下來。JavaScript、Ruby、Python是典型的動態類型語言。靜態類型語言與動態類型語言剛好相反,它的數據類型檢查發生在在編譯階段,也就是說在寫程序時要聲明變量的數據類型。C/C++、C#、Java都是靜態類型語言的典型代表。
大部分動態語言是動態類型的,但是不是所有都是。
動態類型語言舉例(Python):
Python是動態類型語言
# coding: utf-8
def sum(a, b):
return a + b;
print sum(1,2);
print sum("Hello ", "Word")
輸出:
3
Hello Word
上面的Python代碼中sum函數沒有指定參數類型,只在運行時決定參數類型。
動態語言舉例(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是通過關聯數組實現語言的動態性。
動態語言舉例(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動態添加了一個hello方法。Objective-C語言是通過語言的runtime特性實現語言的動態性。
一般來說,動態語言是運行時可以給類增加或者刪除方法;而動態類型語言是推遲到運行時才去做數據類型檢查的語言,兩個概念說的不是同一個問題。
參考文獻
[1]. https://en.wikipedia.org/wiki/Dynamic_programming_language
[2]. https://martinfowler.com/bliki/DynamicTyping.html