定义
通常我们所说的动态语言、静态语言指 动态类型语言(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){
return a+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"}; alert(person.getName()); |
当然静态编程语言 是运行时不可改变结构了。
网上有人说 类型检查和改变结构 是静态语言和动态语言两个区别点。基本概念上应该就这些,是我个人理解,不一定完全正确。个人感觉没必要很清晰分门类,掌握优点、特点就好了。这个话题说开根本不是我能说清楚的。总结思考一下。
有三个名词容易混淆:
- Dynamic Programming Language (动态语言或动态编程语言)
- Dynamically Typed Language (动态类型语言)
- Statically Typed Language (静态类型语言)
FantasySoft在他文章中所提到的动态语言与静态语言实际上指的就是动态类型语言与静态类型语言。
动态语言,准确地说,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。
所谓的动态类型语言,意思就是类型的检查是在运行时做的,比如如下代码是不是合法的要到运行时才判断(注意是运行时的类型判断):
return a + b
而静态类型语言的类型判断是在运行前判断(如编译阶段),比如C#就是一个静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要,所以一般动态语言都会采用dynamictyping,常出现于脚本语言中。(idior不知道这能不能回答你对动态语言多态的疑问^_^)
这里我需要明确说明一点,那就是,是不是动态类型语言与这门语言是不是类型安全的完全不相干的,不要将它们联系在一起!
静态类型语言的主要优点在于其结构非常规范,便于调试,方便类型安全;缺点是为此需要写更多的类型相关代码,导致不便于阅读、不清晰明了。动态类型语言的优点在于方便阅读,不需要写非常多的类型相关的代码;缺点自然就是不方便调试,命名不规范时会造成读不懂,不利于理解等。顺便说一下,现在有这样一种趋势,那就是合并动态类型与静态类型在一种语言中,这样可以在必要的时候取长补短,Boo就是一个很好的试验性例子。^_^
最后说一下Boo,Boo是一个静态类型语言,虽然用duck typing可以模拟dynamictyping,但是duck并不支持所有类型的操作替代,所以即使完全使用duck typing也不能达到dynamictyping。就像FantasySoft所述,Type Inference不是动态类型语言的特性,所以支持TypeInference不代表这门语言就是dynamically typed。
再特地为Ninputer这个VB的fans说一下VB.NET^_^,VB.NET是dynamically typed语言。