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

WoL*_*lus 35 c++ lua bytecode store compilation

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

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

Nic*_*las 57

这一切都很简单.

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

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

根据文档,lua_load这两个函数都会发出返回值和编译器错误.

如果编译成功,则lua_State现在将编译的Lua块作为堆栈顶部的Lua函数.要获取已编译的二进制文件,必须使用该lua_dump函数.它相当复杂,因为它使用回调接口传递数据.请参阅有关详细信息的文档.

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

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

不同之处在于您不能使用luaL_loadstring字节代码.该函数需要一个以NULL结尾的字符串,这很糟糕.字节代码可以在其中嵌入NULL字符,这会搞砸一切.所以如果你想自己做文件IO(因为你使用的是特殊的文件系统或其他东西),你必须lua_load直接使用.其中也使用了类似的回调接口lua_dump.所以请阅读如何使用它.

  • @WoLfulus:如果你使用Google搜索"Lua加载字节码",[第一个链接](http://csl.sublevel3.org/lua/)就会告诉你需要知道的一切.所以我认为不需要这方面的常见问题解答.应用程序`luac`已经可以将Lua脚本预编译为字节码,因此您甚至不需要程序来执行它.所以真的,没有必要提供常见问题解答; 只是正确使用谷歌. (5认同)
  • @NicolBolas实际上,这个SO问题现在是"Lua加载字节码"的顶级谷歌结果,所以我认为FAQ请求是有效的. (4认同)
  • 实际上`luaL_loadstring`在加载存储的字节码时不会(总是)正常工作,因为它使用`strlen(s)`来确定要加载的输入缓冲区的长度(https://github.com/LuaDist/lua/blob /d2e7e7d4d43ff9068b279a617c5b2ca2c2771676/src/lauxlib.c#L618),并且由于字节代码可以包含空字符,因此它将给出错误的长度.你需要做的是调用`luaL_loadbuffer`并将字符代码数组传递给它.除此之外答案是正确的. (3认同)
  • 希望有更多这样合理的答案! (2认同)