谈谈Java (1997.10.30)
Java的历史就不在这里重复了,总之Web和Web浏览器的出现和流行使Java从一个没有用武之地的丑小鸭突然间就变成了信息时代的宠儿。一夜之间,Java仿佛成了网络世界的救世主。
在那些宣传得沸沸扬扬的特性里,可移植性无疑是最有诱惑力的一点,也是我最感兴趣的一点。write once, run anywhere,这是一个多么激动人心的目标。至于它和C++语法相近,但更加简洁,易于学习等等,我并不以为然。因为我想最易于学习的东西也是需要一个学习周期的,不熟悉C++语法的人从中得不到好处,而对于熟悉C++的人来说,假使这种语言没有什么新的特点的话,又何必去学习呢?再说,语言只是一种工具,好的工具只是使产生好的程序更加容易,而不是使产生好的程序成为必然,更重要的因素是程序的设计者和编写者。是人,而不是语言造就一个优秀的程序。我见过有些人用BASIC写的程序比另一些人用C写的程序结构化更好,可读性更佳。
记得在大学里刚刚开始学习C语言的时候,书上说C的一个最大的优点就是移植性好。 Ken Tompson和Dennis M. Richie这两个UNIX和C的鼻祖用C重写了UNIX,这才造就了UNIX的一世英名。可是这种移植性并没有发展到一种激动人心的地步。因为只有标准的ANSI C才能够实现这样的可移植性,可是随着软硬件技术的发展,越来越流行的GUI界面,人机交互,以及各种外设,完全超出了ANSI C所表达的范围。越来越多的功能成为操作系统的标准部分,例如显卡驱动和打印机驱动。你用不用?用,不同的操作系统并不是都实现了这些功能,即使实现了也不是以相同的方式。不用,你的程序还能够干些什么?
当Windows平台逐渐占据主导地位的时候,又一种可移植性被提了出来,叫做API级兼容。想法也很好,不管在什么硬件平台上,系统的功能通过相同的API调用来提供,底层实现的差异通过相同的API调用来掩盖。只要程序使用这些API,那么不管使用S3, Trident显卡,或是HP, EPSON, Brother打印机,应用程序可以以相同的方式自由使用操作系统丰富的底层功能了,发展到NT,CPU的差异也逐渐被掩盖,不管在Intel, Alpha, PowerPC, MIPS上API都是一样的。因此你不再需要编写不同的代码来区分不同的CPU,适应不同的显示模式,来使用不同的打印机。92年底,厌倦了为不同打印机编写打印代码的我刚刚接触Windows,为了这种兼容性欣喜万分。但过了几年,我开始考虑将公司的一个Windows软件移植到Unix上时,这才关心这样一个问题:这时候该怎么办?
Java建立在虚拟机的基础上,从源代码兼容和API兼容上又向前走了一步,实际上已经是一种可执行代码的兼容,尽管这种代码是解释执行的。可是现在的我已经不那么容易欣喜了。Java的这种的可移植性只是一种承诺,可是承诺和现实可是差得很大的两回事。多运行一些Java Applet, 你就会发现相同的Applet在不同的
浏览器上有时候运行效果并不一样,而且我也曾经被Java的汉字支持和处理的问题搞得焦头烂额,狼狈不堪。这很容易理解,各个厂商都有自己不同的Java虚拟机的设计,谁能保证这些设计在不同厂商不同平台之上有相同的表现?谁又能保证自己的虚拟机中没有几个BUG?特别是在现在Java还不算十分成熟,在这上面还没有积累足够的经验的时候?
而且虚拟机的概念也使性能很成问题。对于小的Java applet虽然就已经有人抱怨了,但我觉得问题还不算严重,至少还能忍受。对于那些application来说呢?我只用过两个用Java编写的应用程序,浏览器HotJava和编Java用的集成环境Java Workshop,速度慢得我这样自以为还是很有耐心的人也忍受不了。Corel最近也放弃了将它所有应用程序,包括著名的CorelDraw和WordPerfect移植到Java的计划。Java这杯香喷喷的热咖啡,太急着喝也会烫了嘴的。
虽然JIT(Just-In-Time, 即时编译器)得到了发展,可以大大加快速度,但说到底,Java虚拟机的规范使得很多独特的硬件功能无法使用,对于这点一般的厂商可没办法,只得通过改变规范来实现。说起规范,Sun最近要控告Microsoft,是说Microsoft在它的IE中实现的Java不是100% Pure Java. Microsoft回击说它的PURE是指Perfectly compatible, Ubiquitous, Rich set of class library, Extensible(完美的兼容性,广泛的可用性,丰富的类库,可扩展性)。不谈PURE的定义问题和Microsoft的野心和企图,至少Microsoft这个目标是很不错的,而且它也是朝着这样的目标发展的。事实上Microsoft的Java虚拟机是兼容性最好的,它的Java类库AFC(Application Foundation Classes)也做得很漂亮,它提供了Java和ActiveX相互作用的方法。虽说我也很不满Microsoft在计算机界一手遮天,可是Java的标准是被SUN一家所控制,这样的做法,和Microsoft把持着Windows操作系统有什么区别呢?标准是必须的,但不应有一家所把握,因为这样极大地限制着创造力。王小波在他的杂文里总说世界的美好在于参差多态,我心里也向往着这种美好。这样的美好源于竞争,源于市场驱动,源于竞争中创造力能被极大地激发出来,技术能得到更大的发展,而我们普通用户,能得到更大的利益。
有人说Java是网络世界的救世主,仿佛Java一出,天下太平,我是不信的。还记得Ada语言刚出台的时候被政府规定为标准语言,可现在用Ada的有多少?C语言良好的可移植性使其迅速成为了各种平台上的通用语言,但并没有最终解决跨平台编程的问题。C++语言以它面向对象的概念和类的方式试图解决软件重用的问题,但这个问题仍旧深深困扰着软件工业界,因此现在又有了用软组件(Software Component)来解决重用问题的概念。所以不要把Java看成是解决一切问题的灵丹妙药,还是好好发展,不要过于自信地预言未来吧。
说了这么多Java的“坏话”,但我心里仍旧认为它是个优秀的编程语言,Java毕竟是这个信息时代的伟大的产物,能解决许多问题。虽然同样还存在许多问题,但有了问题才有解决的目标。有了移植性的问题才有了C语言,才有了API兼容的概念,才有了Java虚拟机。有了性能问题,才有了JIT。有了软件重用的问题,才有了面向对象,才有了软组件。我只是想说:将来必定还有更伟大的产物被创造出来。人的创造力是无穷的,因此技术的发展也是没有终结的。总有人会有神奇的灵感,让这世界更加美丽的。