我需要找到一个好的Lua到JavaScript转换器; luaforj.org上的lua2js已经过时(大约3年左右,看起来它在Lua 5.1上不起作用)我还没有在Google上找到任何东西。
有没有人有任何其他转换器的经验?它应该适用于Lua 5.1,最好是基于.NET的,但.NET不是必需的。一个javascript lua解释器也可以工作。
答案 0 :(得分:9)
出现了一个新的挑战者:Lua.js https://github.com/mherkender/lua.js
对于一些证明其成熟度的精彩演示,请参阅https://github.com/ghoulsblade/love-webplayer
Lua.js的工作原理是将Lua代码直接转换为ECMAscript(包括JavaScript,ActionScript),这使得它比尝试在JavaScript中实现Lua VM的解决方案具有重要的速度优势。
答案 1 :(得分:8)
这是一个关于Lua列表的反复出现的问题,我猜是因为两种语言的表面相似性。
不幸的是,有许多重要的差异并不那么明显。使其工作需要一个针对JS而不是Lua的字节码的完整编译器,或者需要用JavaScript重写Lua VM。
我不知道Lua2js的最初目标;但如果它只是一个有限的“翻译者”,那么编写想要翻译的Lua代码就会否定Lua的大部分(全部?)美好的东西。例如,我不认为你可以使用函数作为表键,因为在JavaScript中键只是字符串(和数字?我不确定)。
.NET选择更合理,可以更改现有编译器以发出CLR字节码而不是标准Lua字节码。即使CLR是针对其他类型的语言设计和优化的,它也非常通用,可以很好地运行。主要障碍是图书馆的可用性。
我刚发现的另一个选项是Roberto Ierusalmschy和Fabio Mascarenhas的this paper,他们探索将LuaVM字节码转换为CLR字节码。
正如学术论文中通常的那样,没有任何迹象表明它的编写日期,所以我不知道它是否是新的,革命的或旧的和遗忘的。
答案 2 :(得分:4)
Emscripten包含转换为JavaScript的Lua解释器。你可以try it in your browser。但是大小是1.5MB。
答案 3 :(得分:4)
ljs在javascript中有一个lua vm的工作演示。源代码甚至可以使用用lua编写的lua解释器在浏览器中编译。
答案 4 :(得分:2)
我一直在使用之前回答中提到的此实现https://github.com/mherkender/lua.js。它可以进行离线和加载时解析,我发现它非常易于使用。
我的Lua脚本通过C函数进行调用,并将该C代码转换为Javascript并将其与lua.js连接起来非常简单。
答案 5 :(得分:1)
访问http://luajs.org查看我的工作。
网站菜单上有演示和基准测试。
压缩前仅为35.5K,压缩后为12.2K。它可以直接访问Javascript对象/数组。它几乎每天都在更新。
它比lua.vm.js快。 (由于metatable实现不那么快),我一直在优化它。
答案 6 :(得分:0)
翻译到javascript很有趣,允许在浏览器端更换javascript。我们也可以在浏览器上采取一点类型的安全措施。将javascript定位为平台的目标是最普遍的平台之一,即地球的浏览器。 GWT做java2js,但我不确定是否要在应用程序中仅为几页引入GWT。我得想想。对于作为表中键的功能,必须要有一些魔力。也许只需在编译时为每个函数指定一个唯一的名称,并将其用于您的密钥。您还可以为所有键添加前缀以进行类型检查,这是一个不错的开始。
答案 7 :(得分:0)
这样做的一种方法是使用LuaSub并生成JavaScript而不是Lua输出。这可以通过合理的努力完成(目前LuaSub没有这样做)。
在编译时可能会发现JS无法满足Lua要求的地方,并导致错误。
我将来会做很多JS + SVG,如果JS方面头疼,这可能是一件值得尝试的事情。如果有其他人想要去,请这样做。 LuaSub源代码可供您使用。
最初,LuaSub是Lua 5.1的语法扩展器,它引入了易用的概念(增量,类型检查),没有与标准Lua的制动兼容性或需要修补它。它类似于MetaLua(它似乎变得越来越普遍)。
答案 8 :(得分:0)
我已经为ECMAscript静态编译器编写了一个部分完整的Lua。
https://github.com/mherkender/lua2js-experiment
它可能无法满足您的需求,因为该项目缺少许多关键功能,我不急于完成它,因为它是一个死胡同。有关详细信息,请阅读自述文件中的更多内容。
尽管我在互联网上看到了一些问题,但只有少数特定于Lua的功能(如* fenv函数,或大多数调试库),Javascript无法真正支持。其他文件库(如文件库)受VM可访问的功能限制。
我个人也尝试过Lua + Emscripten选项,虽然它令人印象深刻,但它也很慢。