[澄清] 动态语言静态语言

FantasySoft的《也说Type Inference》后有感,觉得有必要澄清一些术语。

有三个名词容易混淆:

  1. Dynamic Programming Language (动态语言或动态编程语言)
  2. Dynamically Typed Language (动态类型语言)
  3. Statically Typed Language (静态类型语言)

FantasySoft在他文章中所提到的动态语言与静态语言实际上指的就是动态类型语言与静态类型语言。

动态语言,准确地说,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。

所谓的动态类型语言,意思就是类型的检查是在运行时做的,比如如下代码是不是合法的要到运行时才判断(注意是运行时的类型判断):

def sum(a, b):
   
return a + b

而静态类型语言的类型判断是在运行前判断(如编译阶段),比如C#就是一个静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要,所以一般动态语言都会采用dynamic typing,常出现于脚本语言中。(idior不知道这能不能回答你对动态语言多态的疑问^_^)

这里我需要明确说明一点,那就是,是不是动态类型语言与这门语言是不是类型安全的完全不相干的,不要将它们联系在一起!

静态类型语言的主要优点在于其结构非常规范,便于调试,方便类型安全;缺点是为此需要写更多的类型相关代码,导致不便于阅读、不清晰明了。动态类型语言的优点在于方便阅读,不需要写非常多的类型相关的代码;缺点自然就是不方便调试,命名不规范时会造成读不懂,不利于理解等。顺便说一下,现在有这样一种趋势,那就是合并动态类型与静态类型在一种语言中,这样可以在必要的时候取长补短,Boo就是一个很好的试验性例子。^_^

最后说一下Boo,Boo是一个静态类型语言,虽然用duck typing可以模拟dynamic typing,但是duck并不支持所有类型的操作替代,所以即使完全使用duck typing也不能达到dynamic typing。就像FantasySoft所述,Type Inference不是动态类型语言的特性,所以支持Type Inference不代表这门语言就是dynamically typed。

再特地为Ninputer这个VB的fans说一下VB.NET^_^,VB.NET是dynamically typed语言。

参考

http://en.wikipedia.org/wiki/Dynamically_typed_language
http://en.wikipedia.org/wiki/Dynamic_programming_language

posted @ 2005-08-03 10:49 Cavingdeep 阅读(4118) 评论(7)  编辑 收藏 网摘 所属分类: Comments

  回复  引用  查看    
#1楼2005-08-03 11:13 | idior      
以前一直以为动态类型语言是动态语言.
不知道通常意义上的Dynamic Language是指哪个? 我感觉Dynamic Language有点泛指动态类型的意思.

  回复  引用    
#2楼2005-08-03 11:39 | Cavingdeep
@idior
这个我也不太清楚,不过我建议正确使用术语,最好直接引用英文。^_^

  回复  引用  查看    
#3楼2005-08-03 13:14 | Ninputer      
可以把动态类型和动态结构都作为静态语言和动态语言之间的差异点吧。动态语言之间也存在动态程度的差异不是吗。
Fortran->C->C++>C#->VB->Perl->JScript->Boo/Python->Lisp

从纯静态到高度动态,每个级别都有。

  回复  引用  查看    
#4楼2005-08-03 16:40 | FantasySoft      
To Cavingdeep:我写那篇Post的本意也是想说一下动态类型语言跟静态类型语言的。个人觉得,常用的确实是动态类型语言和静态类型语言。但是动态语言这样的术语是不是也是指动态类型语言呢? 毕竟语言的动态还是体现在类型上吧。

BTW:您上一篇post中举的那个说明Type inference的例子容易给人造成误会。因为那个例子中在执行中抛出exception,正好体现了Boo的静态性。所以我就写了自己那篇post来跟您的遥相呼应了。呵呵~~~

To Ninputer:我觉得应该这样排: Boo->JScript->Python


  回复  引用    
#5楼2007-02-12 16:38 | 航天奇侠

动态和静态, 类型和无类型是两个方面, 他们组合起来就是:
动态类型, 动态无类型
静态类型, 静态无类型

类型和无类型的差别是, 无类型是基于2进制的观点. 而类型是基于语义的观点.一个2进制兼容的变量,类型未必相等. 因为类型具备函数的语义,而不是割裂的数据占位符.

基本上无类型的观点已经走到尽头,现在都是有类型的, 不管是动态还是静态.


  回复  引用    
#6楼2007-06-16 23:30 | sp1234[未注册用户]
动态结构 vs 动态类型

对于强类型语言来说,所有结构都是类型化的,因此所谓的动态结构的东西首先就是动态类型的。

  回复  引用  查看    
#7楼2008-07-31 09:07 | THIN      
各自说法不一样吧
动态的增删函数,不也是这些个函数所在的结构(即类型),可以动态的发生变化嘛,所以动态类型也可涵盖

好像有点强辞夺理了,呵呵





发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 206374




相关文章:

相关链接: