天地之灵

置顶随笔

[置顶]Lua.js,一个Lua2JS编译器,一个新的JS运行环境下的Lua方案

眼见为实,耳听为虚,先上live demo:
http://luajs.org

其实现在在js环境中运行lua代码的方案已经很多了,这些方案大都分为两类:
VM on VM:在js环境中移植或重新实现一个Lua VM。典型的代表是lua.vm.js和MoonShineJS。 这种方案的优势在于完整还原了整个标准lua,但主要缺陷在于,原本通过虚拟机执行的Lua VM效率就不理想,再通过JS运行,效率就更打一层折扣。
离线处理型:使用离线工具链将Lua语言翻译成JS。如LLVM-Lua 加上javascript backend,还有一个名为lua2js的项目。这个方案的优势在于能做一些较为深入的优化,缺点主要在于必须离线处理,不能直接在web上执行,或者体积庞大,以至于本身加载都需要较长时间。除此以外,只能离线处理 导致了字符串执行(如dostring等)的不可能实现,还会影响Lua中的package结构。

Lua.js采用一个不同的方案,它将lua代码转变为一个AST树,经过一系列的转换函数,最后产出一个合乎js标准的AST树,随后生成一个合法的js代码。因此转换后直接执行的代码,比VM on VM要快2-5倍,高效的执行速度有助于让你的应用或游戏展现流畅的极致体验。

另外,压缩后的Lua.js难以置信的小。这里是当前lua.js和lua.vm.js的对比:
文件大小 传输大小(gz压缩)
lua.js 22.7K 8.3K
lua.vm.js 638K 203K

尽管当前lua.js还有一些功能没有实现(如metatable、Lua标准库等),但可以预见全部实现后的尺寸也不会有大幅的增长,基本上不会超过30K/12K。

再谈论性能,这里使用了lua.vm.js官方的几个benchmark代码(稍做修改使得可以在当前版本的lua中运行)(lua.js和lua.vm.js均在chrome下运行),结果如下:

lua.js lua.vm.js lua 5.2.3 luaJIT 2.0.3 Scale What it measures
Binary Trees 8.526s 10.198s 4.006s 0.731s seconds (lower numbers are better) GC Performance
Scrimark 26.98 8.84 30.52 1249.73 MFLOPS (higher numbers are better) numeric computation performance

在当前版本中,GC仅仅比lua.vm.js略快,这是因为现在lua.js对于table模拟还处于较为原型的阶段,没有经过充足的优化。但即使这样也比lua.vm.js更快
而在数值计算上,性能远超lua.vm.js,逼近官方lua,这同样是在lua.js还没有经过充足优化的前提下。经过优化,完全有超过官方Lua的可能性。

lua.js的benchmark可以在http://luajs.org上找到,lua.vm.js的benchmark在 http://kripken.github.io/lua.vm.js/lua.vm.js.html

如果你对lua.js感兴趣,在这里可以下载独立的js文件:
https://github.com/tdzl2003/lua.js
lua.js尚处于不完善状态,如果你决定尝试使用,务必关注本项目的更新,及时替换更新的版本!

posted @ 2014-11-05 20:17 天地之灵 阅读(9741) | 评论 (2)编辑 收藏

仅列出标题  
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(3)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