Java真的跨平台吗?
——有感于《JAVA陷阱》
JAVA真的跨平台吗?我以前一直都认为是这样的,呵呵,对着满大街的各种Java书在说到Java的优点时几乎都会提到这一点,甚至是引以为傲的——这似乎成了Java应对别人指责其运行不够效率时的一种高姿态的无声的反驳,因为在IT大牛们百家争鸣,各拥一方时,Java能在中间得到他们大多数的支持,以及对Internet Web方面开发的天然的接合力,其跨平台成了多少人摆脱这些巨人们阴影的有效武器。sun成了英雄,一时风光无限!然而,事实并非如此——sun也是在追求成为巨人路上的一员。。。
我们来看看JAVA所谓的跨平台(Write once,Run everywhere)是如何实现的
首先编辑Java源文件,然后把.Java源文件编译成.class文件,class文件字节码文件,它是一种中间码,的确与平台无关,然而却也不能就此进行独立运行。它需要Java解释器进行解释后才执行。而这一切都要靠传说中的JVM——它就是Java实现所谓跨平台的终极武器。
JVM的目标是提供一个抽象的计算机模型,相当于你的机子上同时有了两套系统,现实的操作系统和JVM,你设计的程序先到JVM上运行,则说明你的程序符合JVM的描述规格(深深的打下Java的烙印)。同时JVM也就实现了为Java字节码定义了一种独立于具体平台的规格描述,JVM是Java平台独立性的基础。
我们把Java源程序想象成C/C++源程序,Java源程序编译后的字节码(.class文件)就相当于C/C++编译后的80x86上的机器码(Windows 中的.exe文件),而JVM就相当于80x86上的操作系统,而Java解释器就相当于80x86的CPU,在80x86上运行的程序是机器码,而在JVM上运行的就是class字节码。Java解释器相当于运行Java字节码的“CPU”,但是这个CPU不是真实物理意思上的CPU,而是通过软件来实现的"CPU"功能的。JVM本身就是某特定平台下的一个应用软件而矣,用它来运行打上Java烙印的字节码,这是Java跨平台的根本。
也就是说,并不是所有的平台都能实现都能"被"Java跨平台,只有在能够实现Java编译器功能的平台下才能运行Java文件。可以设想,如果生成了class文件,却没有JVM(或者说某个平台不支持JVM),Java编译好的的程序也是不能执行的。
关键的问题就来了,Java贡献的开源项目众多,所涉及到的范围也相当广泛,然而,谁也别想打JVM的主意。JVM的控制权牢牢的掌握在SUN,现在的Oracle的手中,JVM是不会被Oracle开放的。正如此,才有了开源精神领袖Richard的"自由但带着枷锁——java陷阱"。
如果你在Java和JVM上开发软件,你就被困在了由一个公司——Oracle控制的单一的一个平台上
Oracle努力维持着对这个平台的控制权,拒绝删除在TCK里的使用条款,有效的阻止了Apache Harmony项目一直不能正式发布。对Google的诉讼证明了Oracle过度的痴迷于对这个平台的掌控。我们运用Java所做的一切都要看Oracle这个贪婪的巨头的脸色。
它让Java生,则Java生,它让Java死,则Java死。