学Java,观GP

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 hustli 的 blog


    下笔之时,学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++差不多了吧:)

本文关键:GP
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top