本节继续来学习数组相关指令。
数组相关指令
<t>aload指令
<t>aload系列指令按索引取元素的值,然后推入操作数栈,其实现代码位于/instructions/loads/xaload.go文件中,其中一共有8条指令,代码基本相似,下面以aaload指令来详细看下:
本节继续来学习数组相关指令。
<t>aload系列指令按索引取元素的值,然后推入操作数栈,其实现代码位于/instructions/loads/xaload.go文件中,其中一共有8条指令,代码基本相似,下面以aaload指令来详细看下:
在大部分编程语言中,数组和字符串都是最基本的数据类型。Java虚拟机直接支持数组,对字符串的支持则由java.lang.String和相关的类提供。本章就来学习数组和字符串相关指令。
数组在Java虚拟机中是个比较特殊的概念。为什么这么说呢,有下面几个原因:
本节继续实现方法调用和返回。
首先要改造命令行工具,增加两个选项。java命令提供-verbose:class选项,可以控制是否把类加载信息输出到控制台。另外参照这个选项增加一个-verbose:inst选项,用来控制是否把指令执行信息输出到控制台,下面是测试步骤:
本节继续实现方法调用和返回。
方法执行完毕之后,需要把结果返回给调用方,这一工作由返回指令完成。返回指令属于控制指令,一共6条。其中return指令用于没有返回值的情况,areturn、ireturn、lreturn、和dreturn分别用于返回引用、int、long、float和double类型的值。该系列指令实现代码位于/instructions/control/return.go文件中:
本章开始将实现方法调用和返回,在此基础上,还会讨论类和对象的初始化。
从调用角度来看,方法可以分为两类:静态方法和实例方法。静态方法通过类来调用,实例方法则通过对象引用来调用。静态方法时静态绑定的,也就是说,最终调用的时哪个方法在编译期就已经确定了。实例方法则支持动态绑定,最终要调用哪个方法可能要推迟到运行期才知道。
在Java7之前,Java虚拟机规范一共提供了4条方法调用指令。其中invokestatic指令来调用静态方法。invokespecial指令用来调用无需动态绑定的实例方法,包括构造函数、私有方法和通过supper关键字调用超类方法。剩下的情况则属于动态绑定。如果是针对接口类型的引用调用方法,就使用invokeinterfase指令,否则使用invokevirtual指令。本章将实现这四条指令,为了更好地支持动态类语言,Java7增加了一条方法调用指令invokedynamic,本章不讨论该指令。在深入讨论各条方法调用指令的细节之前,先简单了解下Java虚拟机是如何调用方法的。