提到Java,你会想到的第一件事是什么? "跨平台啊!"没错,Java最大的魅力,就在于这个程序语言设计之初,就替设计师把不同平台、不同操作系统的问题考虑到了。遥想以前用C/C++写的程序,一换平台就要重新编译一次,用VB写的程序更是只能在Windows平台上跑,想拿到Unix/Linux环境下执行,"门都没有!重写吧!"相较起来,Java程序设计师就幸福得多了,程序写完一次,编译一次,拿到各个平台上,可都跑得吓吓叫呢!为什么Java能享有这种特权呢?这就完全不能不提到Java的特殊设计--Java Virtual Machine(JVM)。我们这一期就跳脱程序设计的理论,来谈谈JVM。Java的心脏—JVM 虽然我们通常所说的Java,都是指Java程序语言(Java Language)居多。然而,事实上一个Java程序能顺畅运作的有三大要素是缺一不可的: Java Virtual Machine、Java API以及Java Class Files,其中的Java Virtual Machine更是让Java能做到跨平台(Platform Independence)的要角,因此说它是Java的心脏也不为过。
说了半天,JVM到底是什么?一般的程序语言,程序设计师写出来的称为源代码(Source Code),要编译(Compile)成机器码(Machine Code)才能执行。但Java的情况不同,Source Code编译过的结果是Byte Code,机器或是OS是看不懂的,要靠JVM在执行时解译为Machine Code,才能执行。也就是说,对一般程序而言,程序本身直接就接触到OS或硬件资源层级,因此每遇到一种平台,设计师就必须针对不同的平台做出适当的设计,但Java则不然,程序本身面对的是JVM,只要JVM看得懂你写的程序,它就能顺利执行,至于面对不同平台的问题,就交给JVM的开发者去伤脑筋啦! 因为Java的设计就是要求程序只开发一次,因此无论是那一个平台上的JVM,在Java程序看起来都应长得完全一样,就好像是一台虚拟的,只能执行Java的Byte Code的机器一样,但这是一个软件模拟成的机器,这就是Virtual Machine的名称由来。谈到这儿,其实说Java是各个平台都能跑是有一点儿膨风的,虽然理论上是如此没错,那也要看那个平台上有没有对应的JVM啰!所幸,在世界级大厂的强力背书和Java社群的力量下,大到IBM的Mainframe,小到掌上的PalmOS,几乎是处处可见对应不同平台的JVM的踪影。
不过对于大多数用惯Windows作业平台的人而言,大概很少去考虑除了微软之外的情况吧? 天下没有白吃的午餐当然Java的设计和架构上,除了跨平台之外,还有很多一开始就优于其他程序语言之处,比如较完整的OO架构,对于网络架构比较完善的支援等,不过那些已超出本文的讨论范围。但是光是能跨平台这一点,就足以让巨人微软恨得牙痒痒的,除了把对Java的支援从Windows XP中删除外,还大张旗鼓地高举.NET的旗帜来和Java打对台,以免"Windows化"的霸业受阻。但是为什么那么多优点的Java至今还没有风行草偃,把微软逼入绝境呢?很遗憾的,天下没有白吃的午餐。Java在JVM中做到了如此多的优势(Platform Independence, Network-Oriented...),事实上在某种层次上,牺牲了执行效能,例如和C/C++编译的程序相比。当然,JVM的技术也不断在进步,同样的程序在Java 1和Java 2的VM上跑出来可能有截然不同的结果。我们可以说,JVM的技术目前或许还不能做到让Java在同时具有那么多优点下,还能比C/C++更快,但是它不会永远慢。目前执行效能的落后,只能说是在众多优点的大我中,不得不牺牲的小我吧! 另外一个值得一提的是,Java为了做到跨平台,在JVM的设计上当然希望做到让每一个不同的Java程序在不同平台上都能调用相同的Java API,然而当遇上平台相关的问题时,这个想法往往无法尽如人意。比如说,存取系统资源时,Unix/Linux和Windows对于硬碟路径规画就大不相同--Unix/Linux可没有C:、D:这一套。更别提Windows的"服务"和Unix/Linux的"背景执行"的差异性。这也造成真正想要实作跨平台的程序设计师的困扰,通常只能先就各平台通用的部份先写作(套句数学用语,取最大公因数),再补齐所有想要支援的平台的部份(再套句数学用语,取最小公倍数)。陈意什高的Java,也有在现实中无法尽善尽美之处。但既使如此,比起针对不同平台都必须重新写作或是根本无法转换平台的语言,Java的程序维护者还是轻松了许多。好的语言,但"还"不是完美的语言理想和现实总是有差距的,也因为如此,人类才有努力的空间嘛!前面所说Java在设计上利用JVM这个架构,完成了跨平台等等优质的设计,但面对到现实生活中五花八门的环境,仍有它不得不妥协之处。比如Sun在发表JRE、JDK时,总是最先发表Windows版本,比自家的Solaris版本还快,没法子,用的人数实在是差太多了。还有在各家平台上百家争鸣的JVM环境,使得Sun不得不宣布官方版本只维护Windows/Solaris/Linux三套JVM,至于其他的什么HP-UX、IBM-AIX、FreeBSD,就交给大家各显神通啰。所以现在其实除了Sun免费提供以上三个平台的JVM外,另外有很多要钱的、不要钱的,支援不同的平台上的JVM在流传和开发着。别的不说,"巷子内"的人都知道,IBM发表的JRE/JDK在Linux上的效能比起Sun官方版要好上许多;其他也有许多不同的群组正在努力开发Java的原生码编辑器以解决效能问题。相信在众家大厂、小厂的努力之下,"路线正确"的Java一定能继续朝向"完美"之路迈进的。后语本期"离题"地提到了JVM的一些现况和问题。事实上,除了必须要定义跨各个平台的程序的设计师之外,一般写作者很少必须面对不同的JVM的问题。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
