-
解释执行:包括C++解释器和模板解释器。解释执行并不是每次执行字节码时动态把它编译成机器码,而是将根据字节码的类型,转到对应的机器码去执行,即一个派发(switch)的过程。而C++解释器派发到的是由字节码对应的C++代码所编译成的机器码,模板解释器派发到的是字节码对应的汇编模板所生成的机器码。由于C++代码由编译器编译成机器码,比较冗余,所以执行速度慢,而模板解释器的汇编模板是直接由汇编代码专门编写的,执行效率高。所以解释执行执行速度较慢,并不是每次将字节码动态编码生成机器码的原因,这是错误的。而是对于每个字节码都派发到对应的机器码上执行,而不是从上到下的顺序执行机器码,多了很多判断、跳转的指令,所以效率较低。 -
编译执行:JIT对于热点代码,编译成运行效率高的机器码。这里与模板解释器的区别在于JIT针对的是代码段生成机器码,而模板解释器是针对每个字节码指令生成机器码,以及JIT是动态生成的,模板解释器是在JVM启动时就把字节码对应的汇编模板转换为机器码。某种意义上模板解释器也属于JIT的范畴。当JIT把整段代码直接编译成机器码时,在执行时就可以自上而下的获取执行机器码,而不用对于每条字节码指令跳转到对应的机器码上,执行效率获得提升。
-
C++解释器:  -
模板解释器:  -
JIT编译执行:

参考: https://zhuanlan.zhihu.com/p/33886967 https://baijiahao.baidu.com/s?id=1693627511987297431&wfr=spider&for=pc
http://47.100.139.123/blog/article/132 

|