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模块从二进制到执行分为三个阶段:解码、验证、执行:
    • 解码阶段将二进制模块解码为内存格式;
    • 验证阶段对模块进行静态分析,确保模块的结构满足规范要求,且函数的字节码没有不良行为;
    • 执行阶段可以进一步分为实例化和函数调用两个阶段;