java代码的静态编译和动态编译中的问题比较

java代码的静态编译和动态编译中的问题比较

ID:9264977

大小:105.80 KB

页数:11页

时间:2018-04-25

java代码的静态编译和动态编译中的问题比较_第1页
java代码的静态编译和动态编译中的问题比较_第2页
java代码的静态编译和动态编译中的问题比较_第3页
java代码的静态编译和动态编译中的问题比较_第4页
java代码的静态编译和动态编译中的问题比较_第5页
资源描述:

《java代码的静态编译和动态编译中的问题比较》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Java代码的静态编译和动态编译中的问题比较Java应用程序的性能经常成为开发社区中的讨论热点。因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期Java运行时所提供的性能级别远低于C和C++之类的编译语言。尽管这些语言可以提供更高的性能,但是生成的代码只能在有限的几种系统上执行。在过去的十年中,Java运行时供应商开发了一些复杂的动态编译器,通常称作即时(Just-in-time,JIT)编译器。程序运行时,JIT编译器选择将最频繁执行的方法编译成本地代码。运行时才进行本地代码编译而不是在程序运行前进

2、行编译(用C或C++编写的程序正好属于后一情形),保证了可移植性的需求。有些JIT编译器甚至不使用解释程序就能编译所有的代码,但是这些编译器仍然通过在程序执行时进行一些操作来保持Java应用程序的可移植性。   由于动态编译技术的多项改进,在很多应用程序中,现代的JIT编译器可以产生与C或C++静态编译相当的应用程序性能。但是,仍然有很多软件开发人员认为——基于经验或者传闻——动态编译可能严重干扰程序操作,因为编译器必须与应用程序共享CPU。一些开发人员强烈呼吁对Java代码进行静态编译,并且坚信那样可以解决性能问题。对

3、于某些应用程序和执行环境而言,这种观点是正确的,静态编译可以极大地提高Java性能,或者说它是惟一的实用选择。但是,静态地编译Java应用程序在获得高性能的同时也带来了很多复杂性。一般的Java开发人员可能并没有充分地感受到JIT动态编译器的优点。   本文考察了Java语言静态编译和动态编译所涉及的一些问题,重点介绍了实时(RT)系统。简要描述了Java语言解释程序的操作原理并说明了现代JIT编译器执行本地代码编译的优缺点。介绍了IBM在WebSphereRealTime中发布的AOT编译技术和它的一些优缺点。然后比较

4、了这两种编译策略并指出了几种比较适合使用AOT编译的应用程序领域和执行环境。要点在于这两种编译技术并不互斥:即使在使用这两种技术最为有效的各种应用程序中,它们也分别存在一些影响应用程序的优缺点。   执行Java程序   Java程序最初是通过JavaSDK的javac程序编译成本地的与平台无关的格式(类文件)。可将此格式看作Java平台,因为它定义了执行Java程序所需的所有信息。Java程序执行引擎,也称作Java运行时环境(JRE),包含了为特定的本地平台实现Java平台的虚拟机。例如,基于Linux的Intelx

5、86平台、SunSolaris平台和AIX操作系统上运行的IBMSystemp平台,每个平台都拥有一个JRE。这些JRE实现实现了所有的本地支持,从而可以正确执行为Java平台编写的程序。   事实上,操作数堆栈的大小有实际限制,但是编程人员极少编写超出该限制的方法。JVM提供了安全性检查,对那些创建出此类方法的编程人员进行通知。   Java平台程序表示的一个重要部分是字节码序列,它描述了Java类中每个方法所执行的操作。字节码使用一个理论上无限大的操作数堆栈来描述计算。这个基于堆栈的程序表示提供了平台无关性,因为它不

6、依赖任何特定本地平台的CPU中可用寄存器的数目。可在操作数堆栈上执行的操作的定义都独立于所有本地处理器的指令集。Java虚拟机(JVM)规范定义了这些字节码的执行(参见参考资料)。执行Java程序时,用于任何特定本地平台的任何JRE都必须遵守JVM规范中列出的规则。   因为基于堆栈的本地平台很少(IntelX87浮点数协处理器是一个明显的例外),所以大多数本地平台不能直接执行Java字节码。为了解决这个问题,早期的JRE通过解释字节码来执行Java程序。即JVM在一个循环中重复操作:   ◆获取待执行的下一个字节码; 

7、  ◆解码;   ◆从操作数堆栈获取所需的操作数;   ◆按照JVM规范执行操作;   ◆将结果写回堆栈。   这种方法的优点是其简单性:JRE开发人员只需编写代码来处理每种字节码即可。并且因为用于描述操作的字节码少于255个,所以实现的成本比较低。当然,缺点是性能:这是一个早期造成很多人对Java平台不满的问题,尽管拥有很多其他优点。   解决与C或C++之类的语言之间的性能差距意味着,使用不会牺牲可移植性的方式开发用于Java平台的本地代码编译。   编译Java代码   尽管传闻中Java编程的“一次编写,随处运行

8、”的口号可能并非在所有情况下都严格成立,但是对于大量的应用程序来说情况确实如此。另一方面,本地编译本质上是特定于平台的。那么Java平台如何在不牺牲平台无关性的情况下实现本地编译的性能?答案就是使用JIT编译器进行动态编译,这种方法已经使用了十年(参见图1):   图1.JIT编译器   使用JIT编译器时,Java

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。