InfoQ|WebAssembly如何演进成为“浏览器第二编程语言”?( 三 )


PNaCl 技术在当时看起来是一个非常理想的方案 , 其兼具高性能和易于分发的特点 , 但实际上在当时并没有受到非常强的支持 。 PPAPI 出现的时代正好是处于人们尽可能试图摆脱 Flash、Java Applet 等插件的时代 , 尽管当时 Chrome 已经直接集成了 NaCl 与 PNaCl , 但其运行在独立沙盒环境与使用独立 API 的方式 , 跟 Flash、Java Applet 等插件非常类似 。 同时 , 其开发难度、成本以及糟糕的兼容性问题(2011 年开始 Firefox 及 Opera 正式支持 PPAPI 及 NaCl)都成为了 NaCl/PNaCl 普及的最大障碍 。
让人惊艳的 asm.js谈到 asm.js 和 WebAssembly , 就不得不提其中的关键人物 Alon Zakai 。 2010 年 , Alon Zakai 结束了两年的创业项目 , 加入 Mozilla 负责 Android 版 Firefox 的开发 。 在 Mozilla 的本职工作之外 , Alon Zakai 继续编写着自己的 C/C++ 游戏引擎 。 在项目临近尾声之时 , Alon Zakai 突发奇想 , 想将自己的 C/C++ 游戏引擎运行在浏览器上 。 在 2010 年 , NaCl 还是一门非常新的技术 , 而 PNaCl 才刚刚开始开发 , 此时并没有一个非常好的技术方案能够将 Alon 的 C/C++ 游戏引擎跑在浏览器上 。 但好在 C/C++ 是强类型语言 , 而 JavaScript 是弱类型语言 , 将 C/C++ 代码编译为 JavaScript 代码在技术实现上是完全可行的 。 于是 Alon Zakai 自此开始编写相关的 Compiler 实现 , Emscripten(LLVM into JavaScript)由此诞生了!
InfoQ|WebAssembly如何演进成为“浏览器第二编程语言”?
本文插图

到 2011 年 , Emscripten 已经具备编译像 Python 以及 DOOM 等中大型项目的能力 , 与此同时 Emscripten 也在 JSConfEU 会议上首次亮相 , 并取得了一定的影响力 。 Mozilla 看到了 Emscripten 项目的巨大潜力(相较于 NaCl 而言对 Web 更加友好) , Brendan 及 Andreas 邀请 Alon 加入 Mozilla 的 Research 团队全职负责 Emscripten 项目的开发 , Alon Zakai 欣然接受并将工作的重心放在了如何提升 Emscripten 编译的 JavaScript 代码执行速度上 。
JavaScript 的弊端章节中我们可以看到 , 尽管 JavaScript 拥有 JIT(Just-In-Time) , 但由于 JavaScript 本身的语言特性 , 导致 JIT(Just-In-Time)难以被预测 , 在实际的生产环境当中 JIT(Just-In-Time)的效果往往并没有那么显著 。 为了使得 JavaScript 运行得更快 , 我们应该要更充分地利用 JIT(Just-In-Time) , 因此在 2013 年 , Alon Zakai 联合 Luke Wagner、David Herman 发布了 asm.js 。
asm.js 的思想很简单 , 就是尽可能明确对应的类型 , 以便 JIT(Just-In-Time)被充分利用 。 如下图示例所示:
InfoQ|WebAssembly如何演进成为“浏览器第二编程语言”?
本文插图

我们可以看到 , 对于add函数而言 , 由于传入参数y以及返回值进行了|0的操作 , 其能够很明确地为 JIT(Just-In-Time)指明对应的类型(i32) , 因此可以被 JIT(Just-In-Time)充分优化(不考虑后期 AOT 的情况) 。 通过添加类似的类型注解 , Emscripten 编译的 asm.js 在运行速度上相比普通 JavaScript 有了质的飞跃 。 在 Benchmark 中 , asm.js 能达到 Native 性能的 50% 左右 , 相比于普通的 JavaScript 代码而言取得了极大的性能提升 , 这无疑是让人兴奋的成果 。 但是 asm.js 自身也存在一些无法忽视的问题 , 其总体而言并不是一个非常理想的技术方案 。
InfoQ|WebAssembly如何演进成为“浏览器第二编程语言”?
本文插图

最显而易见的就是 asm.js 代码的“慢启动”问题 。 由于 asm.js 还是和 JavaScript 一样的文本格式 , 因此对于大中型项目而言 , 其解析花费的时间会非常长 , 无法与高效的二进制格式相提并论 。


推荐阅读