将所有内容保存在一个 Lua 字节码块中?

我将Lua与一个字节码块嵌入到了用C编写的项目中。现在,当我通过添加.lua文件扩展我的lua代码库时,有没有办法将这些代码保留在一个单独的字节码块中呢?

(我知道如何加载多个字节码块。但是让其加载一个单独的块,然后忘掉粘合代码似乎会更方便。)

我尝试使用文本包含,但似乎Lua中没有关键字。 "Require"和"dofile"在运行时查看文件,因此运行"lua -b..."后,生成的字节码不会包括那些文件的代码。

而且也没有将字节码文件合并的方法,对吧?我的意思是,当创建一个字节码文件时,"require"命令会将所有这些文件的代码添加到一个字节码文件中。

PS:Michal Kottman的答案适用于Lua,这是我所问的。我认为Lua和LuaJIT的工作方式相同。但它们并不相同。要将多个.lua文件合并为一个LuaJIT字节码文件,应该使用以下方法之一:

  • 使用"LuaJIT -b"(似乎不起作用)
  • 使用LuaJIT源编译Lua的luac.c
  • 使用lua命令模拟luac.c(没有C API)?

原文链接 https://stackoverflow.com/questions/9580366

点赞
stackoverflow用户513763
stackoverflow用户513763

loadstring 是你需要的函数。它接收一个字符串并加载它(在必要时将其编译为字节码)。结果是一个可以执行的函数,可以在以后运行其中包含的代码。

如果你仍需要更一般的功能,可以看看load,它允许你指定一个函数来传递 chunks。

这两个函数都可以处理 Lua 源代码和编译的字节码。

2012-03-06 09:21:53
stackoverflow用户221509
stackoverflow用户221509

你可以使用 luac 将多个文件合并成一个文件。运行时,这些源文件中的所有代码块将按添加到编译文件中的顺序依次执行:

$ echo "x=1"         > l1.lua
$ echo "y=2"         > l2.lua
$ echo "print(x, y)" > l3.lua
$ luac -o run.luac l1.lua l2.lua l3.lua
$ lua run.luac
1   2

您可以使用luaL_loadfile从C中将此文件加载到Lua中,如果成功加载,则该函数将在堆栈顶部放置一个函数。然后,您可以使用lua_call运行此函数以运行所有组合编译文件。

请注意,您可以将编译文件的内容作为字符串嵌入到项目中,无需将其保留为外部文件。

更新LuaJIT 2

正如您发现的那样,您可以使用Lua Compiler in Lua来获取一个组合文件,该文件可以像以前一样加载。这是一个简化版本,输出到stdout:

-- http://lua-users.org/wiki/LuaCompilerInLua
-- compile the input file(s) passed as arguments and output them combined to stdout
local chunk = {}
for _, file in ipairs(arg) do
  chunk[#chunk + 1] = assert(loadfile(file))
end
if #chunk == 1 then
  chunk = chunk[1]
else
  -- combine multiple input files into a single chunk
  for i, func in ipairs(chunk) do
    chunk[i] = ("loadstring%q(...);"):format(string.dump(func))
  end
  chunk = assert(loadstring(table.concat(chunk)))
end
io.write(string.dump(chunk))

对于先前的示例,您可以按如下方式使用它:

$ luajit combine.lua l1.lua l2.lua l3.lua > out.ljc
$ luajit out.ljc
1   2
2012-03-06 09:46:58
stackoverflow用户68204
stackoverflow用户68204

另一种方法是使用 Mathew Wild 的 squish 工具将所有的 Lua 源代码收集到一个单独的 .lua 文件中。Squish 的一个好处是支持各种过滤器,以帮助使压缩包比源文件的总和更小。

应用 Squish 后,可以通过 luac 将结果转换为字节码。然而,字节码通常比源代码更大,如果在 Squish 中使用更激进的过滤器(如 gzip),则字节码几乎肯定会更大。

如果字节码文件与可执行文件分开存储(或更糟糕的是通过网络传输),我还会提出与字节码相关的安全问题,这与 Lua 源代码无关。但是,链接到应用程序的字节码要更难被破坏,因为有害的字节码永远不会是运行 luac 的结果。

2012-03-06 23:30:01
stackoverflow用户305945
stackoverflow用户305945

经过尝试使用 luac、luajit 和 squish,我发现它们都要求你维护一个文件列表以进行合并。当处理包含许多 Lua 文件的项目时,这会很繁琐。

因此,我编写了一个小工具,通过分析 require 来合并 Lua 文件。

在这里:https://github.com/yi/node-lua-distiller

希望它能有所帮助。

2014-07-12 15:49:52