java 虚拟机如何翻译字节码 基于栈和基于寄存器的区别

时间:2022-10-08 17:08:09

java 编译 解释执行

javac 编译器 完成了程序代码经过词法分析, 语法分析, 到抽象语法树, 在遍历语法树生成线性的字节码指令流的过程
javac 最后是生成了.class 的字节码
最后字节码需要翻译成机器语言才能执行

基于栈和基于虚拟机的指令集

基于栈执行 1 + 1, 是如下的指令集

iconst_1
iconst_1
iadd
istore_0

两台 iconst_1 连续把两个常量 1 压入栈后, iadd 指令把栈顶的两个值出栈并想家, 然后再把结果放回栈顶, 最后 istore_0 把栈顶的值放到局部变量表的第0个 Slot 中


基于寄存器的指令集如下

mov eax,1
add eax,1

mov 指令把 EAX 寄存器的值设为1, 然后 add 指令再把这个值加1, 结果就保存在 EAX寄存器中

基于栈和基于寄存器的区别

栈架构指令集的主要缺点是执行速度相对来说稍微慢一些

基于堆栈的机器需要更多指令,而基于寄存器的机器指令更长。

Android 是基于寄存器的Dalvik虚拟机

Dalvik虚拟机通过一个叫做dx的转换工具,可以将传统的JVM虚拟机中的字节码(.class格式文件)转换为在Dalvik虚拟机中运行的字节码(dex格式)

Dalvik 经过优化,每个 App 开启一个虚拟机示例,这样保证一个 App 的崩溃不会导致整个虚拟机崩溃。

它允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

参考文章

Dalvik和ART的区别
Dalvik和Java字节码的对比