有兩組概念容易引起混淆:
靜態(tài)語言vs動(dòng)態(tài)語言 ( StaticProgramming Language & Dynamic Programming Language)
靜態(tài)類型語言vs動(dòng)態(tài)類型語言 (Statically Typed Language & Dynamically Typed Language)
經(jīng)常造成誤解的是: 把動(dòng)態(tài)語言等同于動(dòng)態(tài)類型語言,把靜態(tài)語言等同于靜態(tài)類型語言。
其實(shí),這是兩組不同的概念:
動(dòng)態(tài)語言是指運(yùn)行期間可以改變其結(jié)構(gòu)的語言:例如增加或者刪除函數(shù)祝懂、對(duì)象伟叛、甚至代碼屯仗。比如JavaScript鱼填、Objective-C擒贸、Ruby橘沥、Python等窗轩,而C、C++等語言則不屬于動(dòng)態(tài)語言座咆。靜態(tài)語言與動(dòng)態(tài)語言相反品姓,在運(yùn)行時(shí)不能改變其結(jié)構(gòu)寝并。盡管靜態(tài)語言可以通過復(fù)雜的手段實(shí)現(xiàn)動(dòng)態(tài)語言的特性,但是動(dòng)態(tài)語言提供了直接的方法實(shí)現(xiàn)語言的動(dòng)態(tài)性腹备。
動(dòng)態(tài)類型語言是指在運(yùn)行期間才去做數(shù)據(jù)類型檢查的語言衬潦。在用動(dòng)態(tài)語言編程時(shí),不用給變量指定數(shù)據(jù)類型植酥,第一次賦值給變量時(shí)镀岛,在內(nèi)部將數(shù)據(jù)類型記錄下來。JavaScript友驮、Ruby漂羊、Python是典型的動(dòng)態(tài)類型語言。靜態(tài)類型語言與動(dòng)態(tài)類型語言剛好相反卸留,它的數(shù)據(jù)類型檢查發(fā)生在在編譯階段走越,也就是說在寫程序時(shí)要聲明變量的數(shù)據(jù)類型。C/C++耻瑟、C#旨指、Java都是靜態(tài)類型語言的典型代表。
大部分動(dòng)態(tài)語言是動(dòng)態(tài)類型的喳整,但是不是所有都是谆构。
動(dòng)態(tài)類型語言舉例(Python):
Python是動(dòng)態(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ù)類型,只在運(yùn)行時(shí)決定參數(shù)類型框都。
動(dòng)態(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");
//為對(duì)象添加方法
person.work = function(){
alert('I am working');
}
person.work();
//刪除方法
delete person.work;
person.work();
javascript對(duì)象可以在運(yùn)行時(shí)給對(duì)象添加和刪除方法搬素。javascript是通過關(guān)聯(lián)數(shù)組實(shí)現(xiàn)語言的動(dòng)態(tài)性。
動(dòng)態(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對(duì)象并沒有hello方法熬尺,但是在運(yùn)行時(shí)給NSObject動(dòng)態(tài)添加了一個(gè)hello方法。Objective-C語言是通過語言的runtime特性實(shí)現(xiàn)語言的動(dòng)態(tài)性谓罗。
一般來說粱哼,動(dòng)態(tài)語言是運(yùn)行時(shí)可以給類增加或者刪除方法;而動(dòng)態(tài)類型語言是推遲到運(yùn)行時(shí)才去做數(shù)據(jù)類型檢查的語言妥衣,兩個(gè)概念說的不是同一個(gè)問題皂吮。
參考文獻(xiàn)
[1]. https://en.wikipedia.org/wiki/Dynamic_programming_language
[2]. https://martinfowler.com/bliki/DynamicTyping.html