1.基于栈实现,以JVM为例
java源文件
1 2 3 4 5 6 7 8 9 10 |
public class Test { public static void main(String[] args) { int a = 1; int b = 2; int c = a + b; } } |
执行命令:得到字节码信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//省略构造方法和常量池 public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V //函数签名 flags: ACC_PUBLIC, ACC_STATIC //public静态方法 Code: stack=2, locals=4, args_size=1//表示操作数栈最大为2,本地变量有4个,输入参数有1个 0: iconst_1 1: istore_1 2: iconst_2 3: istore_2 4: iload_1 5: iload_2 6: iadd 7: istore_3 8: return } SourceFile: "Test.java" |
从上面可以看到main方法由8条指令组成,一般称他为opcode,注意这个opcode并不是汇编语言,而是jvm可以识别的语言,可以说汇编之于Native等于opcode之于jvm
执行分析:
iconst_1 :将1放入操作数栈顶部(此时操作数栈深度为1)
istore_1: 从栈顶取出值,赋值给变量1 (此时操作数栈深度为0)
iconst_2 :将2放入操作数栈顶部(此时操作数栈深度为1)
istore_2:从栈顶取出值,赋值给变量2 (此时操作数栈深度为0)
iload_1,iload_2: 从变量1和变量2加载值,放到操作数栈( 此时操作数栈深度为2)
iadd:把栈顶的两个int值取出并且相加,结果放在栈顶 (此时操作数栈深度为1)