Java 最吸引人之处,在于跨平台。而.NET 可以看作 Java 的改良版,囊括 Java 大部分的优点,所以当
然也具有跨平台的潜力。但是认真追究起来,Java 和.NET 的程序其实也不算真正跨平台,因为 Java
VM(虚拟机器)和.NET VM 本身就是一个平台,而 Java 程序只能在 Java VM 上执行,.NET 程序只
能在.NET VM 上执行,至于 VM
的底下是什么操作系统,则无关紧要。
更清楚的说,Java 和.NET
“
”
的跨平台,指的是跨 操作系统 平台。所以,Java VM 和.NET VM 能
移植到什么 OS 平台,Java 程序和.NET 程序就能跨到什么平台。从 1.0 版至今,Java 历经了近多年的
发展,Java 已经无所不在了。除了在服务器上已经取得压倒性的胜利之外,在桌面系统的安装比例也
已经超过 90%(2002 年的数据),且随着最近 Dell 等大厂和 Sun 签约在 PC 上预先安装 Java VM,此
数据未来会更高。
但事实上,Java
“
”
跨平台的开放程度并不若我们所想象的美好,主要的原因在于 四不一没有 :
版本不一致:许多操作系统上虽然已经具备 Java VM,但是版本并未和最新版的 Java VM 同步,
甚至不同版本差距颇大者。举例来说,早期 Mac OS 在追随 Java 的脚步上,步伐很慢,往往差了一个
版本,例如在 Java 1.3 推出一、二年后,Mac OS 仍只有 1.2 版的 Java VM 可用(但是现在 Mac OSX 已
经追上 Java 的版本推进)。另外,Java VM 安装比例固然已经超过 90%,但是其中应该有许多仍是使
用 IE 浏览器内建的 Microsoft VM(只支持到 Java 1.1.4 API),不能执行 1.2 以后的 Java 2 程序。所幸
的是,版本落差这个问题近来已经有显著的改善。
特殊动态链接库不存在:对于那些非 J2SE 标准的动态链接库(例如 Java 3D),往往只局限在
Window、Solaris、Linux
三个操作系统。关于这一点,我不认为未来几年内会有所改善。
标准不够开放:Sun 曾经把 Java 提交给 ISO 来制订开放的标准,但后来又因为舍不得而撤回,
改成立 JCP 委员会为 Java 的标准制订单位。这也使得 Java 在开放程度上并未如宣传上所说的那么好。
(这一方面,.NET 还比 Java 好一些,至少核心部分已经是 ECMA
的标准)。
厂商不服气:这可能会造成标准的分裂。早期微软在 Visual J++产品中就有一些可能造成 Java
分裂的举动出现。近年来关于 IBM 和 JBoss 等公司,在 J2EE 的产品上,和 Sun 也是屡次发生冲突。甚
至之前传出某公司有利用市场的力量,另立标准的可能。例如 Eclipse 的 SWT 就是一个和 Java 的
AWT/Swing 互相竞争的 API
。
技术人员没有跟上新技术:过去这八年,Java 修修补补,废弃了一些旧的 API 和程序设计思维,
增加了许多新东西。如果开发人员未能随时补充新知识,仍用旧的方法开发系统,就会横生困扰。这
其实是很严重的问题。.NET
在跨平台问题也不少: .NET 某些 API 在设计时,并没有考虑到跨平台的
需求,例如 Windows Forms 就是如此。这会使得移植.NET VM 到不同操作系统时,难度会比较高 。
Mono(Linux 上的.NET VM)曾想移植 Windows Forms 到 Linux 上,但是后来放弃了,改成在 Wine
上面执行 Windows Forms(当然效率会因此变差了)。[但是再后来由于 System.Drawing 实现的比较好,
因而又基于 System.Drawing 来实现底层的 SWF,Mono 1.2 的发布就是等着 SWF1.0 的发布。当然效率
肯定比不上 Windows 下的 SWF。不过 Mono 是推举使用 GTK#的] 只有核心部分是 ECMA 的标准,
重要的 API 例如 ASP.NET,和 ADO.NET 都不是标准,而是微软私有的财产,可能涉及法律问题 。
Mono 另外推出 Gtk#这套 GUI 的 API(将 Gtk+
包装起来)。
技术人员没有跟上新技术: .NET 经过了 5 年的发展,最新到来的 2.0 版本和 1.x 版本相比较,