Skip to main content

wasm

https://zh.wikipedia.org/wiki/WebAssembly

WebAssembly(Wasm)是一种可以在现代 Web 浏览器中运行的新编码方式,它是一种低级的类汇编语言,具有紧凑的二进制格式,可以以接近本机的性能运行,并提供诸如 C / C ++,C#和 Rust 的语言带有编译目标,以便它们可以在网络上运行。它还被设计为与 JavaScript 一起运行,从而允许两者一起工作。通过 wiki 可以得知,WebAssembly 于 2019 年 12 月 5 日成为万维网联盟(W3C)的推荐,与 HTML,CSS 和 JavaScript 一起,成为 Web 的第四种语言。 从简介可以确定以下结论:

  • WebAssembly 的是一段二进制代码,本质是编译目标。
  • WebAssembly 相比于 JS 有明显的性能优势。
  • 可以用 C/C++等语言开发编译出 WebAssembly 代码,从而在浏览器中运行。

WebAssembly 的原理

我们都知道计算机只认识 0 和 1,也就是机器码,机器码可以说是看不懂的,因此,我们才会设计各种高级语言,然后再将语言编译为机器码,从而让计算机运行。但是计算机 CPU 架构不同,它的机器码标准也会有不同,常见的有 x86、ARM、AMD 64,所以高级语言在编译成可执行代码的时候都要指定目标架构。WebAssembly 不依赖于特定机器结构的目标汇编语言,虽然它不能直接放在任何一个平台运行,但是它本身非常接近机器码,所以可以被非常快速的翻译为对应架构的机器码。

为什么 WebAssembly 会更快

在 V8 从下图可以发现,js 引擎运行结构可以认识到,在 parse 这一步,会按行解析并调用函数,生成抽象语义树,一旦生成了 AST,V8 直接进入到机器码阶段。其后遍历树,生成机器码,就得到了编译好的函数。而 WebAssembly 像 Java 字节码一样,可以一次编译到处运行,。因此浏览器在处理 WebAssembly 文件时,可以迅速的将其转换成机器编码;所以它的运行会更快。

Q: 为什么会有 wasm 呢? A:

  • 前端项目业务越来越多,文件依赖关系越来越复杂,启动速度越来越慢等。
  • 除了代码量大,还有 js 自己的历史缺陷,没有类型限定的脚本语言,运行的效率有很大瓶颈。

Q: 什么时候该用 wasm 呢? A:

  • 对性能有很高要求的 App/Module/游戏
  • 在 Web 中使用 C/C++/Rust/Go 的库