执行引擎工作过程
执行引擎其实就是执行字节码指令的一行行代码,从PC寄存器获得要执行什么指令。
解释执行和即时编译
大部分的程序代码转换成物理机的目标代码或虚拟机能执行的指令集之前,都需要经过下图中的各个步骤:
前面橙色部分是编译生成生成字节码文件的过程(javac编译器来完成,也就是前端编译器),和JVM没有关系。
后面绿色(解释执行)和蓝色(即时编译)才是JVM需要考虑的过程。Java就是半编译半解释性语言。
3. javac编译器(前端编译器)流程图如下所示:
4. Java字节码的执行是由JVM执行引擎来完成,流程图如下所示
问题:什么是解释器(Interpreter),什么是JIT解释器? 分别对应解释过程和编译过程
解释器:当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。 逐条翻译,直接执行
JIT(Just In Time Compiler)编译器:就是虚拟机将源代码一次性直接编译成和本地机器平台相关的机器语言,但并不是马上执行。
为什么Java语言即要保留解释器,又要保留编译器呢?即为什么Java语言是半解释半编译语言呢?
JDK1.0时代,将Java语言定位为“解释执行”还是比较准确的。再后来,Java也发展出可以直接生成本地代码的编译器。
现在JVM在执行Java代码的时候,通常都会将解释执行与编译执行二者结合起来进行。
JIT编译器将字节码翻译成本地代码后,就可以做一个缓存操作,存储在方法区的JIT 代码缓存中(执行效率更高了),并且在翻译成本地代码的过程中可以做优化。
下面这个图可以好好理解下,和上面的无关。是和本章相关的。
机器码
指令和指令集
指令
由于机器码是由0和1组成的二进制序列,可读性实在太差,于是人们发明了指令。
指令就是把机器码中特定的0和1序列,简化成对应的指令(一般为英文简写,如mov,inc等),可读性稍好
由于不同的硬件平台,执行同一个操作,对应的机器码可能不同,所以不同的硬件平台的同一种指令(比如mov),对应的机器码也可能不同。
指令集
不同的硬件平台,各自支持的指令,是有差别的。因此每个平台所支持的指令,称之为对应平台的指令集。如常见的
汇编语言
汇编语言翻译成指令,对应的机器不同,如x86和ARM指令集,则翻译出来的指令集是不同的。
高级语言
为了使计算机用户编程序更容易些,后来就出现了各种高级计算机语言。高级语言比机器语言、汇编语言更接近人的语言
当计算机执行高级语言编写的程序时,仍然需要把程序解释和编译成机器的指令码。完成这个过程的程序就叫做解释程序或编译程序(两种方式)。
4、解释器
5、JIT编译器
原文:https://www.cnblogs.com/G-JT/p/14501885.html