为什么java是半编译半解释型语言,这还要从JVM中的执行引擎说起
因为操作系统并不能识别我们java的字节码文件,这是就需要一个能让字节码变为操作系统能识别的语言的东西。执行引擎充当这样一个解释/编译的角色,也就是将高级语言翻译成机器语言的译者。
解释器
解释器是java虚拟机运行时,会根据预定义的规范采用逐行解释的方式执行,没条字节码文件中的内容都会被解释成本地机器指令执行。
JIT编译器
JIT(Just In Time Compiler)编译器,虚拟机将源代码一次性直接编译成和本地机器相关的机器语言,而不是直接执行。
为什么java是半编译半解释型语言
现在JVM在运行过程中,通常是解释和编译两者结合起来实现的。
在java设计之初,为了实现java跨平台的特性,因此避免使用编译将高级语言直接转换为机器语言,因此产生了解释器逐行解释字节码的想法。
但是单单由解释器承担翻译的工作,将字节码文件解释成高级语言效率太低。
然而JIT编译器在编译代码后,可以对编译后的代码进行缓存的操作,存储在方法区中,这样执行效率就变高了。
所以一些被频繁调用的热点代码就可以通过JIT进行编译,提高程序性能。
热点代码
一个被多次调用的方法或者一个方法体内部多次被循环使用的循环体都能被称为热点代码。
现在HotSpot多用计数器来进行热点探测。
JIT 编译器执行效率高为什么还需要解释器
- 当程序启动时直接使用解释器进行介绍代码,程序响应速度快,省去编译时间立即执行。
- 编译器想法发挥作用编译成本地代码,需要执行一定的而时间,但是编译为本地代码后执行效率高。所以需要解释器编译器一起配合使用时程序更加高效。