高质量程序设计指南:C++/C语言
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.5 Java阵营与Microsoft的较量

1995年5月23日,Sun公司的John Gage和Netscape公司执行副总裁Marc Andressen联合推出了Java技术。当时Netscape的浏览器是进入Internet世界的最主要工具,Netscape大有“微软终结者”的姿态。

Java最初只是Sun公司一个秘密项目的编程工具。Java的开发者们当初甚至没有把它发展成一种编程语言的“野心”,更不用说后来的Java平台了。那是1991年,那个秘密项目叫做“Green Project”,项目人数最多的时候也只有13人。Sun公司启动这个秘密项目的动机是:他们认为计算模式将转向基于消费类设备的分布式计算。

“Green Project”小组开发了一个叫做StarSeven的数字设备。当时“Green Project”成员所在办公室的电话系统将任何电话切过来的操作方式是*7。StarSeven是一个不同数字设备之间的代理(Agent)。StarSeven可以控制多种不同平台的设备,这得益于Gosling发明的一种叫做“OAK”的跨平台编程工具,这个“OAK”就是后来大名鼎鼎的Java。OAK的名字来自于Gosling办公室窗外的一棵橡树。这些人无意之中发明了可以改变计算机计算模式的技术。

Internet的迅速普及拉开了Java时代的帷幕……

和绝大多数公司一样,Microsoft也取得了Java的开发许可证。但在随后推出的Visual J++中,Microsoft提供了依赖于Windows平台的Java实现,这与Sun推崇的“一次编译,到处运行”的口号大相径庭。于是Sun发起了一场“100% Pure Java”的宣传运动,其声势浩大,几乎成为了一种文化。

Sun还对Microsoft提出诉讼,要求赔偿35亿美金。Microsoft最后被判决赔偿2000万美金。Microsoft咽不下这口气,随之做出了Windows XP系统不再支持Java的决定。Sun又针对Microsoft的这个决定打起了官司,指责Microsoft利用垄断的力量阻碍Java的发展。

正如评论所说,Sun和Microsoft的这场官司,真正受害的是广大开发者。

现在,Java阵营的最新平台是J2EE,Microsoft则推出.NET与之对抗。最有名的一次交锋是“Pet Store”(宠物商店)性能竞赛。

Pet Store是Sun公司推出的一个范例应用程序,用来帮助人们在J2EE平台上开发应用软件。完整的Pet Store提供了一个基于浏览器的B2C购物环境(当然,你只能买宠物)、一个基于XML的网站管理工具和一个基于Web Service的B2B交易系统。

除了展示J2EE的功能之外,它还展现了Java平台的其他功能。看看图2-2,注意到不同的国旗了吗?这代表了Pet Store的不同语言的版本。在Java中实现多语言是一件比较容易的事。

Pet Store虽小,但是五脏俱全,常用的搜索、账号和购物车功能都实现了。许多J2EE应用服务器的供应商都在其产品中提供了Pet Store的相应实现。因此在J2EE社区里,Pet Store被奉为圣典。Pet Store对应于J2EE的版本,现在已经推出了1.3版,增加了许多新功能,其无线版本也发布了,这个好东西是免费的。

Pet Store是一个如此有名的范例,以至于Microsoft在推出.NET平台时,专门实现了一个Pet Store的.NET版本,并且宣称这个版本比Sun的快了28倍。这在当时激起了轩然大波,无数人都在讨论这个话题。

图2-2 Pet Store的界面

但是,很快证明这只不过是Microsoft的营销手段而已。Microsoft大概是高兴得昏了头,居然公开了源代码。于是真相大白了,Microsoft采用了一种与Sun完全不同的体系结构。Pet Store的Sun版本是为了揭示J2EE平台的各种用法,因此采用了一种复杂的、极具扩展性的体系结构,涵盖了J2EE的方方面面。而Microsoft的Pet Store完全出于宣传的考虑,采用了一种极简单的结构:在ASP页面中直接调用存储过程,速度自然快了很多。数年前Microsoft在比较Delphi与Visual Basic时也采用了同样的手段,他们在Delphi示例程序中使用了一个远程数据库调用,而在VB的代码中却使用了本地调用。然后宣传Visual Basic的性能比Delphi的优越。

最具讽刺意义的是,Oracle不久也公开宣称,它们实现了一个J2EE平台的Pet Store,比Microsoft的又快了3倍,不知道Oracle用了什么伎俩,事情发展到了这一步,变成了一出闹剧。

.NET和Java渊源还是很深的。微软公司挖来Borland的天才Anders Hejlsberg后,他推出的Windows平台下的Java虚拟机的效率甚至超过了C语言程序的效率。由于Sun的起诉,微软在推出Visual J++后直接把它转移到了.NET上,甚至超越了语言。如果Sun不打官司,也许我们现在只学一门Java语言就够了。本质上Java和.NET都是虚拟运行时平台上的开发语言。虽然.NET现在好像只支持Windows,但我想这应该只是微软的市场策略而已——为了巩固微软Windows的市场,不支持在其他操作系统上运行,现在能够影响全世界开发人员的,微软舍我其谁?!

抛开大公司之间的竞争话题不提,平心静气地看Microsoft的.NET和Sun的J2EE,尽管两者方法不同,但都具备许多优秀的特征,两者难分优劣。

.NET和J2EE的可移植性都非常好。虽然.NET的核心只能工作在Windows环境下,但从理论上讲可以支持多种语言开发,只要这些语言的子集已经定义好,并为它们建立了IL(Intermediate Language)编译器。对于J2EE来说,只要遵循Java VM规则和一组平台需要的服务,就可以在任何平台上工作。由于J2EE平台的所有规范都已经向公众公布,许多供应商可以提供J2EE的兼容产品和开发环境。

.NET并不是一种精巧的标志,而是意味着Microsoft产品战略的重大转移。Java清除了平台的障碍,但是为了用J2EE来做开发,用户必须在Java环境下工作。而.NET是想让用户使用自己喜欢的语言来建造.NET应用软件,这个设想是十分美妙的。

对于Windows环境下的软件开发商而言,.NET是一个好的架构,用户可以将许多事情交给.NET去做。例如,ASP.NET比ASP好,ADO.NET比ADO和DCOM出色,C#比C/C++更好用。不过,虽然.NET平台描绘了美好的蓝图,但其设想要全部成为现实还有较长的路要走。例如,IL公共语言的运行,目前还有某些明显的不足。想要把每一种语言和元件在运行时集成起来,必须定义这种语言的子集或超集,并清晰地映射到IL上,此外必须定义结构,以便提供IL需要的元数据。还有,必须开发适用于两种编译语言结构的编译器并集成到IL部件的代码中,同时还要生成对现有IL元件的语言专用接口。

由于历史原因,若想在Java语言中使用其他语言,必须开发非Java语言到Java VM的众多转换器。因此,在Java环境中编写代码,就必须承受额外的翻译工作。如果目标环境是J2EE,程序员通常会选择Java来编程。如果目标环境是.NET,那么程序员将会选择C#……