Java的平台独立性

 

一、为什么要平台独立
        Java是一门为了网络环境而开发的语言,这要求Java程序的二进制形式可以在多种不同的平台上无差别的执行。
在开发者这一边,是用Java开发就可以获得平台独立性,这使自己的软件多了很多潜在的客户。
二、Java体系对Java平台独立性的支持
        1、Java平台(The Java Platform)

 

        Java体系结构通过很多种方法支持Java的平台独立性,其中Java平台的支持是最有力的。Java平台是Java程序和本地操作系统之间的隔离带。 Java程序编译为可以在Java虚拟机上执行的字节码,有Java虚拟机执行程序,并且通过Java API访问本地资源。所以Java程序的执行不用关心在那里执行程序,只要那种平台上有Java品台就可以。

        2、Java语言

        Java语言中直接定义了所有原始类型(primitive types)的长度和行为。而C++中这些都要依赖于编译程序的平台。

        3、Class文件

        严格定义文件格式,字节码(big-endian)不依赖于任何平台。

        4、可伸缩性

        对于系统独立性而言,Java的可伸缩性也功不可没。Java平台能够在很多平台上实现,无论是嵌入式设备还是PC。
        为了实现这种目标,Java平台必须能够紧凑的实现在那种嵌入式设备上,比如那些只有很小可寻址内存,没有硬盘,没有显示设备的机器环境。为此,Java 平台有一些针对特殊嵌入式设备的实现,比如:the Java Embedded Platform、the Java Personal Platform、the Java Card Platform。在这种环境下往往只现实Java平台的子集。
        但是这种实现并不限制在个人电脑(personal computers)、工作站(workstations)、大型主机(mainframes)上Java平台的实现。

三、影响平台独立的因素
        1、Java平台的配置

 

        平台独立最基本的要求就是目标平台没有已经实现的Java平台。不过庆幸的是Java平台可以通过网络浏览器来配置、启动

        2、Java平台的不同版本和不同版本号(The Java Platform Version and Edition)

 

 

        Java核心API(Java Core API),所有Java平台必须支持的Java API被称为Java 核心API,实现了Java核心API的Java平台被称为Java核心平台(Java Core Platform),前边提到的Java的其他三种版本:the Embedded, Personal, and Card Platforms只提供Java核心API的部分实现。不是必须实现的Java API被称为Java扩展API(Java Standard Extension API),比如通信、商业支持、多媒体、3D。使用了扩展API的程序不能够在只实现了Java核心API的核心平台上运行。
        同一Java平台的各个版本之间也没有实现兼容,为了更好得提供服务,Java平台的发展过程中,不停的会有一些API被删除和添加,这导致Java的各个平台之间不能够兼容。

        3、本地方法

 

 

        除了Java平台的配置和不同Java平台间的兼容性这些我们不可以控制的因数外,对平台独立性影响最大的就算本地方法了。只要你在程序中直接或者间接的调用了本地方法,你就丢失了Java程序平台独立的特性。
        但是,当你不考虑平台独立时,使用本地方法还是可行的。一般来说在三种情况下应该直接调用本地方法:
        1)、当需要访问Java API无法访问的底层系统资源时;
        2)、当要重用遗留系统中的非Java库时;
        3)、为了提升系统的执行速度,本地化一些核心代码时。
        如果你又想使用本地化代码,又想实现平台独立性时,就必须手工在多个平台上实现本地化代码。

        4、非标准类库

 

 

        如果使用了非平台独立的第三方类库,即使没有直接调用本地方法,程序也可能不是平台独立的。比如AFC(Application Foundation Classes),由微软实现,只能运行在微软平台上的Java类库。但是如果想直接调用(COM (Component Object Model)),也只有使用AFC。

        5、Java虚拟机的相关性

 

 

        为了实现Java程序的平台独立性,必须要遵守两天规则:
        1)、不要依赖于Java的finalization方法来实现强制垃圾收集;
        2)、不要依赖于Java的线程优先级来实现程序的同步。
        所有Java虚拟机必须好有垃圾收集堆,但是Java虚拟机的不同实现能够使用不同的垃圾收集技术。这种柔韧性使得不同的Java虚拟机意味着一个 Java程序中的对象可能会在不同被“垃圾收集”。垃圾收集实现的不同关键就是finalizers方法,这个在对象被垃圾收集之前调用的方法。这个方法 可能会被不同Java虚拟机的实现在不同的地方调用。如果你使用finalizers方法来释放资源,可能在一些Java虚拟机的实现被正常调用,而在另 一些可能会在垃圾收集之前用完所有的资源。
        另一个可能变化的就是Java的线程优先级。Java虚拟机必须实现所有有高优先级的线程能够获得一些CPU时间,但也必须保证那些低优先级的线程必须在 高优先级的线程堵塞时能够运行。但是这些并没有阻止低优先级的线程在高优先级线程没有堵塞时运行。这意味着即使高优先级的线程没有被堵塞,低优先级的线程 也会获得CPU时间。如果你使用线程优先级来实现协调线程同步,可能在一些虚拟机上能够正常运行而在其他的虚拟机上可能不能正常执行。为了保证Java的 多线程程序能够实现平台独立性,你必须使用同步(synchronization)而不是线程优先级来协调线程。

        6、用户界面的相关性

 

 

        另一个阻碍程序平台独立性的就是用户界面。AWT用户界面给了我们一个在各个平台都映射的基础用户界面。虽然一些类库,比如微软的AFC (Microsoftís AFC),网景的IFC(Netscapeís IFC),SUN的JFC(Sunís JFC),给了你一些不依赖于本地方法的高层的接口,但是要实现一个让所有平台的用户都能够束缚使用的用户界面,可并不是一件容易的事情。

        7、Java平台实现中的bug

 

 

        虽然Sun提供了一个所有Java平台都必须实现的测试,但是依然可能有一些Java平台的发布时存在一些Bug。为了预防这种可能性唯一的方法就是测 试。如果有Bug,你就必须判断这个Bug是否会影响到你的程度。不影响最好,如果影响你就必须尝试能否绕开这个Bug了。

        8、测试

 

 

        如果想让自己的程序真正做到平台独立性,你就必须在所有你想发布程序的机器上通过对应Java平台的测试。这是保证Java程序平台独立的最关键因素。

