跨越嵌入式到云端的新型容器:WebAssembly Micro Runtime

2020 年 7 月 23 日

跨越嵌入式到云端的新型容器:WebAssembly Micro Runtime

2019 年 11 月,Mozilla、英特尔、RedHat 和 Fastly 公司宣布成立字节码联盟(Bytecode Alliance),英特尔的 WebAssembly Micro Runtime(WAMR)和 Mozilla 主导的 WASMTIME 成为转入字节码联盟的第一批核心开源项目。字节码联盟的目标是基于 WebAssembly 和 WebAssembly System Interface(WASI)等标准创建一个安全、高效和模块化的新运行引擎(Runtime)环境和语言工具链,同时推广让尽可能多的平台和设备使用它们。


字节码联盟自诞生起就得到了业界大量关注。本专题将围绕字节码联盟的 WAMR 开源项目展开,通过一系列文章依次介绍 WAMR 项目的背景、使命、技术特点、最新应用场景、使用技巧、技术内幕以及社区发展等各方面情况,借此帮助更多开发者了解 WebAssembly(简称 WASM)技术在浏览器之外的应用潜力,并在自己的领域用上这项技术。本文作为专题的第一篇文章,将对 WAMR 进行概要性的介绍。


为什么要在浏览器之外使用 WebAssembly?


很多人心中可能有一个疑问:我把 C/C++或者 Rust 程序直接编译成目标机器码就可以了,为什么还要用 WebAssembly?这里首先要介绍 WebAssembly 的沙箱功能。当程序编译成 WASM 模块,再加载到运行引擎中时,实际上你的模块运行在其私有的沙箱中。沙箱中的程序不能访问沙箱以外的地址空间,否则将被运行引擎终止并返回异常,同时 WASM 程序调用 API 来访问系统资源时也会受到运行引擎的监管。这样的沙箱功能可以在许多场景下提供传统的原生编译程序无法支持的功能。


WebAssembly 的许多特性在不同环境下可以带来各种价值,下面简单列举一二:


  1. 安全运行第三方代码:这个功能在云端或者边缘计算中非常有意义,也是现代容器技术如Docker的核心价值之一。在移动设备、物联网设备、智能小家电以及可信运行环境上对这样的功能也有非常强烈的需求。

  2. 跨平台与环境的应用:考虑到WebAssembly是由W3C定义的标准化字节文件格式,当某些产品需要提供类似浏览器方式来装载第三方模块时,使用WebAssembly作为媒介格式是一个非常有吸引力的方案。假设你有一个很好的图像识别算法,你可以把你的算法以WASM模块的方式发布。其他人通过集成WAMR这样的引擎就可以在不同架构、不同平台、不同环境调用这个算法,比如在云端容器、可信执行环节(TEE)、物联网设备上都可以调用。

  3. 超轻量级:WASM规范的设计充分考虑了在浏览器上需要通过网络从服务器端下载并即时运行的需求,操作码的设计相当精简。通过开发阶段的编译不再需要对下载程序进行文本解析,实例的对象与内存模型也较为简单。这些特点使WASM模块可以非常快地完成加载进入执行状态,创建一个执行实例只需要很少量的资源。

  4. 高性能:WebAssembly的字节码设计充分考虑了即时编译的友好性,不仅可以达到很快的编译速度,还可以获得很高的运行速度。

  5. 动态模块加载:这个功能在小设备上尤其有用,过去固件必须统一编译、统一更新,如今通过固件中的WASM运行引擎,可以动态加载和执行WASM模块。

  6. 重用海量C/C++库资源: 你也许需要在JS、Java或者Python程序中调用一些C/C++库,传统方式只能使用各种语言自身的绑定接口来集成这些第三方C/C++库。现在我们可以把第三方C/C++库源程序编译成WASM模块,然后通过先绑定WAMR或者其他WASM引擎来执行WASM模块。例如在JVM上通过JNI绑定了WAMR,就不用再使用JNI去绑定其他C/C++库了。



WebAssembly Micro Runtime 开源项目的诞生


2019 年 5 月,英特尔公司在 GitHub 上开源了 WebAssembly Micro Runtime 项目(简称 WAMR)。


