c++ - 预先优化 Lua 脚本并稍后从 C++ 调用它

标签 c++ lua ffi luajit

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

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

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 是正确的解决方案吗?

最佳答案

可以使用loadstringluaL_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 确定它会带来重大性能提升的地方发出(通常是内部循环)。

关于c++ - 预先优化 Lua 脚本并稍后从 C++ 调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28947245/

相关文章:

c++ - 使用指针允许类充当创建另一个类实例的数据模板的缺点

c++ - 纯虚方法返回一个对象?

c++ - Thrust+boost代码编译错误

c++ - lua - 在 C 中存储闭包,在 C 中调用异步

ffi - 使用 purescript 的 FFI 调用带有回调的 js 函数

c++ - std::optional的详细信息

sockets - lua-socket : unix domain sockets?

redis - 有没有一种方法可以只使用 Lua 中大于 int 的散列中的 HGETALL 值?

haskell - 如何使用 Stack/Cabal 构建早期部分的程序输出作为同一构建后续部分的源?

c - 为外部 C 库分配不透明缓冲区的正确 Rust 方法是什么?