预优化 Lua 脚本并稍后从 C++ 调用它
Pre-optimize Lua script and call it later from C++
我有这个过滤器引擎,我想用 LuaJIT 编写脚本,这样我就可以转储所有复杂的 parsing/eval 代码。
我的过滤器将是这样的字符串:
function filter ( obj ) return obj.attribute == "toto"
我的 C++ 代码中会有这样的东西:
// on first pass:
if( ! cachedLuaFilter ) {
// this will invoke the Lua parser to declare the function,
// possibly triggering the JIT, and return the Lua parser
// with the function already pre-computed,
// waiting to be called with arguments.
cachedLuaFilter = createLuaFilter( "function filter ( obj ) return obj.attribute == \"toto\"" );
}
cachedLuaFilter->eval( myCPPObject ); // obj will be the FFI representation of myCPPObject
我有两个问题:
- 可以 Lua 预编译这个函数,让我用具有 FFI 表示的不同 C++ 对象调用它吗?
- LuaJIT 是正确的解决方案吗?
您可以使用loadstring
或luaL_loadstring
加载它
local filter = loadstring("local obj = ...; return obj.attribute")
local attr = filter(someobj)
-- Or:
luaL_loadstring(L, "local obj = ...; return obj.attribute")
虽然我应该澄清一些误解:
- Lua C API 和 LuaJIT 的 FFI 不能混用。 FFI 对象没有 C API 函数;我不确定你是如何传递一个的。
- LuaJIT 是一个跟踪编译器,而不是一个方法一次编译器。
loadstring
等人。会将源代码解析为字节码(这仍然是一个改进),但不是机器码,它只在 LuaJIT 确定它会带来重大性能提升的地方发出(通常是内部循环)。
我有这个过滤器引擎,我想用 LuaJIT 编写脚本,这样我就可以转储所有复杂的 parsing/eval 代码。
我的过滤器将是这样的字符串:
function filter ( obj ) return obj.attribute == "toto"
我的 C++ 代码中会有这样的东西:
// on first pass:
if( ! cachedLuaFilter ) {
// this will invoke the Lua parser to declare the function,
// possibly triggering the JIT, and return the Lua parser
// with the function already pre-computed,
// waiting to be called with arguments.
cachedLuaFilter = createLuaFilter( "function filter ( obj ) return obj.attribute == \"toto\"" );
}
cachedLuaFilter->eval( myCPPObject ); // obj will be the FFI representation of myCPPObject
我有两个问题:
- 可以 Lua 预编译这个函数,让我用具有 FFI 表示的不同 C++ 对象调用它吗?
- LuaJIT 是正确的解决方案吗?
您可以使用loadstring
或luaL_loadstring
local filter = loadstring("local obj = ...; return obj.attribute")
local attr = filter(someobj)
-- Or:
luaL_loadstring(L, "local obj = ...; return obj.attribute")
虽然我应该澄清一些误解:
- Lua C API 和 LuaJIT 的 FFI 不能混用。 FFI 对象没有 C API 函数;我不确定你是如何传递一个的。
- LuaJIT 是一个跟踪编译器,而不是一个方法一次编译器。
loadstring
等人。会将源代码解析为字节码(这仍然是一个改进),但不是机器码,它只在 LuaJIT 确定它会带来重大性能提升的地方发出(通常是内部循环)。