Java虚拟机的研究与实现
http://tech.ddvip.com 2006年11月20日 社区交流
本文详细介绍Java虚拟机的研究与实现
如果一装载完字节码文件中的Java方法后,就对其进行编译,则有点处理不恰当,因为还不清楚是否需要执行该方法。编译一个不需要执行的方法,将带来不必要的空间和时间上的损失。 因此虚拟机设计者需要采用一种优化方案,即只有需要被执行的方法才能被JIT编译,这个问题可以参照kaffe虚拟机中的trampoline来解决。
JIT实现步骤:(1)对字节码进行验证并且划分基本块;(2)产生四元式;(3)根据四元式生成本地机器码;(4)操作数地址回填。

图3及时编译器的流程图
在字节码指令模拟操作的时候,按其语义动作生成指令属性四元式序列,指令属性四元式的结构为: (目的操作数, 源操作数1,源操作数2,语义动作),四元式数据结构如下:
typedef struct Sequence{
void (*func)(struct Sequence*); //语义动作
union{
jvalue value;
struct _label_ *labconst; //标号类型操作数
Method *methconst; //方法地址操作数
struct slotData **smask;
struct slotData *slot; //槽操作数
}u[3];
uint8 type; //Sequence类型
uint8 refered; //该四元式的引用
struct Sequence *next; //下一个四元式
}Sequence;其中目的操作数为Sequence.u[0],源操作数1为Sequence.u[1],源操作数2为Sequence.u[2]。 Sequence.func则代表语义动作,它主要用于生成该Sequence语义的本地机器码。
指令属性四元组建立后就进入代码生成阶段,属性四元组在形式上已经非常接近本地机器指令,只需要遍历该属性序列,执行相应的语义动作函数,即可生成机器指令。语义动作函数的功能包括操作数寻址、寄存器分配、建立指令连接以及本地机器码生成等。
来源:计算机与信息技术 作者:夏兵 俞建军 责编:豆豆技术应用
正在加载评论...