解释器
指令集已经实现得差不多了,本节将编写一个简单的解释器。这个解释器目前只能执行一个Java方法,后面的章节中会不断完善。解释器实现代码位于/instructions/interpreter.go文件中。
要实现解释器,还有些额外的代码需要完善:
指令集已经实现得差不多了,本节将编写一个简单的解释器。这个解释器目前只能执行一个Java方法,后面的章节中会不断完善。解释器实现代码位于/instructions/interpreter.go文件中。
要实现解释器,还有些额外的代码需要完善:
本章节继续学习指令集和解释器。
控制指令共有11条,本节实现其中的3条指令:goto、tableswitch和lookupswitch。该系列指令代码位于/instructions/control包下。
goto指令实现代码位于goto.go文件中:
本章节继续学习指令集和解释器。
类型转换指令大致对应Java语言中的基本类型强制转换操作。按照被转换变量的类型,类型转换指令可以分为4种:i2x系列指令把int变量强制转换成其他类型;l2x系列指令把long变量强制转换成其他类型;f2x系列指令把float变量强制转换成其他类型;d2x系列指令把double变量强制转换成其他类型。该指令实现代码位于/instructions/conversions包下,下面以d2x系类指令为例来学习下,其代码位于d2x.go文件中:
本章节继续学习指令集和解释器。
和加载指令刚好相反,存储指令把变量从操作数栈顶弹出,然后存入局部变量表。和加载指令一样,存储指令也可以分为6类。存储指令相关代码位于/instructions/stores包下。下面以lstore系列指令为例来学习下,其实现代码位于lstore.go文件中:
本章节将在前面讲的基础上编写一个简单的解释器,并且实现一些具有代表性的指令,本章涉及到的go代码位于instructions包下。
Java虚拟机顾名思义,就是一台虚拟的机器,而字节码就是运行在这台虚拟机器上的机器码。字节码中存放编码后的Java虚拟机指令,每条指令都以一个单字节的操作码开头,这就是字节码名称的由来。看到这里才知道,之前的理解有些误区,只有Java方法(非抽象方法和本地方法)的代码才会编译成字节码,所以不能说整个class文件就是字节码,它只是包含字节码。由于只使用一个字节表示操作码,显而易见,Java虚拟机最多只能支持256条指令。到第八版为止,Java虚拟机规范已经定义了205条指令,操作码分别是0x00到0xCA、OxFE和0xFF。这205条指令构成了Java虚拟机的指令集。和汇编语言雷系,为了便于记忆,Java虚拟机规范给每个操作码都指定了一个助记符。比如操作码是0x00这条指令,因为它什么都不做,所以它的助记符是nop(no operation)。