1)Java程序语言java
2)Java虚拟机c++
3)字节码文件架构
4)Java类库jvm
5)第三方Java类库设计
1)JDK:Java程序语言、Java虚拟机和Java类库统称为JDK(Java Development Kit)code
2)JRE:Java类库中的Java SE和Java虚拟机统称为JDR(Java Runtime Enviroment)orm
The Java Virtual Machine is an abstract computing machine. Like a real computing machine, it has an instruction set and manipulates various memory areas at run time. It is reasonably common to implement a programming language using a virtual machine; the best-known virtual machine may be the P-Code machine of UCSD Pascal.
索引
The Java Virtual Machine knows nothing of the Java programming language, only of a particular binary format, the class file format. A class file contains Java Virtual Machine instructions (or *bytecodes*) and a symbol table, as well as other ancillary information.
ip
Java虚拟机是一个抽象的计算机(本质上就是可运行程序)。它和真实的计算机类似,具备指令集且可以在运行时对内存区域进行操做。Java虚拟机并不能直接解释Java语言,它只可以解释特定的二进制格式,即.class文件(字节码文件)。内存
a)设计和实现更简单
b)指令集小,编译器易实现
c)不须要硬件支持,可移植性更好,更容易实现跨平台
a)依赖硬件,可移植性查
b)执行效率高
public class StackTest { public static void main(String[] args) { int a = 2; int b = 3; int c = a + b; } }
void test() { int a = 2; int b = 3; int c = a + b; }
使用jclasslib查看字节码
0 iconst_2 常量为2 1 istore_1 将常量2保存至索引为1的操做数栈中 2 iconst_3 常量为3 3 istore_2 将常量2保存至索引为2的操做数栈中 4 iload_1 加载操做数栈索引为1所对应的值 5 iload_2 加载操做数栈索引为2所对应的值 6 iadd 相加 7 istore_3 将相加结果保存至索引为3的操做数栈中 8 return
Android studio编写完后使用ida查看指令,ARM32下的汇编指令
SUB SP, SP, #0xC MOVS R0, #2 操做数2移动至R0寄存器 STR R0, [SP,#0xC+var_4] R0寄存器的值写入[SP,#0xC+var_4]地址 MOVS R0, #3 操做数3移动至R0寄存器 STR R0, [SP,#0xC+var_8] R0寄存器的值写入[SP,#0xC+var_8]地址 LDR R0, [SP,#0xC+var_4] [SP,#0xC+var_4]的值读入R0寄存器 LDR R1, [SP,#0xC+var_8] [SP,#0xC+var_8]的值读入R1寄存器 ADD R0, R1 R0, R1寄存器相加,结果放置R0寄存器 STR R0, [SP,#0xC+var_C] R0寄存器的值写入[SP,#0xC+var_C]地址 ADD SP, SP, #0xC BX LR
网上常有结论,在完成相同操做的状况下,基于栈式架构比基于寄存器架构的指令路量要多。这种说法严谨吗?
能够从上面例子中看出ARM32下的基于寄存器架构的指令数量并不比基于栈式结构的指令数量少。不少人只讨论了x86架构下的指令数量,而忽略了ARM架构下的指令集数量。