创建 WAMR 项目的是英特尔一支计算机语言运行时(runtime)技术团队,在英特尔内部称为“北海”团队。 “北海”这个名称源自北京北海公园,这也是从 2010 年开始开发的一个可以兼容 Java 语言的轻量级虚拟机项目的内部代码。因为英特尔公司习惯使用地名作为产品内部代码,所以这支位于北京的中国团队就选择了北海作为产品代码,后来这个名字逐渐变成了这个团队的名称。“北海”团队成员从最早在 Apache Harmony 项目上做 JVM 开发开始,一直深耕托管运行时技术领域,目前更多关注 Web 领域的 WebAssembly 和 V8 运行引擎技术。


WAMR 最早是“北海”团队的一个内部创新项目,其目标是为英特尔广泛的产品线提供一个通用的托管代码运行环境。它在许多场景都能起到关键作用,例如在 SGX 可信运行环境中提供第三方程序安全运行沙箱,支持第三方在平台的受控运行环境里进行场景创新,在边缘服务器上构建高性价比的托管代码运行环境,或利用硬件加速用户程序等。


WAMR 的设计目标


在开始 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之外的更多平台和环境,如Intel SGX 和 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模块。


WAMR 功能与特性一览


WAMR 项目包括以下三部分功能:


  • iwasmVM内核,是WASM字节码的执行引擎,支持解释器、提前编译 (AoT) 和实时编译 (JIT)多种模式;

  • WASM 应用程序API和多实例应用框架;

  • WASM 应用程序的动态管理;


WAMR 支持许多非常有价值的特性,便于开发者使用,并且支持更广泛的应用场景。主要特性列举如下:


  • 可选择libc支持方案:如果WASM 应用程序需要调用libc的库函数,可以选择基于WASI的标准 libc支持,或者在嵌入式环境中使用内建libc子集支持。开发者可以根据需要选择合适的模式

  • 提供易用的C-API用来嵌入WAMR到宿主程序中

  • 支持将Native API导出到 WASM 应用程序

  • 支持多个WASM模块动态加载与调用

  • 提供线程管理和支持WASM应用使用pthread 库

  • 多架构的支持,目前WAMR已经支持如下多种架构:X86-64、X86-32、ARM、THUMB、AArch64、MIPS、XTENSA

  • 多系统的支持,目前已经支持的系统包括Linux、Zephyr、MacOS、 VxWorks、 AliOS-Things、 Intel Software Guard Extension (Linux)、Android等


WebAssembly 规范支持情况


WAMR 已经达到 100% 符合 W3C 发布的 WebAssembly MVP (Most Viable Product)版本。WebAssembly 在 W3C 的发展非常活跃,从 MVP 至今已经又推出了许多新特性,通常称为 Post-MVP 特性。


WAMR 正在积极开发以支持 Post-MVP 特性,目前已经对下列特性提供了支持:



WAMR 的应用与未来展望


从开源到现在的一年多时间内,WAMR 项目已经得到了长足的发展,社区的力量不断增强。该项目在 GitHub 上目前已经有超过 1500 个关注,130 个 fork。中国开发者也非常活跃地参与到社区贡献中,比如阿里巴巴团队就在 WAMR 上贡献了对 AliOS Things、MacOS 等平台的支持,风河公司中国团队也贡献了对 VxWorks 系统的移植。我们可以期望不久后有更多中国头部互联网企业加入社区常规开发工作。在字节码联盟内,WAMR 正在和其他兄弟项目合作推动 WebAssembly 和 WASI 技术在浏览器以外创建一个新的安全软件栈。


在应用场景方面,社区里已经展开对 WAMR 的广泛探索,到目前为止已经覆盖如下应用场景:


  • 可信计算环境(TEE)、Trusted FaaS、联邦计算

  • 硬件加速

  • 手机、IoT、智能设备的小程序引擎

  • 超轻量级Serverless容器

  • 区块链智能合约

  • 工业控制逻辑引擎

  • 游戏引擎

  • 支持可独立开发、动态装载的固件模块


WASM 新的应用领域还在不断涌现,WAMR 未来发展空间让人感到非常兴奋。


在开发计划方面,WAMR 项目 2020 年的主要目标是继续提升软件的易用性,目前源码调试功能已经进入开发阶段。对可信执行环境的支持(如 SGX 的支持)将继续增强, SGX 环境下的 WASI 支持正在开发之中。另外,提供对 SIMD 的支持,增强对多模块的支持,以及提供更好的在 WASM 应用和 Runtime 原生环境之间的复杂结构数据交互也将是项目接下来要解决的问题。


