WebAssembly 不完全解读

23,316次阅读
没有评论

共计 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)的东西来加载。

WebAssembly 不完全解读

3. 应用在那些方面?

  1. 数据加密
  2. 网页游戏
  3. 密集计算

4. 还存在什么问题?

  1. 还是浏览器的兼容问题。
  2. WebAssembly 是没有自动垃圾回收的(需要手动处理)
  3. 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

WebAssembly 不完全解读

7. 总结

WebAssembly 比 JavaScript 执行更快是因为:

  • 文件抓取阶段,WebAssembly 比 JavaScript 抓取文件更快。即使 JavaScript 进行了压缩,WebAssembly 文件的体积也比 JavaScript 更小;
  • 解析阶段,WebAssembly 的解码时间比 JavaScript 的解析时间更短;
  • 编译和优化阶段,WebAssembly 更具优势,因为 WebAssembly 的代码更接近机器码,而 JavaScript 要先通过服务器端进行代码优化。
  • 重优化阶段,WebAssembly 不会发生重优化现象。而 JS 引擎的优化假设则可能会发生“抛弃优化代码重优化”现象。
  • 执行阶段,WebAssembly 更快是因为开发人员不需要懂太多的编译器技巧,而这在 JavaScript 中是需要的。WebAssembly 代码也更适合生成机器执行效率更高的指令。
  • 垃圾回收阶段,WebAssembly 垃圾回收都是手动控制的,效率比自动回收更高。

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计1809字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)