`

深入理解Java虚拟机读书笔记之:第2章 平台无关

阅读更多
为什么要平台无关
    Java技术在网络环境下非常有用,其中一个关键的理由就是,用Java创建的可执行二进制程序,能够不加改变地运行于多个平台。这一点在网络化环境中尤为重要,因为大多数网络通常都是由各种各样不同种类的计算机和设备互联而成。
    此外,新兴的网络化嵌入式设备则展示了Java又一擅长的领域,因为它的平台无关性在这种环境下非常有用。在这个嵌入式的世界,Java的平台无关性也有助于简化系统管理任务。
    从开发者的观点看,Java能够减少开发和在多个平台上部署应用程序的成本和时间。
 
Java的体系结构对平台无关的支持
    对平台无关性的支持,像对安全性和网络移动性的支持一样,是分布在整个Java体系结构中的,所有的组成部分——语言、class文件、API以及虚拟机,都在对平台无关性的支持方面扮演着重要角色。
 
1)Java平台
    Java平台扮演一个运行时Java程序与其下的硬件和操作系统之间的缓冲角色 。
    无论Java程序被部署到何处,它只需要与Java平台交互,而不需要担心底层的硬件和操作系统。因此,它就能够运行于任何拥有Java平台的计算机。
2)Java语言
    Java编程语言主要通过以下方式支持Java的平台无关性:它的基本数据类型的值域和行为都是由语言自己定义的。在像C或者C++这样的语言中,基本整数类型int的值域是由它的占位宽度决定的,而它的占位宽度则由目标平台决定。
    通过确保基本数据类型在所有平台上的一致性,Java语言本身为Java程序的平台无关性提供了强有力的支持。
3)Java class文件
    前一章曾提到,class文件定义了一个特定于Java虚拟机的二进制格式。Java class文件可以在任何平台上创建,也可以被任何平台的Java虚拟机装入并运行。它的格式,包括多字节值的高位优先存放的约定,都有严格的定义,并且是与Java虚拟机所在平台无关的。
4)可伸缩性
    Java支持平台无关性,一个方面就是它的可伸缩性。Java平台可以在各种各样不同类型的(从嵌入式设备到大型主机)计算机上实现。
    尽管Java目前在Web领域和桌面领域都声名卓著,但它最初却是被期望用于嵌入式设备和消费电器领域的,而不是桌面计算机。
 
    Java三个基础API集合,它们表现Java平台不同的伸缩性:
    企业版(J2EE)
    标准版(J2SE)
    微型版(J2ME)
    在高端,企业版的存在表明了Java平台在高端服务的可用性。在中端,标准版提供了在浏览器中启动传统applet的功能和桌面环境下的Java平台。在低端,微型版通过不同的行业子集,显示了Java平台可以向下伸缩,并改变自己以适应完全不同的消费性电器市场和嵌入式系统需求的能力。
 
影响平台无关性的因素
    Java程序的平台无关程度依赖于多种因素,其中有些因素不在开发人员的控制范围之内,但是大多数是由开发人员来控制的。从根本上说,任何Java程序的平台无关程度都依赖于作者怎样编写它。
 
1)Java平台的部署
    决定Java程序其平台无关性的最主要因素就是Java平台在不同的平台上被部署的程度。只有在拥有Java平台的计算机或设备上,才能运行Java程序。决定Java程序平台无关性真正程度的一个重要因素——这个因素一般不是由开发人员控制的——就是已有了可用的Java平台实现和发布版本。
2)Java平台的版本
    Java平台的部署有一些复杂,因为并非所有的标准运行时库在每个Java平台上都可以用的。Java平台中保证可用的基本库集合被称为标准API。Sun把Java虚拟机1.2版以及组成标准API的那些class文件称为Java 2平台标准版。这个版本的Java平台是Java API库的最小集合,例如可以在桌上型电脑和工作站上使用。
    另外,Sun定义了一些标准运行时库,它把这些库作为标准版的可选项,把它们称为标准扩展API。
    在理论上,只要程序仅仅依赖于标准API的运行时库,那么程序就应该可以在有Java 2平台标准版的所有计算机上运行。但在实际上,标准API的新版本要过一段时间才能在任何地方都适用。当程序依赖于标准API最新版本的一些新特性时,有些主机可能不能运行这个程序 ,因为它们只有比较老的版本。
    作为一个开发人员,你不可能控制Java平台版本的发布周期或者部署进度表,但是你可以选择自己的程序所依赖的Java平台版本。
3)本地方法
    除了程序所依赖的Java平台的版本之外,决定Java程序的平台无关程度的另一个主要因素就是你是否调用了本地方法。当编写一个平台独立的Java程序时,必须遵守的一条最重要的原则就是:不要直接或间接调用不属于Java API的本地方法。


 
4)非标准运行时库
    如果开发者侧重于平台无关性,那么就必须清楚地知道所使用的那些非标准运行时库是否调用了本地方法。没有调用本地方法的非标准库不会降低程序的平台无关性。然而如果使用了调用本地方法的运行时库中,那么就会产生和直接调用本地方法一样的结果——使得程序和平台相关了。
5)对虚拟机的依赖
    在编写平台独立的Java程序时,还必须遵从两条原则,这两条原则和Java虚拟机中的某些部分有关,Java虚拟机中的某些部分可以由不同的开发商用不同的方法实现。这两条原则是:
    a)不要依赖及时终结(finalization)来达到程序的正确性。(finalize())
    b)不要依赖线程的优先级(thread prioritization)来达到程序的正确性。
    这两条原则可以防止Java虚拟机规范中允许的垃圾收集和线程在不同实现中的变化所带来的不利影响 。
    为了保证多线程Java程序的平台独立,必须依赖同步(synchronization)而不是优先级来在线程之间协调相互间的动作。
6)对用户界面的依赖
7)Java平台实现中的bug
8)测试
    Java程序的平台无关性并没有达到只需在一个平台上测试它们即可的程序。
    在实际情况中,在程序要运行的不同主机和不同Java平台实现上测试你的Java程序 ,是程序平台无关性的一个关键因素。
 
(转载请注明来源:http://zhanjia.iteye.com/blog/1841934)
  • 大小: 9.8 KB
2
0
分享到:
评论
7 楼 zhanjia 2013-04-06  
fyland 写道
zhanjia 写道
fyland 写道
“其中一个关键的理由就是,用Java创建的可执行二进制程序”—— JAVA白学了?还是刚开始学?

原书的内容的确是这么写的,也许是翻译得不太好。至于有没有白学,你自己看吧!

看书的时候好歹要自己理解一下的吧?

我话都说得这么明白了...还...
好吧,既然如此,我就给你解释一把:
1、本系列文章的内容均出自原书的字迹,我的原意就是要保留原文,不想因为自己理解的问题导致误解读者。除了极少数的“注”或比较明显的带有个人理解色彩的地方外
2、“用Java创建的可执行二进制程序”这句话虽然翻译得有点别扭,但个人认为也没问题。首先,二进制程序指class文件,没问题。其次,class文件是由Java编译器编译java文件得到的中间代码,这里的编译可以生硬的翻译成创建。最后,Java这个词可以包括Java语言、虚拟机、运行环境、编译环境、Java API等,当然前面所说的编译器肯定也在其中。所以,个人认为其实没必要挑刺
3、至于我有没有去理解,这一点已经没必要提了

最后,虽然言论自己,但请尊重每一个人!
6 楼 fyland 2013-04-06  
zhanjia 写道
fyland 写道
“其中一个关键的理由就是,用Java创建的可执行二进制程序”—— JAVA白学了?还是刚开始学?

原书的内容的确是这么写的,也许是翻译得不太好。至于有没有白学,你自己看吧!

看书的时候好歹要自己理解一下的吧?
5 楼 zhanjia 2013-04-05  
fyland 写道
“其中一个关键的理由就是,用Java创建的可执行二进制程序”—— JAVA白学了?还是刚开始学?

原书的内容的确是这么写的,也许是翻译得不太好。至于有没有白学,你自己看吧!
4 楼 sosojustdo 2013-04-05  
楼主似乎对write once run anywhere解释的不太清楚呢,我记得是java虚拟机对big endian和little endian两种字节排序的支持,这两种字节排序又分别对应的硬件架构是,power pc和x86。
3 楼 fyland 2013-04-05  
“其中一个关键的理由就是,用Java创建的可执行二进制程序”—— JAVA白学了?还是刚开始学?
2 楼 zhanjia 2013-04-05  
aliahhqcheng 写道
javap的跨平台的保证是:java的class字节码+jvm。这个甚至可以实现跨语言的应用。只有用第三方语言编写的源码能编译成class字节码就行了。

是啊,这个理念非常重要。现在越来越多的基于JVM的语言,如Groovy、Scala、JRuby,相信以后会更多
1 楼 aliahhqcheng 2013-04-05  
javap的跨平台的保证是:java的class字节码+jvm。这个甚至可以实现跨语言的应用。只有用第三方语言编写的源码能编译成class字节码就行了。
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics