深入JVM 解析执行
通常而言,虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即使编译器直接翻译成本地机器码)2种选择。
——解释执行
在老版本的虚拟机中,通常认为Java语言是解释执行的语言,但现代主流虚拟机都包含即使编译器,Class文件到底是被解释执行还是编译执行,并不确定,不论是解释还是编译,也不论环境是实际物理机还是虚拟机,对于应用程序,机器都需要进行一定步骤。
——编译过程
Java语言中,Javac编译器完成了程序代码经过词法分析、语法分析到抽象语法树,再遍历语法树生成线性字节码指令流的过程,并且这一部分在虚拟机之外完成的,所以Java程序的编译就是半独立的实现。
——基于栈的指令集和基于寄存器的指令集
Javac编译器的输出指令流,基本上是一种基于栈的指令集架构,指令流中大部分都是零地址指令,它们依赖于操作数栈进行工作。与之对应的另外一种常用的指令集架构是基于寄存器的指令集,如X86的二进制指令集,即我们主流PC机的物理直接支持的指令集架构。
基于栈的指令集主要优点便于移植,寄存器由硬件直接提供,程序直接依赖这些硬件寄存器则不可避免地受到硬件的约束。如果采用栈架构的指令集,用户程序不会直接访问这些寄存器,而是由虚拟机实现自行决定如何访问,这样一来,便不受集体的物理执行环境影响,而由虚拟机实现对底层细节的屏蔽。但缺点是执行速度较慢,因为引入了虚拟机层面