共计 1809 个字符,预计需要花费 5 分钟才能阅读完成。
1. WebAssembly 是什么?
WebAssembly 是一种可以使用非 javascript 编程语言编写代码并且能在浏览器上运行的技术方案。
2. WebAssembly 解决什么问题?
突破性能的瓶颈
这里不涉及过多技术性的问题。我们知道,在今天的浏览器中,JavaScript 是在虚拟机(VM)中执行的,该虚拟机能够最大化地优化代码并压榨每一丝的性能,这也使得 JavaScript 称为速度最快的动态语言之一。但尽管如此,它还是无法与原生的 C /C++ 代码相媲美。所以,WebAssembly 就出现了。
Wasm 同样在 JavaScript 虚拟机中运行,但是它表现得更好。两者可以自由交互、互不排斥,这样你就同时拥有了两者最大的优势——JavaScript 巨大的生态系统和有好的语法,WebAssembly 接近原生的表现性能。
大多数程序员会选择使用 C 语言来编写 WebAssembly 模块,并将其编译成.wasm 文件。这些.wasm 文件并不能直接被浏览器识别,所以它们需要一种称为 JavaScript 胶接代码(glue code,用于连接相互不兼容的软件组件,详见:http://whatis.techtarget.com/definition/glue-code)的东西来加载。
3. 应用在那些方面?
- 数据加密
- 网页游戏
- 密集计算
4. 还存在什么问题?
- 还是浏览器的兼容问题。
- WebAssembly 是没有自动垃圾回收的(需要手动处理)
- api 还不稳定
5. 给前端带来了什么?
wasm 是个好东西,但不会取代 js。
按官方的说法,wasm 不是 javascript 的替代品,它与 javascript 一同工作,是对 web 平台的补充。所以有了 wasm 的 js api。可以把 wasm 看成是当成 js 的加速器。
wasm 还不支持访问 dom,在未来,有计划让 wasm 调用 javascript,以此调用 js 支持的 api,因为 wasm 无法调用 web 的 api。当 wasm 可以调用 javascript 的时候,辅以 js 胶水代码(帮助 wasm 调用 webapi),让 wasm 甚至可以脱离 javascript(除了加载 wasm 和加载胶水 js 依赖),就完成整个 web 应用。 可能直接在 c ++ 中实现 webapi 的成本太大,如果每种语言都实现 webapi,就不如去实现胶水。
显然,这种机制的出现可以让 c ++(或者其他语言)直接实现 web 应用, 而实际上语言上的瓶颈对比 dom 操作的瓶颈来说,还是微不足道的。
wasm 实现了 c ++ 中的 SDL, OpenGL, OpenAL, 部分的 POSIX。代码最终还是要跑在客户端,所以可见很多功能实际上是被阉割的,好在 OpenGL 可以在 canvas 中运行, 所以我觉得,wasm 的出现,对于 h5 游戏的开发会有提升。
Guess Future
- h5 游戏搭配 wasm 会有很大的潜力,甚至搭配 pwa,让 h5 游戏可以处理更重的情景。
- 对 js 的冲击,按照现在 js 的份额(高),js 的灵活性(高),以及目前大部分 js web 应用的瓶颈问题(没明显瓶颈),时下的情况不足以让团队投入精力去搞这件事。
- 企业级产品或许可以投入精英人力搞基于 wasm 的应用,可以提高企业级 web 应用的体验。
- c 端业务以及活动需要的敏捷度、人力情况以及产品瓶颈都不允许团队大力搞 wasm。(招个靠谱的 js 已经很难了)。
6. 浏览器支持情况?
主流浏览器新版本中基本开始支持 WebAssembly
7. 总结
WebAssembly 比 JavaScript 执行更快是因为:
- 文件抓取阶段,WebAssembly 比 JavaScript 抓取文件更快。即使 JavaScript 进行了压缩,WebAssembly 文件的体积也比 JavaScript 更小;
- 解析阶段,WebAssembly 的解码时间比 JavaScript 的解析时间更短;
- 编译和优化阶段,WebAssembly 更具优势,因为 WebAssembly 的代码更接近机器码,而 JavaScript 要先通过服务器端进行代码优化。
- 重优化阶段,WebAssembly 不会发生重优化现象。而 JS 引擎的优化假设则可能会发生“抛弃优化代码重优化”现象。
- 执行阶段,WebAssembly 更快是因为开发人员不需要懂太多的编译器技巧,而这在 JavaScript 中是需要的。WebAssembly 代码也更适合生成机器执行效率更高的指令。
- 垃圾回收阶段,WebAssembly 垃圾回收都是手动控制的,效率比自动回收更高。