我的问题一般是关于 JIT 的外部函数接口,但我将使用 LuaJIT 作为具体示例。据说 LuaJIT 的 FFI 比直接绑定到 C 更快,因为调用 C 函数可以得到 JIT 编译。
谁能解释一下。通常,被绑定的 C 函数已经存在于库中,因此它已经被编译,所以究竟是什么得到了 JIT'ed。
[...] JIT 编译器生成的用于从 Lua 代码访问 C 数据结构的代码与 C 编译器生成的代码相当。与通过经典 Lua/C API 绑定的函数的调用不同,可以在 JIT 编译的代码中内联对 C 函数的调用。
在回答您关于编译什么的问题时,就是这样:对 C 函数的调用。事实上,通过经典 C API 对 C 函数的调用永远不会被编译,即使在 LuaJIT 的未来版本中也是如此。它们将引发NYI消息,导致任何跟踪中止并有效地防止周围的 Lua 代码被编译。例如,循环中的经典 C 函数调用FUNCC
操作码将阻止该循环被编译。这只是意味着 LuaJIT 将退回到它的解释器,这仍然是相当快的。
重申一下,LuaJIT 不会对已经编译的 C 代码执行任何魔法。它只是将 FFI 调用内联到 JIT 汇编代码中的 C 函数。