预优化Lua脚本,并在后面从C++中调用它。

我有一个过滤器引擎,我想用LuaJIT编写脚本,以便可以向下转储我所拥有的复杂解析/评估代码。

我的过滤器将是这样的字符串:

function filter ( obj ) return obj.attribute == "toto"

我的C ++代码中会有类似这样的内容:

// 在第一遍:
if( ! cachedLuaFilter ) {
    // 这将调用Lua分析器声明该函数,
    // 可能触发JIT,并返回Lua分析器
    // 已预先计算的函数,
    // 等待使用参数调用。
    cachedLuaFilter = createLuaFilter( "function filter ( obj ) return obj.attribute == \"toto\"" );
}
cachedLuaFilter->eval( myCPPObject ); // obj将是myCPPObject的FFI表示

我有两个问题:

  • Lua能够预编译该函数并让我使用具有FFI表示的不同C ++对象调用它吗?
  • LuaJIT是否是正确的解决方案?
点赞
用户646619
用户646619

你可以使用 loadstringluaL_loadstring 来加载它

 local filter = loadstring("local obj = ...; return obj.attribute")
 local attr = filter(someobj)
 -- 或者:
 luaL_loadstring(L, "local obj = ...; return obj.attribute")

虽然我应该澄清一些误解:

  • Lua C API 和 LuaJIT 的 FFI 不能混合使用。没有用于 FFI 对象的 C API 函数;我不确定你是如何传递的。
  • LuaJIT 是一个跟踪编译器,而不是逐个方法编译器。 loadstring等将源代码解析为字节码(仍是一个改进),但仅在LuaJIT确定它会带来重大性能提升的地方(通常是内部循环)才会发出机器代码。
2015-03-09 17:45:23