Java字节码与X86汇编的对比
相同之处
- Java字节码解释运行时与X86汇编一样,都使用了函数栈幁模型
- 字节码跟X86汇编均提供程序流程结构控制,例如Java字节码 提供 条件跳转指令如:
if_icmpge
无条件跳转指令如:goto
等字节码指令来完成程序的逻辑控制,在汇编中提供条件跳转指令如:jne
无条件跳转指令:jmp
不同之处
- 字节码无法直接操作内存控制栈幁结构,X64汇编需要手动通过操作
rsp
rbp
寄存器维护栈幁结构 - 字节码通过 操作数栈 (操作数栈跟栈幁是两回事) 来完成函数传参与函数结果值的返回,操作数同样也会通过 操作数栈 来计算结果, 汇编通过寄存器传参数 例如fastcall 使用
rdi
寄存器作为函数的第一个参数的存放位置,通过rax
寄存器返回函数的结果
总结
- Java字节码 通过操作数栈屏蔽了 各个平台的差异 (例如 x86与arm的寄存器名称不同),兼容性好,但是同时字节码的解释运行,需要频繁操作函数栈帧中的操作数栈,操作数栈由于其存放位置在主存(可能各个虚拟机的实现不同,存在一些优化),即使操作数栈的数据被L1 cache缓存命中,但寄存器读取的速度也比L1 cache的快上好几倍。