8

我一直在阅读 JIT 和 LuaJIT 的跟踪编译器,特别是我遇到了一些问题。

据我了解,LuaJIT 的 JIT 不像 Java 的 HotSpot 那样编译热方法,它编译源自循环的热路径。这是否意味着如果某些东西不是源自循环(例如,我从 C-api 调用 Lua 函数),那么代码将永远不会被 jitted?当你遇到另一个循环时会发生什么?到第二个循环的路径是否会被 JIT,然后来自该循环的新路径也会被 jitted,或者第二个循环是否是同一路径的一部分?

解释器如何选择最优的热路径?假设我有一个整数哈希表 -> 字符串。现在想象一下,我已经调用 table[x] 并且 x 是 3 和 5 次,它们已经成为热路径并被 jitted,解释器如何决定为 x 为 4 的 table[x] 调用哪个 jitted 代码?

另一件事一直在绞尽脑汁。由于编译的是路径而不是函数,因此跟踪编译器不需要更多内存吗?因为你不能真正重用另一条路径的编译代码,我的意思是,因为在一般情况下,路径可能比单个函数大......

4

2 回答 2

13

Mike Pall 在 LuaJIT 邮件列表中做出了相当详细的回应。 http://www.freelists.org/post/luajit/How-does-LuaJITs-trace-compiler-work,1

于 2013-11-29T20:32:30.580 回答
10

您需要了解的第一部分是 LuaJIT IRBytecode,您可以在 wiki 上查看,这是 LuaJIT 解释器运行和优化的内容,因此可以跟踪以确定需要编译的内容以及各种作为额外的优化,例如跟踪路径中热循环的循环展开。

第二个要检查的地方是LJ FAQ,其中有这样的说法:

问:我在哪里可以了解更多关于 LuaJIT 使用的编译器技术的信息?

我打算写更多关于 LuaJIT 内部的文档。同时,请使用以下 Google Scholar 搜索查找相关论文:

搜索:跟踪编译器

搜索:JIT 编译器

搜索:动态语言优化

搜索:SSA 表格

搜索:线性扫描寄存器分配

以下是 LuaJIT 中的创新功能列表。而且,您知道,阅读源代码当然是获得启蒙的唯一途径。:-)

Abet 非常开玩笑(主要是因为 Mike 专注于开发而不是文档),最重要的部分是最后一句话,源代码非常干净,并且是了解 LJ 如何发挥魔力的唯一实际方法。此外,创新功能链接还提供了更多关于搜索内容的线索。

Wikipedia 有一个关于跟踪 JIT 的更具描述性的页面,但是,底部的论文是您会发现对帮助理解 LJ 源中使用的概念最有用的内容。

一些可以帮助您入门的源文件(C 语言)

于 2013-11-29T10:44:48.210 回答