LuaJIT 的跟踪编译器是如何工作的?

问题描述 投票:0回答:2

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

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

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

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

lua luajit
2个回答
13
投票

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


11
投票

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

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

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

我计划编写更多有关内部结构的文档 LuaJIT 的。在此期间,请使用以下Google Scholar 搜索找到相关论文:

搜索:跟踪编译器

搜索:JIT 编译器

搜索:动态语言优化

搜索:SSA 表格

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

这里列出了 LuaJIT 的创新功能。而且,你知道,阅读 源泉当然是通往启蒙的唯一途径。 :-)

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.