【问题标题】:Just in time compiled Foreign function Interface: what is it that gets "runtime" compiled及时编译外部函数接口:编译“运行时”的是什么
【发布时间】:2013-11-30 00:49:00
【问题描述】:

我的问题一般是关于 JIT 的外部函数接口,但我将使用 LuaJIT 作为具体示例。据说LuaJIT的FFI比直接绑定C要快,因为调用C函数可以编译JIT。

谁能解释一下。通常,被绑定的 C 函数已经存在于库中,因此它已经被编译,那么究竟是什么被 JIT 化了。

【问题讨论】:

    标签: c lua jit ffi luajit


    【解决方案1】:

    LuaJIT extensions: the FFI Library

    [...] JIT 编译器生成的用于从 Lua 代码访问 C 数据结构的代码与 C 编译器生成的代码相同。 与通过经典 Lua/C API 绑定的函数的调用不同,可以在 JIT 编译的代码中内联对 C 函数的调用。

    在回答您关于编译什么的问题时,就是这样:调用 到 C 函数。事实上,通过经典 C API 对 C 函数的调用将永远不会被编译,即使在 LuaJIT 的未来版本中也是如此。他们将引发NYI 消息,导致任何跟踪中止并有效地阻止周围的Lua 代码被编译。例如,循环中的经典 C 函数调用 FUNCC 操作码将阻止该循环被编译。这只是意味着 LuaJIT 将退回到它的解释器,这仍然是相当快的。

    重申一下,LuaJIT 不会对已编译的 C 代码执行任何魔法。它只是将 FFI 调用内联到 JIT 汇编代码中的 C 函数。

    【讨论】:

    • 在解释器中,它仍然是从 C 到 C 的函数调用,所以不是那么昂贵,对吧?还是 LuaJIT 还编译了一些提供额外好处的周边代码。在“内联 FFI 调用”上,它不会正确内联 C 函数,如果没有源代码,这将很困难。
    • LuaJIT 解释器是为它支持的每个不同架构用汇编手工编写的。基本上,从解释器到 JIT 编译器就是从汇编和一些 C 到为 Lua 代码简化的汇编,任何引发 NYI 标志的事情都会阻止这种情况发生。在 LuaJIT 网站和源代码中有更多关于此的信息。您可能想尝试一下luajit -jdump,看看它会产生什么并了解编译器的工作原理。
    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多