第 22 期 - WebAssembly 常见引擎的剖析
摘要
本文先介绍了 WebAssembly 引擎的通用架构,然后分别阐述了 wasmtime、wasm3、WasmEdge、wasm - micro - runtime 和 V8 几款引擎的结构特点、项目现状、性能表现、标准支持情况与应用场景等。
一、前言
文章开篇表明要讨论 WebAssembly 程序运行的核心组件——引擎。首先会介绍语言引擎的主要组成部分,构建概念模型,之后再介绍几款流行的开源引擎各自的特点。
二、引擎通用架构
- 加载与解析
- 需要加载器和链接器将程序文件加载到内存中,解析符号,转化为可访问的内存地址。这是程序运行的第一步,例如在 WebAssembly 引擎中,这一步是后续执行的基础。
- 执行程序
- 对于 JavaScript 这类脚本程序,需要编译组件将程序文本编译为指令序列。然后引擎可以解释执行指令序列,或者进一步编译为物理机器的可执行指令后执行,这需要执行器。
- 线程调度
- 目标程序可能单线程或并发执行,所以需要线程调度器来管理线程。
- 内存管理
- 程序运行中需要动态内存分配和回收,这就要求有内存管理器来负责分配和回收内存,考虑到内存资源有限性,内存管理很重要。
- 外部资源访问
- 目标程序可能需要访问外部资源,如文件系统、网络端口等,所以引擎需要提供语言扩展或者外部访问接口。
三、常见的 WebAssembly 引擎
3.1 wasmtime
- 结构特点
- 编译部分:
- 总体分为编译、运行时和工具三部分。编译部分包含 4 个组件,即 wasm - environ、wasm - cranelift、wasm - jit、wasm - obj。wasm - environ 是编译入口,wasm - cranelift 负责函数级即时编译生成 JIT 代码,wasm - jit 管理可执行内存存储 JIT 代码,wasm - obj 根据编译信息生成 ELF 映像。
- 运行时部分:
- 主体是 wasm - runtime,维护 wasm 模块运行时数据结构,主要有 Store 和 InstanceHandle 两类重要实体。Store 是存储数据结构的容器且是隔离单元,InstanceHandle 是 wasm 模块实例的底层表示。此外还有 wasmtime - fiber 支持异步功能。
- 工具部分:
- 包含 wasm - cache(管理文件缓存,默认在 CLI 中启用)、wasm - debug(实现调试信息转换)、wasm - profiling(分析 JIT 代码)。
- 编译部分:
- 项目现状
- 由 Bytecode Alliance 推出,对 WebAssembly 相关标准支持完整度高,支持多种提案。提供多种语言接口,如 C/C ++、Python、.NET、Go 和 Ruby 等。2022 年 9 月发布 1.0 版本,被 Shopify、Fastly 等组织引入,应用于 Serverless、区块链等场景,能带来性能提升,如 Shopify 相关业务执行性能提升 50%。
3.2 wasm3
- 结构特点
- 是基于解释器执行的轻量级引擎,最大特点是依靠纯解释器执行 WebAssembly 指令,没有 JIT/AOT 编译。
- 采用指令线索化和寄存器指令转译这两个关键设计。指令线索化使得解释器“自驱动”执行指令,便于尾调用优化;寄存器指令转译将 wasm 指令序列转译为更高效的 M3 指令,M3 指令的解释函数有固定函数签名。
- 项目现状
- 可在 iOS 等设备上运行,具有跨平台优势,移动端二进制产物体积小。支持多种宿主语言接入,如 C/C ++、Python、Rust 等。支持 WASI,能独立运行 wasm 函数。但对社区标准规范支持有待完善,已被众多项目引入,如 wasmcloud、Siemens Opensource 等,抖音 APP 也已接入。
3.3 WasmEdge
- 结构特点
- 由 CNCF 托管,面向边缘计算、云原生和去中心化应用。是编译型引擎,使用 LLVM 作为编译器后端,相比 wasmtime 生成的指令更优,执行速度更快。
- 社区提供丰富扩展能力,如以 wasm 模块形式提供 QuickJS 引擎能力,在此基础上提供一揽子基于 JavaScript 的能力扩展,包括 Node.js Compatibility、TensorFlow、React SSR、Networking APPs 等。
- 项目现状
- 2022 年 11 月被 Docker 集成,在云原生场景中能让用户无缝切换 JavaScript 应用,降低切换成本。
3.4 wasm - micro - runtime
- 结构特点
- 简称为 WAMR,隶属于 Bytecode Alliance,适用于嵌入式平台、IoT 设备等场景。二进制产物轻量,纯 AOT 配置产物体积约 50KB。
- 同步支持解释与编译两种方式执行 wasm 程序,编译器基于 LLVM 构建,JIT 或 AOT 执行方式速度接近原生,是 2023 年运行速度最快的引擎。
- 项目现状
- 对社区标准支持完整度高,除了 MVP 特性全部支持外,对 Post - MVP 中的一些提案也已实现,但部分 JS - API 接口未支持,已被 Hyperledger Private Data Objects 等项目使用。
3.5 V8
- 结构特点
- 使用编译后执行方式,通过 TurboFan 或者 LiftOff 编译后端进行 JIT 编译后执行。
- 项目现状
- 2021 年测试数据显示 nodejs 在 Benchmark 上性能领先 wasmtime,不支持 WASI 标准,但对 WebAssembly 的 JS API、MVP 以及 Post - MVP 等核心提案都完整支持,还实验性支持探索阶段的提案。可通过 nodejs 命令行工具运行包裹 wasm 模块的 JavaScript 程序,nodejs 也提供 WASI 扩展。
四、总结
文章先构建了引擎概念模型,然后重点讨论了 wasmtime、wasm3、WasmEdge、wasm - micro - runtime 和 V8 这几款引擎的执行方式、性能表现、标准完整程度与应用场景,还提到还有其他 wasm 引擎因篇幅未介绍,并且推荐对引擎内部实现感兴趣的读者阅读相关章节。
扩展阅读
Made by 捣鼓键盘的小麦 / © 2025 Front Talk 版权所有