基于栈的字节码解释执行引擎
这个栈,就是栈帧中的操作数栈。
解释执行
先通过 javac 将代码编译成字节码,虚拟机再通过加载字节码文件,解释执行字节码文件生成机器码,解释执行的流程如下:
1 | 词法分析 -> 语法分析 -> 形成抽象语法树 -> 遍历语法树生成线性字节码指令流 |
指令集分类
基于栈的指令集
优点:
- 可移植:寄存器由硬件直接提供,程序如果直接依赖这些硬件寄存器,会不可避免的受到硬件的约束;
- 代码更紧凑:字节码中每个字节对应一条指令,多地址指令集中还需要存放参数;
- 编译器实现更简单:不需要考虑空间分配问题,所需的空间都在栈上操作。
缺点: 执行速度稍慢
- 完成相同的功能,需要更多的指令,因为出入栈本身就产生相当多的指令;
- 频繁的栈访问导致频繁的内存访问,对于处理器而言,内存是执行速度的瓶颈。
示例: 两数相加
1
2
3
4iconst_1 // 把常量1入栈
iconst_1
iadd // 把栈顶两元素出栈相加,结果入栈
istore_0 // 把栈顶值存入第0个Slot中
基于寄存器的指令集
示例: 两数相加
1 | mov eax, 1 |
执行过程分析
1 | public class Architecture { |