首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

跨越嵌入式到云端的新型容器: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

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/PjjSD5W6XzT5X6Fw1ZRc
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券