编译lua代码,存储字节码然后加载并执行它

时间:2012-01-20 03:21:19

标签: c++ compilation lua store bytecode

我正在尝试编译一个调用一些导出函数的lua脚本,将生成的字节码保存到文件然后加载这个字节码并执行它,但我还没有找到任何关于如何执行此操作的示例。有没有关于如何做到这一点的例子?我怎么能这样做?

编辑:我正在使用Lua + Luabind(C ++)

1 个答案:

答案 0 :(得分:57)

这一切都很简单。

首先,加载Lua脚本,不用执行它。如果你已经将Lua状态与导出的函数连接起来并不重要;你正在做的就是编译脚本文件。

您可以使用luaL_loadfile,它使用C标准库函数从磁盘读取文件并将其加载到lua_State。或者,您可以自己将文件加载到字符串中,然后使用luaL_loadstring将其加载到lua_State

这两个函数都会根据the documentation for lua_load发出返回值和编译器错误。

如果编译成功,lua_State现在将编译好的Lua块作为堆栈顶部的Lua函数。要获取已编译的二进制文件,必须使用lua_dump函数。它相当复杂,因为它使用回调接口传递数据。请参阅the documentation for details

在该过程之后,您具有已编译的Lua字节代码。将其推入您选择的文件中。请记住:将其写为 binary ,而不是文本翻译。

当需要加载字节代码时,您需要做的就是...... 正是您之前所做的。好吧,差不多。 Lua具有启发式检测,它给出的“字符串”是Lua源字符串或字节代码。所以,是的,您可以像以前一样使用luaL_loadfile加载字节代码。

不同之处在于您不能将luaL_loadstring与字节代码一起使用。该函数需要一个以NULL结尾的字符串,这很糟糕。字节代码可以在其中嵌入NULL字符,这会搞砸一切。因此,如果您想自己执行文件IO(因为您使用的是特殊文件系统或其他内容),则必须直接使用lua_load。它也使用像lua_dump这样的回调接口。所以read up on how to use it