及时编译外部函数接口:什么是“运行时”编译

时间:2013-11-26 22:05:49

标签: c lua jit ffi luajit

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

任何人都可以解释这一点。通常,绑定的C函数已经存在于库中,因此它已经被编译,因此究竟是什么才能获得JIT。

1 个答案:

答案 0 :(得分:3)

  

<强> LuaJIT extensions: the FFI Library

     

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

回答你关于编译内容的问题,只是:调用到C函数。实际上,即使在未来版本的LuaJIT中,通过经典C API调用C函数也将从不进行编译。它们将引发NYI个消息,导致任何痕迹中止并有效防止编译周围的Lua代码。例如,循环中的经典C函数调用FUNCC操作码将阻止编译该循环。这只意味着LuaJIT将回归到它的解释器,它仍然很快。

重申一下,LuaJIT对已编译的C代码没有任何魔力。它只是简单地在JIT汇编代码中内联对C函数的FFI调用。