眼见为实,耳听为虚,先上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感兴趣,在这里可以下载独立的js文件:
lua.js尚处于不完善状态,如果你决定尝试使用,务必关注本项目的更新,及时替换更新的版本!