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 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。