如何将Lua脚本编译成单个可执行文件,同时还能获得LuaJIT的超快性能优势?
背景:
.lua组成我的Web应用程序的文件(来自模型/视图/控制器)为了简化部署,我想将运行我的Web应用程序的所有.lua脚本编译成单个可执行文件.
这可能吗?怎么样?
似乎Lua官方附带了一个名为SRLua的库
有没有一种简单的方法从Lua脚本创建独立的.exe文件?基本上这将涉及链接Lua解释器和脚本.
我相信它是可能的(PLT Scheme允许以相同的方式创建独立的可执行文件),但究竟如何呢?
许多人会发现这是重复的问题但我在询问这个主题之前已经完成了所有问题,但没有一个对我有用.
我想使用ls命令打印某个文件格式的完整路径名称到目前为止,我发现将打印目录中的所有文件但不是完整路径的代码块.
for i in io.popen("ls /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7"):lines() do
if string.find(i,"%.*$") then
print(i)
end
end
Run Code Online (Sandbox Code Playgroud)
这将打印出根难治和辅助训练中的所有文件.
输出:
0020111118223425.lvf
2012
2012 (2009).mp4
3 Idiots
Aashiqui 2
Agneepath.mkv
Avatar (2009)
Captain Phillips (2013)
Cocktail
Run Code Online (Sandbox Code Playgroud)
我想输出像:
/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/0020111118223425.lvf [File in Root Directory]
/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/2012/2012.mkv
/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/2012 (2009).mp4 [File in Root Directory]
/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/3 Idiots/3 Idiots.mkv
/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/Aashiqui 2/Aashiqui 2.mkv
/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/Avatar (2009)/Avatar (2009).mkv
/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/Captain Phillips (2013).mkv
/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/Cocktail/Cocktail.mkv
Run Code Online (Sandbox Code Playgroud)
编辑: 我已经使用了这一切,但它不能在LUA中使用我的代码.
当我使用我的代码时,它显示错误的目录
for i in io.popen("ls -d $PWD/* /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7"):lines() do
if string.find(i,"%.*$") then
print("/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/"..i)
end
end
Run Code Online (Sandbox Code Playgroud)
没有找到"/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7"中的文件,它打印机器根目录文件.
当我看到Lua时,我唯一能读到的东西是"非常适合嵌入","快速","轻量级"以及更多的其他内容:"魔兽世界"或简称"魔兽世界".
为什么仅限于将整个内容嵌入到另一个应用程序中?为什么不像使用Python或Perl一样编写通用脚本?
Lua似乎在速度和内存使用方面做得很好(最快的脚本语言),为什么我从未将Lua用作"桌面脚本语言"来自动执行任务?例如:
是缺少标准库吗?
我在我的C++应用程序上遇到随机崩溃,它可能不会崩溃一个月,然后在一小时内崩溃10次,有时可能会在启动时崩溃,而有时可能会在运行几个小时后崩溃(或者不会崩溃)所有).
我在GNU/Linux上使用GCC,在Windows上使用MingW,因此我无法使用Visual Studio JIT Debug ...
我不知道如何继续,随机查看代码是行不通的,代码是巨大的(好的部分不是我的工作,它也有一些很多遗留的东西),我也没有有关如何重现崩溃的线索.
编辑:很多人提到......我如何制作核心转储,小型转储或其他转储?这是我第一次需要进行事后调试.
EDIT2:实际上,DrMingw捕获了一个调用堆栈,没有内存信息......不幸的是,调用堆栈对我没什么帮助,因为接近结束突然它进入了一些我没有调试信息的库(或其他东西) ,只产生一些十六进制数...所以我仍然需要一些体面的转储,提供更多的信息(特别是关于内存中的内容...具体来说,在那里给出了"访问冲突"错误的地方)
此外,我的应用程序使用Lua和Luabind,可能错误是由.lua脚本引起的,但我不知道如何调试它.
关于Lua和Javascript是否支持对象能力模型,在cap-talk邮件列表上进行了一些讨论,得出的结论是,由于支持将环境限制为被调用函数setfenv,以及对不可变对象进行不可伪造引用的可能性,OCM可能是实现.
我们看过这个怎么样了?我有兴趣从现有应用程序中删除漏洞,在Lua中使用非常有用的,慷慨的脚本支持,遗憾的是在各种情况下允许完全shell访问.需要一些shell访问:对象能力模型似乎是管理事物的好方法.但是我担心一个案例我可以说是多么令人信服,这种方法实际上可以确保在确定的混乱实践中是安全的.
一些链接:
setfenv在行动; 显示表格背后的基本思想,在适当的情况下,可以只读在Lua中编码,我有一个三次嵌套循环,经历了6000次迭代.所有6000次迭代都是独立的,可以很容易地并行化.Lua的哪些线程包开箱即用,并在四个或更多内核上获得了不错的并行加速?
这是我目前所知道的:
luaproc来自核心Lua团队,但luaforge上的软件包很旧,邮件列表中有关于segfaulting的报告.此外,对我来说,如何使用标量消息传递模型将结果最终导入父线程并不明显.
Lua Lanes提出了有趣的说法,但似乎是一个重量级,复杂的解决方案.邮件列表上的许多消息都表示无法让Lua Lanes为他们构建或工作.我自己很难让潜在的"Lua rock"分发机制为我工作.
LuaThread需要显式锁定,并要求线程之间的通信由受锁保护的全局变量调解.我可以想象更糟糕,但我对更高层次的抽象感到更高兴.
Concurrent Lua提供了一个类似于Erlang的有吸引力的消息传递模型,但它表示进程不共享内存.目前尚不清楚是否spawn实际使用任何 Lua函数或是否存在限制.
Russ Cox提出了一种偶尔的线程模型,它只适用于C线程.对我没用.
我将通过这些或任何其他多线程包或任何提供新信息的答案来报告所有报告实际经验的答案.
作为参考,这是我想要并行化的循环:
for tid, tests in pairs(tests) do
local results = { }
matrix[tid] = results
for i, test in pairs(tests) do
if test.valid then
results[i] = { }
local results = results[i]
for sid, bin in pairs(binaries) do
local outcome, witness = run_test(test, bin)
results[sid] = { outcome = outcome, witness …Run Code Online (Sandbox Code Playgroud) 我正在尝试编译一个调用一些导出函数的lua脚本,将生成的字节码保存到文件然后加载此字节码并执行它,但我还没有找到任何关于如何执行此操作的示例.有没有关于如何做到这一点的例子?我怎样才能做到这一点?
编辑:我正在使用Lua + Luabind(C++)
我已经看到在Lua中很多哈希字符'#'被添加到变量的前面.
它有什么作用?
例
-- sort AIs in currentlevel
table.sort(level.ais, function(a,b) return a.y < b.y end)
local curAIIndex = 1
local maxAIIndex = #level.ais
for i = 1,#currentLevel+maxAIIndex do
if level.ais[curAIIndex].y+sprites.monster:getHeight() < currentLevel[i].lowerY then
table.insert(currentLevel, i, level.ais[curAIIndex])
curAIIndex = curAIIndex + 1
if curAIIndex > maxAIIndex then
break
end
end
end
Run Code Online (Sandbox Code Playgroud)
如果已经有人问过这个道歉,我已经在互联网上搜索了很多,但我似乎没有找到答案.提前致谢!