在学习Java的时候我们知道,Java是基于栈的字节码解释执行,而很多PC的都是基于寄存器来执行的,那么这两种有什么差别呢?
基于栈的解释执行
我们以执行1+1为例。Java的相关指令为:
iconst_1 // 将常量1压入操作数栈
iconst_1 // 将常量1压入操作数栈
iadd //将操作数栈顶的两个数相加后放入栈顶
istore_0 //将栈顶的值放入局部变量表的第0个slot
在Java虚拟机中,每个方法的执行都对应一个栈帧,而每个栈帧中包含局部变量表、操作数栈、动态链接(方法动态分派相关)、方法返回值等模块,其均基于内存访问实现。
基于寄存器的执行
而基于寄存器的1+1实现:
mov eax, 1 //将eax寄存器的值设为1
add eax, 1 //将eax的值加1,结果保存在eax寄存器中
上述直接操作寄存器,和机器硬件实现相关,所以需要了解并适配不同硬件
对比
优点 | 缺点 | |
---|---|---|
基于栈 | 移植性好 | 执行速率相对慢一些(栈实现会多次访问内存,且指令较多,内存访问速度瓶颈限制执行速度) |
基于寄存器 | 指令更简洁、执行效率更高 | 移植性不好 |