说说你对 WebAssembly 的了解?

阅读 1.8k
1 个回答

WebAssembly 是什么?

  • ​WebAssembly(wasm)是一种 【新的编码方式】,可在现代的网络浏览器中运行,属于一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的运行性能
  • wasm ​可以作为 C/C++/rust 等语言的一个编译目标,以便它们可以在 Web 浏览器上运行,即可在浏览器环境中运行由 c/c++/rust 等语言编译后的 wasm 文件
  • ​wasm 是一种低层次的汇编语言,但是它也有一种人类可读的文本格式,使得人们可编写代码、查看代码、可调试代码。
  • ​wasm 被设计与其他 Web 技术兼容运行,并且保持向后兼容性,即 wasm 不是为了替代 JS ,而是作为 JS 的一种扩展方式

WebAssembly 的作用

  • ​可以运行一些原来在 javascript 中没有的库,比如 ffmpeg、opencv 等库,通过将其编译成 wasm 文件,然后运行在浏览器环境
  • ​提供更高的代码运行性能

    • ​JavaScript 执行过程中,JS 引擎会对执行次数较多的 function 记性优化,将其代码编译成 Machine Code 后打包送到顶部的 Just-In-Time(JIT) Compiler,下次再执行这个 function 就可直接执行编译好的 Machine Code,不需要通过【JS —> AST —> Bite Code —> Machine Code 】
    • ​由于 JavaScript 是动态语言,上一秒可能是 Array,下一秒就变成Object,这意味上一次引擎所做的优化,就失去了作用,又得再一次进行优化处理

WebAssembly 的优势

  • ​抓取 WebAssembly 比 JavaScript 花费的时间更少,即便在压缩的情况下
  • ​编码 WebAssembly 比解析 JavaScript 所花费的时间更少
  • ​WebAssembly 比 JavaScript 更加接近 机器码,且在服务端就已经经过了优化,所以它 编译 和 优化 需要的时间更少
  • ​WebAssembly 不需要 重优化,因为它有明确的类型以及内置的额外信息,所以 JS 引擎 不需要像优化 JavaScript 那样对它进行推测
  • ​执行阶段花费的时间更少,开发者不必为了写出性能一致性更高的代码而去了解一些编译器的技巧和陷阱
  • ​不需要垃圾回收机制,因为内存都是手动管理的

现实
​目前 90% 以上的场景都可以不需要用到 wasm,基本上 优化算法 和 逻辑 就可以解决大部分的问题,在运算时间 100ms 以下的场景中没有太大的必要性,因此目前 wasm 通常使用在图片、音视频、以及一些原有的非 js 库场景,或者在某些运算量很大的场景

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题