3.加载、连接、验证、执行(loading, linking, verification, and execution)
3.1 概览
AVM2处理ABC文件,分为4个阶段:加载、连接、验证、执行。这几个阶段有重叠的地方,尤其是验证跟所有其他阶段都有重叠。
加载(loading)阶段
ABC文件被读入内存,并被解码。比如,常量池被编码为内存数据结构。这个阶段,验证主要是检验ABC的文件结构。
连接(linking)阶段
ABC文件结构的私有字段的引用名称被解析,结果对象被连接为一个更复杂的数据结构。比如,类(derived class)定义的基类字段表明了基类;解析这个名称,会找到基类(base class)的定义;根据这两个类的定义,此派生类的最终类对象将被创建(trait)。验证与这些对象有关:名称要解析,结果trait集要一致(coherent)。
执行(execution)阶段
字节码(bytecode, 代表ABC文件的编译代码/compiled code)通过解释器(interpreter)运行,以此进行计算。验证与指令流(stream of instructions)和执行栈(execution stack)有关:指令不能跳出字节码数组(?bytecode array);代码不能使用它拥有之外更多的栈和寄存器空间。
以上任一阶段的验证失败都会抛出VerifyError。执行时抛出的VerifyError可以被程序捕获。
连接与加载和执行都有交叉。加载时的连接过程中,前向引用(forward references)将被阻止;比如类定义只能引用之前定义过的类作为基类。执行时的连接过程中,对某些未定义的实体的引用可能不会被标记为错误;比如,如果方法没被调用,使用一个未定义的类型名称的方法不会触发VerifyError。