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

Posted InfoQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跨越嵌入式到云端的新型容器: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 进行概要性的介绍。

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

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

2 WebAssembly Micro Runtime 开源项目的诞生

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

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

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

3 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 模块。

4 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

5 WebAssembly 规范支持情况

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

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

  • https://github.com/WebAssembly/nontrapping-float-to-int-conversions

  • https://github.com/WebAssembly/sign-extension-ops

  • https://github.com/WebAssembly/bulk-memory-operations

  • https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md

  • https://github.com/WebAssembly/multi-value

6 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 感兴趣以及希望参与更多技术交流的开发者,可以在 InfoQ 官网上打开文章(https://www.infoq.cn/article/PjjSD5W6XzT5X6Fw1ZRc)或点击阅读原文,通过文末链接加入交流群。

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



InfoQ 写作平台欢迎所有热爱技术、热爱创作、热爱分享的内容创作者入驻!

还有更多超值活动等你来!

扫描下方二维码

填写申请,成为作者

开启你的创作之路吧~


点个在看少个 bug 

以上是关于跨越嵌入式到云端的新型容器:WebAssembly Micro Runtime的主要内容,如果未能解决你的问题,请参考以下文章

Rust在2018年将专注于开发效率WebAssembly嵌入式等方面

嵌入 WebAssembly 运行时和实例化 WebAssembly 模块的几大要素

在 Rust 程序和嵌入式 WebAssembly 运行时之间进行通信的最佳实践是啥?

我怎样才能让一个有角度的应用程序(嵌入在不同的网站上)一直跨越到页面的底部

当 WebAssembly 遇上 Serverless

在 WebAssembly 实例中将嵌入文件读取为 Uint8Array