2009年5月13日星期三

几种主流语言的泛型比较

几种主流语言的泛型比较
    第一种支持泛型的语言是ADA(一种Pascal语言的后代,差不多是军方的专用语言).而把泛型发扬光大的的是C++(主要是借助泛型实现的模板).
    作为一种提高代码重用的技术,泛型被越来越多的语言所支持.
    java,C#,Delphi都开始先后支持了泛型技术.我就在这里比较和评论一下C++,java,C#,Delphi几种泛型技术的特点.
   
                  实现时机 是否会生成参考类    效率       约束                     兼容性           泛型运行时信息            
    C++            编译时         会              高       基本算没有                  好               基本算没有
                                                     
    Java           编译时         不会            高       有                               好                 很弱
   
   
    C#             运行时         不会           一般     有                              一般                强
   
   
    Delphi         编译时         会              高       有                                好                  强
   
先从实现的时机是否生成参考类来说.
C++主要是通过源代码替换机制来实现泛型的.也就是说C++的泛型和宏差不多. 也就是说会为每个泛型实例生成参考类.
Java主要是通过编译器把泛型类全部变成object来实现的.而泛型类的方法是编译通过打包等技术进行类型转换的.例如List<T>实际上永远都是List<object>,不会生成新的参考类.
C#则主要是通过在虚拟机中加入泛型技术来达到对泛型的支持的.List<T>在虚拟机中只是List<T>.不会生成参考类. 只有在JIT编译的时候才会生成参考类的机器代码.当然T的类型不一样具体在虚拟机中的实现也不一样.当T是值类型的时候会生成参考类.但我们这里主要讨 论大部分情况,.NET中多数情况下用引用类型的时候多得多.
Delphi在编译角度讲则更像C++,是通过代码替换机制生成参考类来实现泛型的.但Delphi的类型限制更严格.没有指定类型的约束的时候是不允许使用特定的方法或者操作符等的.具体在后面的约束中讲.  


效率方面
C++的效率就高一些.编译期间生成原生代码效率和正常手写代码一样高.
java的效率也比较高.生成的代码和手写代码几乎也是一样的.但打包拆包的类型转换会影响一点效率.
C#编译速度就快一些.但执行的时候要JIT编译器来处理泛型.会在一定程度上影响执行效率.
Delphi和C++相似.效率也是很高的.  

约束
C++的模板约束能力比较差.相当于没有.主要是通过代码替换.替换后的代码能便通过就通过了.通不过就报编译错误.不过未来的C++0X标准加入了模板约束.
Java通过编译器保证泛型的约束.
C#通过运行时检查来保证约束.
Delphi通过编译器来保证泛型约束.

兼容性.
C++没有虚拟机,原生代码基本不存在兼容性问题.
java是通过编译器把所有类型都换成object.虚拟机都不用改,和旧的虚拟机完全兼容.兼容性非常好.
C#因为是要虚拟机支持的,所以再旧的.NET Frame虚拟机上不能执行新的泛型代码.
Delphi和C++类似,都是原生代码.所以基本不存在兼容问题.

泛型运行时信息.
C++本身运行时信息就弱的可怜.加之泛型利用代码替换的技术实现,所以基本不具有泛型技术的运行时信息.
Java虽然通过把所有的类型都替换成object实现了良好的兼容性,也有泛型的约束,但是却带来了无法获取运行时信息的难题.因为在Java虚拟机看来都是object,没有分别.
C#虽然通过虚拟机技术支持泛型带来兼容性不好的问题.但是运行时信息却及其强.
Delphi虽然实现技术和C++类似,因为有泛型约束,并且不是象java那样靠虚拟机执行无法区分object.所以Delphi的泛型对运行时信息一点都没有影响.



--
道不远人,人自远。

没有评论: