what?
WebAssembly(缩写为 Wasm)是一种基于栈式虚拟机的二进制指令格式。Wasm 是一种底层类汇编语言,能在 Web 平台上以趋近原生应用的速度运行。C/C++/Rust 等语言将 Wasm 作为编译目标语言,可以将已有的代码移植到 Web 平台中运行,以提升代码复用度。
Wasm 的特点:
- 层次低,尽量接近机器语言,这样解释器才更容易进行 AOT/JIT 编译,以趋近原生应用的速度运行 Wasm 程序;
- 作为目标代码,由其他高级语言编译器生成;
- 代码安全可控,不能像真正的汇编语言那样可以执行任意操作;
- 代码是平台无关的(不能是平台相关的机器码),可以跨平台执行,采用了虚拟机/字节码技术。
Wasm 目前已经在浏览器端的图像处理、音视频处理、游戏、IDE、可视化、科学计算等,以及非浏览器端的Serverless、区块链、IoT 等领域有一定的应用:很棒的 WebAssembly 应用程序的精选列表。
模块
Wasm 模块主要有以下 4 种表现形式:
- 二进制格式 —— Wasm 的主要编码格式,以 .wasm 后缀结尾。
- 文本格式 —— 主要是为了方便开发者理解 Wasm 模块,或者编写小型的测试代码,以 .wat 后缀结尾,相当于汇编语言程序。
- 内存格式 —— 模块加载到内存的表现,该表现形式与具体的 Wasm 虚拟机的实现有关,不同 Wasm 虚拟机的实现有不同的内存表示。
- 模块实例 —— 如果将内存格式理解为面向对象语言中的类,那模块实例就相当于“对象”。
各个格式之间的关联如下:
- 二进制格式主要由高级编程语言编译器生成,也可通过文本格式编译生成。
- 文本格式可以由开发者直接编写,也可由二进制反编译生成。
- Wasm 解释器通常会将二进制模块解码为内部形式,即内存格式(比如 C/C++ 结构体),然后再进行后续处理。
Wasm 二进制文件被执行主要分 3 个阶段:解码、验证、执行
- 解码阶段:将二进制格式解码为内存格式。
- 验证阶段:对模块进行静态分析,确保模块的结构满足规范要求,且函数的字节码没有不良行为(例如调用不存在的函数)。
- 执行阶段:进一步分为实例化和函数调用两个阶段。