JVM基于栈的解释器执行原理和DVM基于寄存器的解释器执行原理

基于栈 

学习自

https://blog.csdn.net/jijianshuai/article/details/73739995


代码

public static int add(int a, int b) {

int c = 0;
c = a + b;
return c;

}


字节码

descriptor: (II)I

flags: ACC_PUBLIC, ACC_STATIC

Code:

    stack=2,locals=3,arg_size=2

        0: iconst_0  
        1: istore_2  
        2: iload_0   
        3: iload_1    
        4: iadd       
        5: istore_2   
        6: iload_2  
        7: ireturn   
     LineNumberTable:
       line 5: 0
       line 6: 2
       line 7: 6 
     LocalVariableTable:
       Start  Length  Slot  Name   Si
           0       8        0        a        I   
           0       8        1        b        I   

           2       6        2        c        I    


(假设我们输入的方法参数是10,20)

0-7:

本地变量表有3格,分别对应abc

在读到0的时候,0压栈

0赋给c的时候,0出栈,存到c在本地变量表对应的那一格中

10压栈

20压栈(这里得出栈深为2)

执行到10+20的时候,10,20出栈,相加后30压栈

30出栈,存到c在本地变量表对应的那一格中

c在本地变量表对应的那一格的数压栈

返回结果30


基于寄存器

学习自

https://blog.csdn.net/u012481172/article/details/50904574



这个时候不同于基于栈,所有的变量都是放在寄存器里的。所以我们就必须去得到每个操作数在内存中的地址了。

如果想R3=R1+R2

对应的指令直接ADD R1 R2 R2;即可完成

比起JVM,节省了许多指令。速度自然快上许多,所以特别适合硬件受限的移动设备。