如果部分代码执行得异常频繁 , 那么自然的这部分解释执行的代码会被发送给优化编译器(Optimising Compiler)进行更高程度的优化 , 从而创建并编译出相比 warm 阶段更高效的机器码执行代码版本 。
与此同时 , 在创建这些高度优化的机器码执行代码期间 , 编译器将会严格限制执行代码的适用类型(比如仅适用于 Number/String 或某些特定类型参数) , 并且在每次调用执行前都会检查参数类型 。如果匹配则使用这些高度优化的机器码执行代码 , 否则将会回退到 warm 阶段生成的机器码执行代码或是直接解释执行 。
JavaScript 有了 JIT(Just-In-Time)后就能高枕无忧了么?不尽然 。从上面的介绍中我们可以看到 , JIT(Just-In-Time)引擎的优化并非是完全无代价的 。同时由于 JavaScript 自身的灵活性 , 如果我们编写 JavaScript 代码时并没有将数据类型严格固定 , 那么 JIT(Just-In-Time)的效果将会大打折扣 。在 Google V8 团队的《JIT-less V8》文章中我们可以看到 , 使用JIT-less 模式的V8 在运行Youtube 的Living Room 页面时 , 其测试成绩与使用JIT 的V8 实际差距仅为6% 。这个测试侧面反应了JIT 在生产中并不是完全的“性能银弹” 。
![WebAssembly 如何演进成为“浏览器第二编程语言”?](http://img.jiangsulong.com/220420/23551QK2-1.jpg)
文章插图
JIT-less 模式下 V8 与基线的对比
那么 JavaScript 能变得更快吗?还是说我们需要其他技术来解决 JavaScript 的性能问题?此时 NaCl 和 PNaCl 应运而生 。
NaCl 与 PNaCl尽管 JavaScript 由于 JIT 的加入在性能上有了很大的提升 , 但在许多性能敏感的领域 , JavaScript 仍旧无法满足需求 。因此在 2008 年 , Google 的 Brad Chen、Bennet Yee 以及 David Sehr 开源了 NaCl 技术 , 2009 年 , NaCl 技术正式达到生产可用状态 。NaCl 全称为“Native Client” , 其由 C/C++ 语言编写并定义了一套 Native Code 的安全子集(SFI 技术) , 同时执行于自己独立的沙盒环境之中 , 以防止安全性未知的 C/C++ 代码对操作系统本身产生危害 。
NaCl 应用及其模块在性能上与原生应用的差距非常小 , 但由于 NaCl 与 CPU 架构强关联且不具有可移植性 , 需要针对不同的平台进行开发和编译 , 导致开发者无法自由分发 NaCl 应用及模块 。为了解决这个问题 , NaCl 改进技术 PNaCl 出现了 。
![WebAssembly 如何演进成为“浏览器第二编程语言”?](http://img.jiangsulong.com/220420/23551U106-2.jpg)
文章插图
NaCl 的性能损耗极小
PNaCl 的全称为"Portable Native Client" , 其通过替换 Native Code 为 LLVM IR 子集并在客户端编译为 NaCl 的方式解决了 NaCl 的分发问题 。PNaCl 不依赖于特定的 CPU 架构 , 更易于被部署和使用 , “一次编译 , 到处运行”在 PNaCl 上得到了实现 。但同样的 , PNaCl 也是运行在自己的独立沙盒之中 , 其无法直接的访问 Web APIs , 而是需要通过一个名为“PPAPI”的接口来与 JavaScript 通信 。
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)由此诞生了!
推荐阅读
- 教你如何挑选汝窑茶具,专家教您如何挑选茶具
- 抖音B站等自媒体视频尺寸如何设置?
- 无线传感器该如何挑选?应注意哪些要素?
- 如何在 Ubuntu 上安装最新版本的 Handbrake
- 新技术不断刷新我对测试工作的认知!如何进行机器语音交流测试?
- 喝浓茶心悸如何处理,喝浓茶好不好
- 金边玫瑰花茶有假吗,如何泡玫瑰花茶
- 黄山毛峰如何冲泡,如何辨别黄山毛峰的好坏
- 红茶茶包如何喝,芙蓉红茶
- 如何用excel绘制出高大上的图表