写点什么

lua.vm.js——在 JavaScript 虚拟机中运行 Lua 虚拟机

  • 2013-06-01
  • 本文字数:1594 字

    阅读完需:约 5 分钟

完整的 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

2013-06-01 09:505582
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 131.3 次阅读, 收获喜欢 34 次。

关注

评论

发布
暂无评论
发现更多内容

如何区分纯代码、低代码、无代码三者的关系?

这我可不懂

软件开发 低代码 无代码 JNPF

Visio Viewer for Mac激活版 查看和编辑Visio文件

iMac小白

mac右键助手 MouseBoost Pro 3.3.4破解版

iMac小白

item_get-1688商品详情在跨境电商中的营销策略创新

技术冰糖葫芦

API

【第七在线】国际市场扩张与商品计划:跨越地域的挑战与机会

第七在线

海外云手机在跨境外贸中的作用

Ogcloud

云计算 跨境电子商务 跨境电商 电子商务

虾皮商品评论接口(Shopee.item_review)|虾皮API接口指南

tbapi

shopee API 虾皮商品评论接口 虾皮商品评价接口 虾皮评论接口 shopee 商品评论接口

「代码舞者」2023开放原子开发者大会——开源大侠秘闻

开放原子开源基金会

开源 开发者 算法

华为云Astro,让业务专家秒变“技术大拿”

华为云PaaS服务小智

低代码 华为云

现在大火的低代码是什么?有哪些优势?

高端章鱼哥

低代码开发 应用程序 JNPF

【案例】第七在线商品组合计划赋能安德玛每一个加盟商精准计划

第七在线

2024年市场上最好的免费开源工单管理系统六强

易成管理学

开源 工单管理

【第七在线】媒介投产分析 Colony Brands每一个宣传画册运营产出收益

第七在线

天猫商品评论数据接口(Tmall.item_review)

tbapi

天猫API接口 天猫商品评论接口 天猫评论接口 天猫商品评论内容接口 天猫评论API接口

使用TikTok云手机轻松拓展全球市场

Ogcloud

云计算 TikTok 手机云服务

权威认可,天翼云云原生一体机iStack斩获“2023云原生企业TOP50”第一名

编程猫

SecureFX for Mac(ftp文件传输工具)附注册码 v9.4.3破解激活版

mac

苹果mac Windows软件 SecureFX 文件传输客户端

热热热!开放原子开发者大会议题征集火爆!

开放原子开源基金会

Java 开源 程序员 开发者 算法

融云观察:给 ChatGPT 加上声音和脸庞,AI 社交的多模态试验

融云 RongCloud

AI 设计 API 社交 ChatGPT

浅析 ArrayList

不在线第一只蜗牛

Java 开发语言

MongoDB中的分布式集群架构

EquatorCoco

分布式 索引 db 集群架构

Tower for Mac注册激活版下载(强大的Git客户端)

iMac小白

Metasequoia 4 for Mac v4.8.6b激活版

iMac小白

博睿数据参与支持2023年度证券期货业标准研究课题获评“优秀”

博睿数据

“基于inBuilder低代码平台开源社区版的应用开发”创新赛获奖队伍公示

inBuilder低代码平台

Navicat Premium for Mac(多协议数据库管理工具) 16.3.4中文破解激活版

mac

数据库管理工具 苹果mac Windows软件 Navicat Premium 16

React高手都会用的useMemo有什么用的?

互联网工科生

性能优化 React useMemo

【第七在线】服装企业商品部关注的关键问题与解决策略

第七在线

数据库产品层出不穷,金融行业如何选择?|FCon 专访

SelectDB

数据库 大数据 数据仓库 数据分析 apache doris

速度与稳定性的完美结合:深入横测ToDesk、TeamViewer和AnyDesk

阿Q说代码

远程办公 ToDesk TeamViewer AnyDesk

Integrity Plus for Mac:数据完整性校验的得力助手

iMac小白

lua.vm.js——在JavaScript虚拟机中运行Lua虚拟机_JavaScript_Abel Avram_InfoQ精选文章