目录
执行引擎概述
什么是执行引擎
执行引擎是Java虛拟机核心的组成部分之一。
“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。
JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息。
那么,如果想要让一一个Java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
位置图解
执行引擎的工作过程
- 执行引擎在执行的过程中究竟需要执行什幺祥的字节码指令完全依赖于PC寄存器。
- 毎当执行完一项指令操作后,PC寄存器就会更新下一条需要被执行的指令地址。
- 当然方法在执行的辻程中,执行引擎有可能会通过存储在局部变量表中的対象引用准确定位到存储在Java堆区中的対象实例信息,以及通过对象头中的元数据指針定位到目标対象的类型信息。
从外观上来看,所有Java虚拟机的执行引擎输入、输出都是一致的:输入的是字节码二进制流,处理过程是字节码解释执行的等效过程,输出的是执行结果。
Java程序的编译和解释运行的理解
Java代码编译和执行的过程
大部分的程序代码转换成物理机的目标代码或虚拟机能执行的指令集之前,都需要经过下图中的各个步骤:
橙色部分由javac编译器完成,或者称为前端编译器。
蓝色是编译原理。绿色是解释执行。
Java代码编译是由Java源码编译器来完成,流程图如下所示:
两个问题
什么是执行器,什么是JIT编译器
解释器:当Java 虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
JIT (Just In Time Compiler) 编译器:就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言。
为什么说Java是半编译半解释型语言
JDK1.0时代,将Java语 言定位为“解释执行”还是比较准确的。再后来,Java也发展出可以直接生成本地代码的编译器。
现在JVM在执行Java代码的时候,通常都会将解释执行与编译执行二者结合起来进行。
解释器的使用
字节码:
- 字节码是一种中间状态(中间码)的二进制代码(文件),它比机器码更抽象,需要直译器转译后才能成为机器码
- 字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。
- 字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虛拟机器将字节码转译为可以直接执行的指令。
- 字节码的典型应用为Java bytecode。
为什么要有字节码?直接高级语言翻译成机器指令不可以吗?
答:可以,但是需要花费大量的时间。
解释器:
JVM设计者们的初衷仅仅只是单纯地为了满足Java程序实现跨平台特性,因此避免采用静态编译的方式直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码执行程序的想法。
- 解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容‘上承相为对应平台的本地机器指令执行。
- 当一条字节码指令被解释执行完成行接着再根据PC寄存器中记录的下一条需要被执行的字节码指令执行解释操作。
解释器的工作机制
解释器分类
在Java的发展历史里,一共有两套解释执行器,即古老的字节码解释器、现