下笔之时,学Java已经有5天了。用惯了C++,现在看Java,有一种故人之感。Java和
C++有很多相同的地方,也有一些不同的地方。其实,仔细想一下,这些区别并不能够说明那个更好,主要是两种语言的设计思路不同,实现的目标不同:C++侧重效率,Java注重安全。他们的差异也就由此展开,当然,我写这篇文章并不是为了说明他们的不同,只不过有感于一件事,记得好像Java声称可以支持GP(也许是下一个版本,也许已经实现了,只不过我刚开始学,也没看到相关的书籍,不太清楚现在的情况),有点疑惑:STL之父曾经为了实现STL,曾经在Java里面进行了试验,结果以失败告终,不知道这次GP引入Java是采用的什么技术。
用过STL的人都知道,这是C++里面实现GP的一个典型范例。那么究竟什么才是GP呢?GP的实现由那些技术支持呢?
首先我们说Generic 一般这么定义:Abstract of Genreic Concepts。GP是Generic
Programming的缩写,意思是:Abstract Of Generic Concepts And The Subsequent Ins
tantiation,也有人说GP就是Programming With Concepts。从这些定义我们可以看出,在GP里面的Concept居于一个非常重要的地位,那么什么是Concept呢?按照《范型编程与STL》一书的定义就是:一组“描述某个型别”的条件。你可以把Concept想象成一组型别条件,也可以想象成型别的集合,甚至可以想象成一组合法的程序,无论如何他们在本质上都是相通的。如果我们按照正式规格系统来定义Concept,也许Concept就是:a set of many-sorted algebas,这是严格的以数学逻辑来定义的。个人认为GP就是一种思想,思想的核心就是通过静态的算法和动态的操作,以紧密的方式,低耦合的特性,来实现程序设计中的类型无关性。
在C++中GP的实现是通过模板+多继承来实现的,当然更基础的就是运算符重载。C++中模板通过编译期间的时间损失来获取运行效率的提高,同时通过编译器进行参数传递的类型检测,具有较高的安全性。这也就是为什么STL之父选择C++来实现自己的STL的一个很重要的地方,毕竟语言直接支持可以是实现更加方便,也更有效率。
当然,并不是说GP只能在C++里面实现,GP是一种思想,应该独立于任何语言的,Java不是也宣称要加入GP么?不过C++里面引入GP的确本身具有很大的优势,语言本身的特性(模板+多继承)使得C++具有得天独厚的优势:在无损效率的同时具有很高的安全性。
那么Java通过什么来支持GP呢?我有点疑惑。Java里面没有模板,也没有多继承,当然Java里面的单继承也许更加有优势,另外Java里面有很好的RTTI机制(至少比C++里面的RTTI功能强多了,也许是C++里面的实在太弱了)。不过也有一些问题需要考虑,例如Java里面的基本类型不是对象,单根特性对他们没有什么用处,这就比较让人头疼。另外单根+RTTI本身不是与法本身实现的,是通过OOP的理论+类库体系来实现的,这看起来也许更加的直观,但是RTTI运行期的特性毫无疑问会是一个巨大的障碍,如果说Java不在乎效率,更侧重安全的话,这一点似乎也无关痛痒,但是RTTI并没有像C++那样有编译器进行类型检查,相反他绕过了类型检查机制,欺骗了编译器,安全性问题浮现出来,这个安全的保证非常不情愿的回到了程序员的手里。这是一个让人非常郁闷的地方。
也许java有自己的一套方法,那让我们拭目以待吧。
注:现在据说Java要引入模版,那就和C++差不多了吧:)