LuaJIT';跟踪编译器的工作是什么?
我一直在阅读JIT和LuaJIT的跟踪编译器,特别是,最后我提出了一些问题 据我所知,LuaJIT的JIT不像Java的HotSpot那样编译热方法,它编译源自循环的热路径。这是否意味着如果某个东西不是来自循环(比如,我从C-api调用Lua函数),那么代码将永远不会被JIT?当你打另一个循环时会发生什么?第二个循环的路径是JIT'ed,然后来自该循环的新路径也是JIT'ed,还是第二个循环是同一路径的一部分 解释器如何选择最佳热路径?假设我有一个整数->字符串的哈希表。现在假设我调用了表[x],其中x是3和5倍,它们已经成为热路径和jitted,那么解释器如何决定为表[x]调用哪个jitted代码,其中x是4LuaJIT';跟踪编译器的工作是什么?,lua,luajit,Lua,Luajit,我一直在阅读JIT和LuaJIT的跟踪编译器,特别是,最后我提出了一些问题 据我所知,LuaJIT的JIT不像Java的HotSpot那样编译热方法,它编译源自循环的热路径。这是否意味着如果某个东西不是来自循环(比如,我从C-api调用Lua函数),那么代码将永远不会被JIT?当你打另一个循环时会发生什么?第二个循环的路径是JIT'ed,然后来自该循环的新路径也是JIT'ed,还是第二个循环是同一路径的一部分 解释器如何选择最佳热路径?假设我有一个整数->字符串的哈希表。现在假设我调用了表[x]
另一件一直折磨着我的事情。由于路径是编译的,而不是函数,跟踪编译器不需要更多内存吗?因为你不能真正重复使用另一个路径的编译代码,而且在一般情况下,路径可能比单个函数大…你需要了解的第一部分是LuaJIT,你可以在wiki上查看它,这是LuaJIT解释器运行和优化的内容,因此执行跟踪以确定需要编译的内容和各种优化,以及其他优化,如跟踪路径中热循环的循环展开 第二个要检查的地方是 问:我在哪里可以了解到更多关于 卢阿吉特 我计划写更多关于内部的文档 卢阿吉特的。同时,请使用以下谷歌搜索引擎 搜寻有关文件: 搜索: 搜索: 搜索: 搜索: 搜索: 下面是LuaJIT的创新特性列表。还有,你知道,阅读 来源当然是获得启示的唯一途径。:-) 教唆非常开玩笑(主要是因为Mike专注于开发而不是文档),最重要的部分是最后一句,源代码非常干净,是了解LJ如何发挥其魔力的唯一实际方法。此外,搜索引擎还提供了更多关于搜索内容的线索 Wikipedia有一个关于跟踪JIT的文章,但是,底部的文章对于帮助理解LJ源代码中使用的概念最有用 一些源文件(在C中)帮助您入门
- :核心跟踪记录器,将字节码转换为IR
- :更多跟踪管理
- :处理/创建跟踪快照
- :记录快速功能的数据
- :记录C数据操作
我了解字节码和IR的工作原理,以及跟踪编译器的主要部分,至少我认为我了解:p我只是有一些不确定的细节。我已经远离了LuaJIT源代码,因为我还没有学会汇编(而且很多LuaJIT都是用汇编编写的,对吗?),无论如何,我将通读您的建议,看看这是否会带来启示。伟大的回答顺便说一句+1@RobinHeggelundHansen:从技术上讲,只有线程解释器在汇编中(这是dynasm使用的一种特殊抽象),实际的跟踪器和代码发射器都在C中(这有点奇怪,因为字段名非常紧凑,但一旦理解了约定,就更容易了)和Lua,我通常使用VS来让我更容易探索源头。我已经在我的答案中添加了一些包含许多跟踪方面的源文件