【问题标题】:How does the code generated by JIT compiler link with the program?JIT编译器生成的代码如何与程序链接?
【发布时间】:2014-09-24 05:05:52
【问题描述】:

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

【问题讨论】:

  • 不,通过动态生成的代码段,基本上是通过函数指针到达的。
  • jit 通常将机器代码发送到它正在运行的程序的内存中,并以一种或另一种方式跳转到这些指令。 (here 是一个小例子)
  • 您应该记录自己关于 JVM 的内部结构、Java 虚拟机、Sun/Oracle 的文档非常好且具有解释性,而且 Java 非常流行。谈到实现,JIT 编译器通常会使用关联数组、树和堆栈等基础数据结构生成一些类似 C 的代码。请记住,无论您从什么开始,最终都需要为您的机器运行一些程序集。
  • @nos 谢谢!参考正是我想要的。

标签: compiler-construction jit


【解决方案1】:

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

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

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

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

您可能会发现此方案的变体,但通常必须是这样的。无论如何,这几乎都是纯编译器要做的事情。您只是在延迟工作,直到在运行时遇到对象或方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2011-06-03
    • 2010-10-19
    • 1970-01-01
    • 2014-05-29
    • 2017-08-17
    相关资源
    最近更新 更多