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架構下的指令集數量。