今天参与了java与手机的一个论题。有人问为什么有些Java游戏只是针对某种牌号的手机,其他牌号的不能用。Java不是号称一次编写,到处运行吗?(Write once, run everywhere.)。马上有其他网友回应,有的说,Java的通用性只是一个神话;另有网友更是讽刺,说Java是Write once, Debug everywhere!

其实关于Java的这个问题,我早就有一些想法。Java为了实现通用运行,而采取了脱离具体硬件,虚拟一个标准的Java虚拟机的运行方式。这个方式的确很新颖,能够帮助创建出通用运行的java程序。但同时,这种方式也有其致命伤。
首先,虚拟机的方式大大减慢了程序运行的速度。在一个典型的硬件平台上,以本机方式运行的代码,要比在此硬件上的Java虚拟机中运行的Java字节码快得多,其差别是以数量级来计算的。这种速度差别往往是致命的,在实际应用中是不得不考虑的。
其次,为了达到通用,Java虚拟机就不得不抽象出各种各样计算机硬件和软件平台的共同点来设计。现在的计算机系统是非常多样的,比如PC兼容机、Mac苹果机,其他不同公司如hp,sgi,sun,ibm的小型机、大型机,大量的嵌入式系统、手持式系统等,他们之间硬件、操作系统等的差别非常巨大,要兼顾这么多的系统,非常困难。纯粹的Java只能取他们特性的交集。就算妥协一下,将这些系统分为服务器、工作站类型的,嵌入式类型的,手持/移动类型的,他们之间的差别也很大。每种系统都有其独特的地方,而通用设计的话,这些优秀的特性不得不被排除。
最后的结果就是一个能符合大多数或全部系统的Java虚拟机环境,但是功能却被大大削弱了。
举个例子,苹果机上的鼠标只有一个按键。而现在pc机上的鼠标至少都有2个建,其中鼠标右键的使用还非常频繁,很多软件中的特定功能只能用右键才能实现。但现在呢,如果要做一个完全兼容于苹果机和pc机的java程序,那么就只能考虑一个鼠标键的情况,这无异会让pc机用户很不习惯,同时也浪费了硬件资源。
可见,要做到通用性,性能(速度)和功能的损失是多么巨大。
以前我也曾跟人争论过类似问题。我说Windows下Java功能很有限,不能这样不能那样,于是就有Java的拥趸出来,贴上一堆代码,说在Java中是可以访问Windows对象的,可以调用WinAPI的,等等。
其实我不否认他们是Java高手,他们的代码至少我还写不出。可是,我反问他们,使用这样的Java代码,有什么可夸耀的?Java当初推出的宗旨,就是要通用,要到处运行,而你们这样的Java代码,注定了只能在某种特定的硬件平台和操作系统上运行(比如pc上的windows),这样的话,用Java还有什么意思?我用vc甚至vb不一样吗?而且速度快多了。

我看,真正通用的Java程序是有的,但都属于那些小儿科的、玩具性质的小软件。而现在真正能干点活儿的、大型的Java编制的软件系统,无不是紧密依附于一定的硬件和软件平台。因为,这样的系统必须要发挥硬件系统的速度和功能,而通用的、理想化的java虚拟机并不能提供。所以,特定硬件软件的厂商肯定会在标准的Java基础之上,附加提供该平台专用的开发工具包,让Java程序可以运行更快,更能发挥本系统的功能。但同时,这样编写的Java软件也就丧失了通用性,离开这样的平台,换个其他的Java环境,就无法运行了。还是得修改,得调试。说不定改动还相当大。

我很早(上个世纪?)就认为,Java也不过是个普通的程序语言,而且有其相当的特色,在很多场合还是很有用的,将长期存在,发挥作用。但是,Java绝不会如某些厂商宣传或一些狂热爱好者所理想的,将取代、消灭其他语言,一统天下,成为独霸天下的主流语言。这是不可能的。

发表评论

*