lua.vm.js——在JavaScript虚拟机中运行Lua虚拟机作者 Abel Avram ,译者 臧秀涛 发布于 2013年6月1日 | 讨论完整的Lua虚拟机不仅能在JavaScript虚拟机中运行,还能调用JS 代码,Mozilla以此显示出了asm.js的强大。 Alon Zakai是Mozilla的研究人员,主要从事Emscripten和asm.js方面的工作。lua.vm.js是他启动的一个项目,意在显示在JavaScript虚拟机中运行包含垃圾回收功能的虚拟机的可能性,这里运行的是Lua虚拟机。Lua虚拟机是用纯ANSI C编写的,所以很适合直接用Emscripten编译到asm.js中,据Zakai介绍,“只需对Makefile文件做一些小的修改”。 该项目甚至还提供了一个在浏览器中测试Lua的REPL。除运行Lua代码外,通过得到js.global对象,REPL还支持调用JavaScript代码,与DOM交互,或设置回调,具体如下面的例子所示:
在一个虚拟机中运行另一个虚拟机,性能是个重要的问题。据Zakai介绍,基准测试显示,这种情况下性能达到了原生代码的50%,可以和其他编译到asm.js的C代码媲美,对特定场景而言已经足够好了。
库的大小也是问题,这里库小的出奇,gzip压缩后在200KB左右。 Zakai提到,在一个虚拟机中运行另一个虚拟机,还有一些问题需要处理:
Mozilla并不像是要在浏览器中运行其他虚拟机,相反只是要显示Emscripten和asm.js的强大。Emscripten和asm.js正在与Google PNaCl进行着面对面的竞争,这两种解决方案都试图在浏览器中运行原生代码。(更多细节请参考InfoQ之前的报道:“讨论:我们是否需要一种通用的Web字节码?”) asm.js和PNaCl还存在一个相同的问题,那就是缺乏其他浏览器的支持。Chrome理论上可以运行asm.js代码,但性能相当差。比如,Lua虚拟机基准测试在Chrome运行的性能小于在Firefox夜间构建版上运行的30%,而Firefox上的性能是原生代码的50%。正因如此,对于Firefox运行原生代码的这种解决方案,除非Google在Chrome中进行针对性的优化,否则没有人会在Chrome中运行asm.js。而这一切都可以归结为浏览器市场份额和优化其解决方案的能力。 |
|