四、平台独立的七个步骤
        1、选择一些想要发布程序的目标机器(target hosts)
        2、选择一个你认为适合你所发布用的Java平台,并在这个平台上开发、执行你的程序
        3、为每个目标机器选择一些你的程序可能会被发布到的Java平台(target runtimes)
        4、通过标准运行库的Java API来访问本地资源,不要通过本地方法或者使用本地方法的第三方运行库。
        5、不要让你的程序依赖于Java平台垃圾收集及时调用finalization方法,不要依赖于Java的线程优先级来协调多线程。
        6、设计一个所有能在目标机器上能够正常工作的用户界面
        7、在所有的可能运行平台和机器上测试你的程序
        如果你愿意,你可以让你的程序成为纯正的Java程序(100% Pure Java)。你可以通过运行Sun免费提供的认证工具(100% Pure verification tools)来完成认证。这个程序可以让你不运行自己的程序来判断程序的“纯正度”。如果你通过了认证,你就可以使用Sun的纯正Java图标(100% Pure Java coffee cup icon)。
        但是通过认证,并不意味你的程序已经完全实现了平台独立性,这个认证只是判断你的程序是否仅仅依赖于Java核心类库。但是,在你实现平台独立性的过程中,执行这个认证还是值得的。
五、平台独立的策略
        Java平台的供应商可以提供自己的Java平台的扩展,这些扩展可能是依赖于特定平台的,但是所有的Java平台的实现必须实现Java的核心组件。如 果你只使用核心组件来实现你的程序,你就可能让你的程序“run anywhere”,但是你必定受到最小公约数问题(lowest-common-denominator problem)的苦恼。但是如果你使用了特定Java平台扩展的类库,你就可能最大限度的使用本地环境的优势。那一种更适合,就需要开发者自己去抉择。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值