在社区建设方面,我们接下来将在 InfoQ 陆续推出一系列 WAMR 专题文章,本文是该专题的第一篇概要性介绍文章,后续文章还将介绍 WAMR 的应用、内部设计等各方面细节。同时在 W3C 中国组织的 WebAssembly 主题研讨会 WAMR 的主题交流也在计划之中,时间点可能在八、九月份。最后也是很重要的一个规划,WAMR 社区将组织开展定期的社区开发者会议,欢迎感兴趣的朋友一起交流与分享,共建更好的开源社区。


作者介绍:


王鑫,目前就职英特尔中国北京公司。近十年主要专注于计算机语言运行时(managed runtime)技术领域,主要包含 Java、WebAssembly 和 JavaScript 等语言运行引擎,以及编译、可信执行环境、物联网、Web PWA 等技术。曾带领团队开发兼容 Java 语言的轻量级虚拟机 Intel Micro Runtime,创建开源项目 WebAssembly Micro Runtime,参与推动英特尔、Mozilla 等公司成立 WebAssembly 技术字节码联盟 (Bytecode-Alliance)。


对 WAMR 感兴趣以及希望参与更多技术交流的开发者,可以在钉钉里打开此链接加入 WAMR 开发者群;或在微信中扫描此链接中的二维码,添加 WARM 开源社区官方微信并加入交流群。


WAMR 项目 GitHub 地址:


https://github.com/bytecodealliance/wasm-micro-runtime


2020 年 7 月 23 日 17:285812
用户头像
蔡芳芳 InfoQ高级编辑

发布了 476 篇内容, 共 218.4 次阅读, 收获喜欢 1279 次。

关注

评论 3 条评论

发布
用户头像
中国团队,赞一下
2020 年 07 月 29 日 13:43
回复
用户头像
请问WAMR可以当作一个运行在ARM架构终端机上的“Docker”吗? 一直都找不到手机上可运行的容器引擎。
2020 年 07 月 26 日 10:25
回复
用户头像
Envoy 中也支持了 WASM,值得关注下。
2020 年 07 月 24 日 11:04
回复
没有更多评论了
发现更多内容

第二周作业

田振宇

第2周 学习总结

sunpengjian

架构师训练营第二周总结

草原上的奔跑

接口隔离原则优化 Cache 类设计

张磊

设计模式与设计原则(第二周总结)

麻辣

架构师课程第二周总结

dongge

架构师训练营第 02周—— 练习

李伟

极客大学架构师训练营

week2-依赖倒置原则&接口隔离原则

暖丶冬

第2周 架构师实现自己架构目标的主要手段

陆不得

第二课学习总结

lwyanhao

Homework-依赖倒置原则的理解

River Tree

Homework 依赖倒置原则

课堂作业week2

Dennis

架构师训练营丨第二周丨学习总结

Frode

极客大学架构师训练营

第二课作业

lwyanhao

第二周总结

ruettiger

架构师训练营总结 -2

River Tree

架构 总结 软件设计原则

第二周作业

ruettiger

极客大学第二周作业

方堃

极客大学

架构师训练营第二周总结

好名字

极客大学架构师训练营 作业

【第二周】命题作业——软件设计原则

三尾鱼

面向对象 极客大学架构师训练营

Week02总结

张磊

架构师训练营week2 命题作业

a晖

<<架构师训练营>> 第二周学习总结

0x12FD16B

解决 Jenkins 中使用代理来执行 npm install 的问题

jerry.mei

Docker DevOps 运维 jenkins

极客时间第 0 期架构师训练营第二周作业

2流程序员

架构师训练营-Week 02 命题作业

华乐彬

极客大学架构师训练营 设计原则

架构师训练营 No.2 周总结

连增申

Wireshark的使用与数据分析(三)--显示过滤器

姬翔

Wireshark

架构师训练营WEEK2作业

班戟鱼

Week001总结作业

徐培

第二周作业 - 命题作业

molly

极客大学架构师训练营

跨越嵌入式到云端的新型容器:WebAssembly Micro Runtime-InfoQ