我的问题是关于外部函数接口的JIT编译,但我会以LuaJIT为例。据说LuaJIT的FFI比直接绑定到C更快,因为对C函数的调用可以被JIT编译。
有人能解释一下吗?通常,被绑定的C函数已经存在于库中,所以它已经被编译过了,那么究竟什么被JIT编译了呢?
[...] JIT编译器为从Lua代码访问C数据结构生成的代码与C编译器生成的代码相当。与通过经典的Lua/C API绑定的函数调用不同,C函数的调用可以在JIT编译的代码中内联。
针对您关于哪些内容会被编译的问题,只有对C函数的调用会被编译。实际上,通过经典的C API调用C函数永远不会被编译,即使在将来的LuaJIT版本中也是如此。它们会引发NYI消息,导致任何跟踪都会中止并有效地防止周围的Lua代码被编译。例如,在循环中的经典C函数调用FUNCC
操作码将阻止该循环被编译。这意味着LuaJIT将回退到其解释器,但解释器仍然非常快。
luajit -jdump
来查看它生成了什么并了解编译器的工作方式。 - Ryan Stein