首页 > 代码库 > 静态与动态类型

静态与动态类型

静态类型语言中,变量具有类型,而且在编译期确定,具有某一类型的变量只能持有相同类型的数据。动态类型语言中,变量没有类型,只有数据有类型,变量可以持有任意类型的数据。例如,C是静态类型语言,一个int型变量只能作为int来处理。Python是动态语言,变量可以持有整数、字符串、列表、闭包等任何数据。

Java通常被认为是静态语言,然而准确来说并非如此。Java的变量有类型,但是变量可以持有子类型的数据,例如Animal变量可以持有Cat或者Dog,具体是什么类型,是由运行时的数据决定的。这显然是动态语言的特性。极端的情况,Java中Object类型的变量,可以持有任意数据,因为任意类型都是Object的子类。如果所有的变量和函数参数都声明为Object类型,恐怕Java就可以作为动态语言使用了。所以,Java并非纯粹的静态类型语言,它打破了两者的界限。

之所以这样做,是为了在静态语言中增加动态特性。静态语言严谨,容易检查和优化,但是灵活性不足,尤其是在大型软件、需求多变的情况下,一个很小的改变往往需要修改多处代码。动态语言灵活,但是由于缺少类型信息,前期不容易差错,也不容易优化。Java的这种融合是一个很好的做法,它给出了部分类型信息,可以用于编译期的检查和优化;而剩下的类型信息则推迟到执行期决定,提供了动态性。

推广到一般情况,静态语言和动态语言之间并不是非此即彼,而是一个过渡带。如果代码中没有给出变量的任何类型信息,那么这是纯粹的动态语言。这种情况下,可以认为所有的变量都是Object类型。如果代码中能够给出变量的一些类型信息(这些类型显然都是Object的派生类),那么语言就具有了静态性。代码中给出的类型越抽象,信息越少(抽象到极点就是Object);类型越具体,信息越多,编译器就能够对代码进行更详细的检查和更好的优化。如果代码中完全给出了变量的类型信息,这就是纯粹的静态语言。设想有一种语言,不局限于动态或者静态类型,而是能够根据代码中给出的类型的抽象或者具体程度,进行编译和执行。这样的语言应当能够更好的结合动态语言的灵活性和静态语言的严谨性,并且能够根据具体的代码适应性的在二者之间进行调整。

静态与动态类型