有两组概念容易引起混淆:
静态语言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