课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在上文中给大家简单介绍了java编程编译器的一些基础知识等内容,而本文我们就继续来学习一下,java编译器的工作原理与步骤包含哪些。
解析
简单的字节码编译形式称为解析。解析器只是简单地为每个字节码指令查找对应的硬件指令,并将其发送至CPU去执行。
你可以将解析比作使用字典:每个具体的单词(字节码指令)都有一个准确的翻译(机器代码指令)。自从解析器读取并即刻执行了一个字节码指令那一刻,就已经没有机会去优化指令集了。解析器同样,在每次字节码被读取时,不得不执行解析操作,并且这个过程是十分缓慢的。解析是一种能够执行代码的精确方法,但是这种不可优化的输出指令集,对目标平台处理器来说,可能不会得到高性能的指令序列。
编译
另一方面,编译器将全部要执行的代码载入到运行时环境。当它转译字节码的时候,它还具备检查整体或部分运行时上下文的能力,并且判断如何准确的转译这些代码。它的判断是基于代码图的分析,例如不同的指令执行分支和运行时上下文数据。
当一个字节码序列被转译为机器指令集,并且可以对指令集进行优化时,用以替换的指令集(优化过的)被存储进一个叫做代码缓存的结构中。下一次这些字节码再被执行,之前优化过的代码可以被快速的从代码缓存中定位到,并且用于执行。有些情况下,性能计数器可能去除并重写之前的优化,即编译器运行了新的优化。代码缓存的优点是,结果指令集可以被即刻执行——不需要解析查找或者编译!这样就提高了执行速度,特别是对于java应用,同样的方法要被调用很多次。
优化
使用动态编译器可以带来插入性能计数器的机会。比如,编译器可能会插入一个性能计数器,在每次字节码代码块被调用时,进行计算。编译器使用“热点代码”相关的数据,来决定在正在运行的应用程序中,哪部分的代码优化给程序好的影响。运行时的切面数据使编译器制作出一些正在运行、或长远提高性能的代码优化方案。随着更多的提炼的代码切面数据有效利用,它可以用于更多更好的优化决策,例如,如何在语言编译中,获得更好的输出指令,是否需要替换为更有效的指令集,甚至是否需要去除多余的操作。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。