WebAssembly,火狐是最后的赢家吗?

735 阅读3分钟
原文链接: mp.weixin.qq.com

作者|金灵杰

编辑|郭蕾

自从 WebAssembly 标准发布以及各大浏览器完成对其默认支持之后,WebAssembly 成为前端热门话题。在 WebAssembly 之前,类似的前端二进制标准有火狐主导的 asm.js Chrome 主导的 PNaCl。二者均用于将后端 C/C++ 代码用于前端,作为它们折中方案,WebAssembly 标准更偏向于 asm.js 的实现。Chrome 在支持了 WebAssembly 标准之后,宣布将放弃对 PNaCl 的支持。

作为前端标准,PNaCl 在创立之初就有其先天不足。在设计上,PNaCl 代码和前端代码(JavaScript、HTML 等)高度独立,并且 PNaCl 代码运行在独立进程中,这使得 PNaCl 代码和页面代码交互成本非常高(需要通过 IPC 方式)。另外,处于安全考虑,PNaCl 进程运行在沙箱环境中,Chrome 为此定义了一套 API,称为:Pepper。Pepper 定义的 API 中,有许多和现行 Web 标准重复。

更加严重的问题是,不论是 Pepper 还是 PNaCl,都没有明确的二进制代码规范。因此非 Chrome 浏览器如果要兼容 PNaCl 插件,要么反向工程 Pepper 来自己实现一套接口实现,要么从 Chromium 工程中导入其中的实现代码。无论哪种方式,都需要和 Google 的修改同步。这对于开发者来说是不可接受的。

相反,asm.js 实现方式从一开始就尽量贴近前端开发和已有前端标准。asm.js 用 Javascript 数组来表示内存,并将 C/C++ 代码编译成 Javascript 以操作这个数组。这种实现方式相比 PNaCl 有一个很大的优势:所有代码在同一个 JS 虚拟机中运行,可以方便的和其他 JavaScript 代码、DOM 进行交互。另外,这样的实现没有引入新的 API,因此文档相关的工作也比较少。

综上所述,WebAssembly 标准最终和 asm.js 比较接近,它实现在 JS 虚拟机中,可以和页面 JavaScript 之间方便的进行调用。WebAssembly 标准除了新增加载和链接 WebAssembly 代码相关的 API 之外,没有定义新的平台相关 API。和 asm.js 不同的是,WebAssembly 完整定义了二进制代码规范,相关规范文档已经完成。

当然,Google 和其他团队在 WebAssembly 标准的制定上也功不可没。针对 PNaCl 插件,Google 已经发布了迁移文档。可以说,WebAssembly 标准的发布,真正的赢家是开发者!

今日荐文

点击下方图片即可阅读

sofish 深度访谈:帮你理清前端工程师及大前端团队的成长问题!


视野拓展

推荐一个前端人不可错过的会议:全球架构师峰会,邀请了上百位国内外顶尖技术专家前来分享各业务的核心架构设计,从 Web 协议底层优化到超级 App 的系列魔改,这里只谈最优秀的架构实践。

大会将于 7 月 7 日深圳开幕,目前 9 折最后一周,点击“阅读原文”获取 100+ 落地案例,看看对你有何启发?

前端之巅

「前端之巅」是 InfoQ 旗下关注前端技术的垂直社群,加入前端之巅学习群请关注「前端之巅」公众号后回复“加群”。推荐分享或投稿请发邮件到 editors@cn.infoq.com,注明“前端之巅投稿”。