动态类型语言和静态类型语言
摘自:https://www.cnblogs.com/liuning8023/p/4286044.html
本文内容
- 动态类型语言(Dynamically Typed Language)
- 静态类型语言(Statically Typed Language)
- 比较
记得我刚毕业时在第一家公司,离职那天领导找我谈话,让我暂时别走,看 BOSS 能否给我涨点工资,我对领导很“大气”地说:“涨工资,也要走……Java 没什么难的,它跟 C# 很像,语言千差万别,但是它们背后都是一样的……”。说这话时,我是有不满成分在的,再就是上学时我学的是 Java,只是工作时用了 .NET 而已,而且,在我看来,基于一个很简单的道理:如果不看到事物的本质,那么多编程语言和技术,学得过来吗?
当编程一段时间后,你会发现,其实如果不考虑语法,每种语言的主要差异是在语言特性和设计初衷上,比如,函数式语言和面向对象语言,匿名方法,闭包,动态语言和静态语言……所以,对于编程语言,不要在意它们的”形“,而要关注它们的”意“,这样,无论如何语言,才能很快上手(也许,高智商语言 Lisp 除外~)~另外,我不太喜欢网上人们评价一个语言如何好,比如”一个功能,Java 用了几百行,Ruby 几行搞定“,这话的意思,不是说 Java 不好,而是说 Ruby 更好,把代码量当作评价一个语言好坏的论点,那将来只要对电脑喊一嗓子,它就能干活岂不是更好,所有言语都淘汰了,显然不能~
本文主要说明动态类型语言和静态类型语言。
类型检查所进行的检验处理以及实行类型的约束,可发生在编译时期(静态检查)或运行时期(动态检查)。静态类型检查是在编译器所进行语义分析中进行的。如果一个语言强制实行类型规则就称此处理为强类型(或静态类型),反之称为弱类型(或动态类型)。另外,严格意义上,强类型与静态类型不是一回事,同理,弱类型与动态类型。
强类型是指某门语言检查两种类型是否兼容,如果不兼容就抛出一个错误或强制类型转换,尽管这个说法并不是很严格。静态类型强迫在类型结构的基础上执行多态。判断是否是一只鸭子的依据,是其基因蓝图(静态),还是因其叫声和走路的姿态像一只鸭子(动态)。静态语言的好处在于编译器和工具等对你的代码更加了解,可以用于捕捉错误,突出显示代码以及便于重构代码。付出的代价是你不得不做更多的工作,并且会受到一些限制。
动态类型语言(Dynamically Typed Language)
所谓动态类型语言,就是类型的检查是在运行时才做。
类型对于变量,属性,方法以及方法的返回类型都是可有可无的,在给变量赋值时才决定它的类型, 之后,还可以赋值不同类型的值,即使是基本类型,比如 C# 装箱(boxing)和拆箱(unboxing),可以把值类型转换成引用类型,引用类型转换成值类型。当需要时,很多类型之间都会发生自动转换,可以把不同的基本类型添加到同一数组(collections)中。
动态类型在解释语言中极为普遍,如 JavaScript、Perl、Python、Ruby 等等。
静态类型语言(Statically Typed Language)
静态类型语言的类型检查是在运行前的编译阶段,比如 C#、Java 等都是静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要,所以,一般动态语言都会采用 dynamic typing。静态类型语言常出现于编译语言中,比如,Java,实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。
“多态性”是指,代码(尤其是函数和类)对各种类型的值能够动作,或是相同数据结构的不同实体能够控制不同类型的元素。在具有多态性的语言中,只需实现如列表或词典的数据结构一次,而不是对使用到它的元素的每一个类型都规划一次。基于这个原因,电脑学家也称使用了一定的多态性的方法为泛型程序设计。
推断类型(鸭子类型,Duck typing),这个技术之所以常被称作“鸭子类型”,是基于这句格言:“如果它摇摇摆摆的走法很像鸭子,而且它的嘎嘎叫声也像鸭子,那它就是一只鸭子!(If it waddles like a duck, and quacks like a duck, it's a duck!)”最初是由 Dave Thomas 在 Ruby 社区中提出的,推断类型用了这个论证法“如果它像什么,而且其它地方也像什么,那么它就是什么。”,比如,C++在迭代器和指针之间的双重性,两者以不同的机制实现并提供一个* 运算;C# 可以用 var 关键字声明变量,还有委托推断。
比较
静态类型语言的主要优点在于其结构非常规范,便于调试,方便类型安全;缺点是需要写更多的类型相关代码(如声明变量),不便阅读(特别是,当你看别人代码时,会连变量定义也看吗?想必不会,看结构,看方法的含义想必才是本质)。
动态类型语言的优点在于方便阅读,不需要写非常多的类型相关代码;缺点自然是不便调试,命名不规范时会造成读不懂,不利于理解等。
在强类型、静态类型语言的支持者,与动态类型、自由形式的支持者之间,经常发生争执。前者主张,在编译的时候就可以较早发现错误,而且还可增进运行时期的性能。后者主张,使用更加动态的类型系統,分析代码更为简单,减少出错机会,才能更加轻松快速的编写程序。