<b>Java代码的静态编译和动态编译中的问题比较</b>[Java编程]
本文“<b>Java代码的静态编译和动态编译中的问题比较</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Java 利用程序的性能常常成为开辟社区中的谈论热门.因为该语言的计划初衷是利用注释的方法支持利用程序的可移植性目标,早期 Java 运行时所供应的性能级别远低于 C 和 C++ 之类的编译语言.固然这些语言可以供应更高的性能,但是生成的代码只能在有限的几种系统上履行.在过去的十年中,Java 运行时供应商开辟了一些复杂的动态编译器,普通称作当即(Just-in-time,JIT)编译器.程序运行时,JIT 编译器挑选将最频繁履行的办法编译成本地代码.运行时才举行本地代码编译而不是在程序运行前举行编译(用 C 或 C++ 编写的程序恰好属于后一情形),保证了可移植性的需求.有些 JIT 编译器乃至不利用注释程序就可以编译全部的代码,但是这些编译器仍旧通过在程序履行时举行一些操作来保持 Java 利用程序的可移植性.
由于动态编译技术的多项改良,在很多利用程序中,现代的 JIT 编译器可以产生与 C 或 C++ 静态编译相当的利用程序性能.但是,仍旧有很多软件开辟人员认为 —— 基于经验大概据说 —— 动态编译大概严重干扰程序操作,因为编译器必须与利用程序同享 CPU.一些开辟人员激烈号令对 Java 代码举行静态编译,并且坚信那样可以办理性能问题.关于某些利用程序和履行环境而言,这种概念是精确的,静态编译可以极大地提高 Java 性能,大概说它是惟一的实用挑选.但是,静态地编译 Java 利用程序在得到高性能的同时也带来了很多复杂性.普通的 Java 开辟人员大概并没有充分地感遭到 JIT 动态编译器的长处.
本文观察了 Java 语言静态编译和动态编译所触及的一些问题,重点介绍了及时 (RT) 系统.扼要描写了 Java 语言注释程序的操作原理并阐明了现代 JIT 编译器履行本地代码编译的优缺陷.介绍了 IBM 在 WebSphere Real Time 中公布的 AOT 编译技术和它的一些优缺陷.然后对比了这两种编译战略并指出了几种对比合适利用 AOT 编译的利用程序范畴和履行环境.要点在于这两种编译技术并不互斥:即便在利用这两种技术最为有效的各种利用程序中,它们也辨别存在一些影呼利用程序的优缺陷.
履行 Java 程序
Java 程序最初是通过 Java SDK 的 javac程序编译成本地的与平台无关的格局(类文件).可将此格局看做 Java 平台,因为它定义了履行 Java 程序所需的全部信息.Java 程序履行引擎,也称作 Java 运行时环境(JRE),包含了为特定的本地平台实现 Java 平台的虚拟机.比方,基于 Linux 的 Intel x86 平台、Sun Solaris 平台和 AIX 操作系统上运行的 IBM System p 平台,每个平台都拥有一个 JRE.这些 JRE 实实际现了全部的本地支持,从而可以精确履行为 Java 平台编写的程序.
事实上,操作数仓库的大小有实际限制,但是编程人员极少编写超越该限制的办法.JVM 供应了安全性查抄,对那些成立出此类办法的编程人员举行告诉.
Java 平台程序表示的一个重要部份是字节码序列,它描写了 Java 类中每个办法所履行的操作.字节码利用一个理论上无限大的操作数仓库来描写计算.这个基于仓库的程序表示供应了平台无关性,因为它不依靠任何特定本地平台的 CPU 中可用存放器的数目.可在操作数仓库上履行的操作的定义都独立于全部本地处理器的指令集.Java 虚拟机(JVM)标准定义了这些字节码的履行(拜见 参考资料).履行 Java 程序时,用于任何特定本地平台的任何 JRE 都必须服从 JVM 标准中列出的法则.
因为基于仓库的本地平台很少(Intel X87 浮点数协处理器是一个明显的例外),所以大大都本地平台不能直接履行 Java 字节码.为了办理这个问题,早期的 JRE 通过注释字节码来履行 Java 程序.即 JVM 在一个循环中反复操作:
◆获得待履行的下一个字节码;
◆解码;
◆从操作数仓库获得所需的操作数;
◆按照 JVM 标准履行操作;
◆将后果写回仓库.
这种办法的长处是其简单性:JRE 开辟人员只需编写代码来处理每种字节码便可.并且因为用于描写操作的字节码少于 255 个,所以实现的本钱对比低.当然,缺陷是性能:这是一个早期造成很多人对 Java 平台不满的问题,固然拥有很多其他长处.
办理与 C 或 C++ 之类的语言之间的性能差别意味着,利用不会牺牲可移植性的方法开辟用于 Java 平台的本地代码编译.
编译 Java 代码
固然据说中 Java 编程的 “一次编写,到处运行” 的口号大概并非在全部情形下都严峻成立,但是关于大量的利用程序来说情形确切如此.另一方面,本地编译本质上是特定于平台的.那么 Java 平台如安在不牺牲平台无关性的情形下实现本地编译的性能?答案就是利用 JIT 编译器举行动态编译,这种办法已经利用了十年(拜见图 1):
图 1. JIT 编译器
利用 JIT 编译器时,Java 程序按每次编译一个办法的情势举行编译,因为它们在本地处理器指令中履行以得到更高的性能.此历程将生成办法的一个内部表示,该表示与字节码差别但是其级别要高于目标处理器的本地指令.(IBM JIT 编译器利用一个表达式树序列表示办法的操作.)编译器履行一系列优化以提高质量和效率,最后履行一个代码生成步骤将优化后的内部表示转换成目标处理器的本地指令.生成的代码依靠运行时环境来履行一些活动,比方确保范例转换的合理性大概对不能在代码中直接履行的某些范例的对象举行分配.JIT 编译器操作的编译线程与利用程序线程是脱离的,因此利用程序不需求等候编译的履行.
图 1 中还描写了用于察看执路程序行为的解析框架,通过周期性地对线程取样找出频繁履行的办法.该框架还为专门举行解析的办法供应了工具,用来存储程序的此次履行中大概不会改变的动态值.
因为这个 JIT 编译历程在程序履行时发生,所以可以保持平台无关性:公布的仍旧是中立的 Java 平台代码.C 和 C++ 之类的语言贫乏这种长处,因为它们在程序履行前举行本地编译;公布给(本地平台)履行环境的是本地代码.
以上是“<b>Java代码的静态编译和动态编译中的问题比较</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |