JIT编译器生成的代码如何与程序链接?

时间:2014-09-24 05:05:53

标签: compiler-construction jit

我试图了解JIT编译器的工作原理。我已经理解了运行时动态代码生成的基本思想,但我不清楚生成的代码如何与程序链接?通过动态链接库?如果有人可以分享JIT编译器的“hello world”示例进行研究,那将是很好的。

1 个答案:

答案 0 :(得分:1)

简单的答案是JITter保留一个符号表来记录其他函数(已编译或未编译)的入口点以及签名,并保持抽象对象定义包含成员变量和分配的偏移到实际的内存实现中对象。

然后,当JIT编译函数调用时,它可以查找函数(以Java纯编译器的经典方式),并生成一个调用。 (如果是我的JIT系统,我会在机器代码中为每个未编译的方法构建一个虚拟接收存根,在它获得控制时调用JITter。然后每个编译的函数总是调用机器代码被调用者。这实际上是“DLL”库中的一个条目;你使用存根来隐藏真实的东西。)

在遇到新的类定义时,它会为该类创建一个符号表条目,查找成员变量并分配偏移量。 (这有点复杂,因为一个类可以从另一个类继承;在像Jav这样的单继承系统中,所有人真正需要做的是为新成员变量记录分配的偏移量,同时考虑已从父类中分配的offets)

当JIT编译成员变量引用时,它会查找对象类型,查找成员信息,获取偏移量并使用它。

您可能会发现此方案的变体,但一般情况下它必须是这样的。这完全是纯编译器无论如何都要做的事情;你只是推迟工作,直到在运行时遇到一个对象或方法。