免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2459 | 回复: 1
打印 上一主题 下一主题

lua.vm.js—在JS虚拟机中运行Lua虚拟机 [复制链接]

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-03 09:21 |只看该作者 |倒序浏览
完整的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交互,或设置回调,具体如下面的例子所示:

print('hello' .. ' ' .. 'world!') – 这是Lua!

print(js.run('[0,1,2,3,4,5][3]')) – 在Lua中运行JS

-- 使用Lua与页面交互

local screen = js.global.screen print("you haz " .. (screen.width*screen.height) .. " pixels")

local window = js.global -- window是JS中的global对象 window.alert("hello from lua!") window.setTimeout(function() print('hello from lua callback') end, 2500)

local document = js.global.document print("this window has title '" .. document.title .. "'")

在一个虚拟机中运行另一个虚拟机,性能是个重要的问题。据Zakai介绍,基准测试显示,这种情况下性能达到了原生代码的50%,可以和其他编译到asm.js的C代码媲美,对特定场景而言已经足够好了。

有些情况下的确有太多性能问题,但也存在一些情况性能是可以接受的。特别需要记住的是,Lua虚拟机通常比Python和Ruby等其他动态语言快得多。即使这些语言不算超快,但它们在很多场景下都有应用。

库的大小也是问题,这里库小的出奇,gzip压缩后在200KB左右。

Zakai提到,在一个虚拟机中运行另一个虚拟机,还有一些问题需要处理:

有些问题非常棘手,比如,我们无法跨虚拟机进行循环回收,如果一个Lua对象和一个JavaScript对象都没有被任何东西引用,但却彼此引用,那么要释放它们就需要能够遍历两个虚拟机中的整个堆,这样不仅这类Lua对象无法回收,普通的JavaScript对象也无法回收,基本上要用我们自己的垃圾回收来代替浏览器的处理了。出于安全和性能的原因,JavaScript引擎不允许我们这么做。我们能做的就是让Lua保存指向JavaScript对象的强引用,在Lua对这样的引用进行垃圾回收时,自动释放这些JavaScript对象。这带来了一些限制,但重点是不要忘了,一般而言跨虚拟机进行循环回收在计算机科学中也是一个难解问题。将一个虚拟机中的对象完整地在另一个虚拟机中实现,这是唯一最简单的情况,但大部分情况下这是不可能的(除此之外,比如有些Lua对象会有finalizer,即__gc方法,这无法在JavaScript中实现) ,而且就算能实现,性能也是问题。还请注意,在Web浏览器中实现两个独立的虚拟机也会遇到这类问题。

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。而这一切都可以归结为浏览器市场份额和优化其解决方案的能力。

查看英文原文:lua.vm.js – Running Lua VM in a JavaScript VM
                        
本文来自ChinaUnix新闻频道,如果查看原文请点:http://news.chinaunix.net/opensource/2013/0602/2791690.shtml

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
2 [报告]
发表于 2013-06-22 15:07 |只看该作者
性能相当差
只有达到了原生代码的50%
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP