我试图了解 JIT 编译器是如何工作的。我已经了解了运行时动态代码生成的基本思想,但我不清楚生成的代码如何与程序链接?通过动态链接库?如果有人可以分享一个 JIT 编译器的“hello world”示例以供研究,那就太好了。
简单的答案是,JITter 保留一个符号表来记录其他函数(编译或未编译)的入口点以及完整的签名,并且它保留包含成员变量和分配到实际内存实现中的偏移量的抽象对象定义。对象。
然后,当 JIT 编译函数调用时,它可以查找函数(以 Java 纯编译器可能的经典方式),并生成调用。 (如果是我的 JIT 系统,我会为每个未编译的方法在机器代码中构建一个虚拟接收存根,当它获得控制权时调用 JITter。然后每个编译函数always为被调用者调用机器代码。这是实际上是“DLL”库中的一个条目;您使用存根来隐藏真实的东西。)
遇到新的类定义时,它会为该类创建一个符号表条目,查找成员变量并分配偏移量。 (这有点复杂,因为一个类可以从另一个类继承;在像 Jav 这样的单继承系统中,真正要做的就是记录新成员变量的分配偏移量,同时考虑到父类已经分配的偏移量) .
当 JIT 编译成员变量引用时,它会查找对象类型,找到成员信息,获取偏移量并使用它。
您可能会发现此方案的变体,但一般来说它必须是这样的。 无论如何,这几乎都是纯编译器要做的事情;您只是将工作推迟到运行时遇到对象或方法为止。