NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:505545
用户头像
臧秀涛 略懂技术的运营同学。

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

关注

评论

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

从recat源码角度看setState流程

flyzz177

React

轻量级的架构决策记录机制

京东科技开发者

团队管理 架构 软件架构 架构设计 架构决策

2022 年度“用 TDengine,写 TDengine”征文!

爱倒腾的程序员

数据库 tdengine 时序数据库

Kubernetes 跨集群流量调度实战

Flomesh

服务治理 Kubernetes 集群 流量管理

前端高频手写面试题集锦

helloworld1024fd

JavaScript

React-Hooks源码深度解读

flyzz177

React

前端leetcde算法面试套路之双指针

js2030code

JavaScript LeetCode

Flutter for Web 首次首屏优化——JS 分片优化

阿里巴巴终端技术

flutter 前端 Web 客户端

演讲实录|姚延栋:终止“试点炼狱”,智能汽车时代数字化转型与实践

YMatrix 超融合数据库

车联网 海量数据 超融合数据库 智能网联 YMatrix

看透react源码之感受react的进化

flyzz177

React

保护客户代码和应用安全,CodeArts有7招

华为云开发者联盟

云计算 后端 华为云 12 月 PK 榜 华为CodeArts

鸿蒙开发实例 | 鸿蒙原子化服务卡片开发完美体验

TiAmo

华为 鸿蒙 12月月更

前端leetcde算法面试套路之二叉树

js2030code

基于云原生的集群自愈系统 Flink Cluster Inspector

阿里云大数据AI技术

机器学习 flink 运维 云原生 12 月 PK 榜

转转用户画像平台实践

转转技术团队

大数据 用户画像 用户画像分析

从源码角度看React-Hydrate原理

flyzz177

React

“零容忍”监管,金融机构如何应对数据泄露风险?

极盾科技

数据安全

前端常见内存泄漏及解决方法

达摩

Web 内存泄露

超大规模大数据集群管理平台的架构优化及实践

移动云大数据

如何用 30s 讲清楚什么是跳表

飞天小牛肉

redis 面试 社招 校招 秋招

瓴羊Quick BI数据填报组件,实现智能化管理和高效挖掘利用

夏日星河

从react源码看hooks的原理

flyzz177

React

预训练时代的自然语言处理 魔搭社区NLP模型全解析

阿里技术

自然语言处理 NLP 大模型

Go语言性能剖析利器--pprof实战

京东科技开发者

Go pprof 优化技巧 Go 语言 #go

喜讯+1!袋鼠云数栈技术团队获“2022年度优秀开源技术团队”

袋鼠云数栈

开源

React源码分析(一)Fiber

flyzz177

React

IoT 设备定位服务——设备管理类

阿里云AIoT

物联网 API 定位技术

多线程永动任务设计与实现

小小怪下士

Java 多线程

Python中图像平滑方法的两种非线性滤波:中值滤波、双边滤波

华为云开发者联盟

Python 人工智能 华为云 12 月 PK 榜

假如面试官要你手写一个promise

helloworld1024fd

JavaScript

当云原生成为一种显学,对象存储和数据湖如何顺势而为

云布道师

对象存储 云存储

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