wasm基本概念
参考:《WebAssembly原理与核心技术》
两种运行方式
- JIT:即时编译,也代表动态编译或动态解释,即代码是边翻译边运行,对于高频代码可以使用缓存的方式提高效率,优点是编译速度快,缺点是运行慢,常见于脚本语言
- AOT:预编译,即在程序执行前编译为机器码,优点是运行速度快,缺点是编译时间长
编译流程(简单)
主要分为前端、(中端)、后端
- 前端
前端的主要作用是预处理和各种分析(词法分析、语法分析等),
然后生成IR方便后续处理
- 中端
中端的作用是对IR进行分析和优化,例如常量折叠、死代码消除、函数内联
常量折叠:将常量表达式计算求值,并用求得的值来替换表达式,放入常量表
- 后端
后端的主要作用是将IR翻译成目标代码,即平台相关的汇编代码,最后由汇编器编译为机器码
如果要创建一个新语言只需新写一个编译器前端即可;如果要支持一个新平台,只需添加一个新的编译器后端即可
Wasm概念
- 全称WebAssembly,名为Web汇编,既然叫汇编了,那它肯定接近机器语言
一般由高级语言编译而来,例如C/C++、Rust、Go等,wasm实际属于编译后端的目标代码
从浏览器的角度来看又像是IR,需要被JIT/AOT编译器编译成平台相关的机器码 - wasm的基本单位是模块,而模块又基本分为以下两种格式:
- 二进制格式
- 文本格式
- 内存格式(in-memory)
- wasm需要运行于wasm虚拟机,wasm虚拟机是一种栈式虚拟机
- 一个wasm模块从二进制到执行分为三个阶段:解码、验证、执行:
- 解码阶段将二进制模块解码为内存格式;
- 验证阶段对模块进行静态分析,确保模块的结构满足规范要求,且函数的字节码没有不良行为;
- 执行阶段可以进一步分为实例化和函数调用两个阶段;