InfoQ|Micro Runtime,跨越嵌入式到云端的新型容器:WebAssembly( 二 )


WAMR最早是“北海”团队的一个内部创新项目 , 其目标是为英特尔广泛的产品线提供一个通用的托管代码运行环境 。 它在许多场景都能起到关键作用 , 例如在SGX可信运行环境中提供第三方程序安全运行沙箱 , 支持第三方在平台的受控运行环境里进行场景创新 , 在边缘服务器上构建高性价比的托管代码运行环境 , 或利用硬件加速用户程序等 。
3WAMR的设计目标在开始WAMR项目之前 , 怎么定位该项目是一个关键问题 。 项目团队分析了WASM的几个关键特点 , 包括该标准在Web领域的巨大动能、前端语言C/C++/Rust的支持情况、LLVM对WASM的后端支持、极佳性能和较小的资源消耗等 , 认为WASM未来在嵌入式设备到云端都将具有极其广泛的应用空间 。 但是从另外一方面来看 , 目前WASM能提供比较成熟的支持的前端语言以C/C++/Rust为主 , 不易吸引Java、JS和Python开发者 。 同时 , 当前缺乏编程语言层API标准接口 , 导致短期内基于WASM之上不太可能出现一个像J2SE或者Node.js一样的系统性平台 。
基于以上分析 , 我们预期短期内WASM的应用很可能将分布在非常广泛的碎片化领域 , 这就要求WAMR的设计能充分应对各种可能的需求 。 在WAMR的最初设计中 , 定义了以下主要设计目标:
模块化和高度可定制化;
轻量级:要求产生很小的二进制文件与极低的内存消耗;
快:提供比其他语言如Java、JS更快的WASM解释器 , 通过编译方式运行能接近原生速度;
广泛:能够支持或者扩展到更多的架构和操作系统;
自主实现的预编译(AoT)WASM模块加载器:如果要在Linux之外的更多平台和环境 , 如IntelSGX和MCU系统上加载预编译WASM模块 , 不能只依赖Linux的系统模块加载功能 , 必须提供自己的AoT模块加载功能 。
经过漫长的开发迭代过程 , WAMR项目最终达到了一开始的设计目标:
菜单式编译框架 , 支持使用者选择不同的模块、功能和特性编译生成最终产品;
在资源消耗控制方面 , WAMR运行引擎的二进制文件在WASM解释器模式下只有85KB , 在AoT模式只有50KB 。 16KB内存就可以跑起来一个WASM小程序 , 经过一些微调内存消耗甚至可以低至8KB;
在性能方面 , WAMR提供了经典(classic)和快速(fast)两个解释器版本 , 相比常规的Java和JS解释器具有更高的速度 。 AoT和JIT模式通过LLVM编译框架把WASM生成目标平台的机器指令 , 能够达到接近GCC编译的速度;
AoT模块加载器能支持在Linux、SGX和ZephyrOS上加载预编译到机器指令的WASM模块 。
4WAMR功能与特性一览WAMR项目包括以下三部分功能:
iwasmVM内核 , 是WASM字节码的执行引擎 , 支持解释器、提前编译(AoT)和实时编译(JIT)多种模式;
WASM应用程序API和多实例应用框架;
WASM应用程序的动态管理;
WAMR支持许多非常有价值的特性 , 便于开发者使用 , 并且支持更广泛的应用场景 。 主要特性列举如下:
可选择libc支持方案:如果WASM应用程序需要调用libc的库函数 , 可以选择基于WASI的标准libc支持 , 或者在嵌入式环境中使用内建libc子集支持 。 开发者可以根据需要选择合适的模式
提供易用的C-API用来嵌入WAMR到宿主程序中
支持将NativeAPI导出到WASM应用程序
支持多个WASM模块动态加载与调用
提供线程管理和支持WASM应用使用pthread库
多架构的支持 , 目前WAMR已经支持如下多种架构:X86-64、X86-32、ARM、THUMB、AArch64、MIPS、XTENSA
多系统的支持 , 目前已经支持的系统包括Linux、Zephyr、MacOS、VxWorks、AliOS-Things、IntelSoftwareGuardExtension(Linux)、Android等
WAMR已经达到100%符合W3C发布的WebAssemblyMVP(MostViableProduct)版本 。 WebAssembly在W3C的发展非常活跃 , 从MVP至今已经又推出了许多新特性 , 通常称为Post-MVP特性 。