第五章 指令集和解释器
本章基于第三章(解析.class文件)和第四章(运行时数据区),编写一个建议的解释器。
5.1 字节码和指令集
每一个类或者接口都可以被Java编译器编译成为一个.class文件,类或接口的方法信息就放在.class文件的method_info结构中。如果方法不是抽象的,也不是本地方法,方法的Java代码就会被编译器便已成为字节码(即使是空的,也有回一条return语句),存放在method_info的Code属性。
JVM每条指令都以一个单字节的操作码开头。即:操作码最多有256个。每条操作码都有对应的助记符。操作码后面可以跟零字节或多字节的操作数。比如:getstatic,如果其操作数是0x0002,表示常量池的第二个常量。为了让编码后的字节码更加紧凑,很多操作码本身就隐含了操作数。比如:iconst_0表示把常数0推入操作数栈。
操作数栈和局部变量表只存放数据的值,并不记录数据类型。那么,指令必须要知道自己在操作什么类型的数据。比如:iadd就是对int值进行加法。
助记符首字母及对应的java数据类型:a(reference),b(byte),c(char),d(double),f(float),i(int),l(long),s(short)。
指令按照用途分为11类:常量(constants)指令