GraalWasm 是在 GraalVM 中实现的 WebAssembly 引擎,它可以以二进制格式解释和编译 WebAssembly 程序,或者嵌入到其它程序中。
GraalWasm 当前实现了 WebAssembly MVP(最小可行产品)规范,并且可以以二进制格式运行 WebAssembly 程序,该程序是由诸如 Emscripten 之类的编译器后端生成的。
支持 WebAssembly 扩展了 GraalVM 与其它支持的语言一起执行的能力,进一步有望使其成为通用编程语言执行平台。不过目前 GraalWasm 还是一个非常早期的实现,并且处于实验模式。
为了实现 GraalWasm,开发团队使用 GraalVM 作为提供有效局部评估引擎的平台,使用 GraalVM 的 Truffle API,首先实现了 WebAssembly 二进制文件的解释器。
WebAssembly 的半结构化格式能够轻松地恢复程序的控制流结构,从而使存储代码的内存数据结构可以表示为 AST。用 AST 表示的程序的解释器可以用非常简单的方式编写,但是,尽管基于 AST 的数据结构更易于检查和操作,但它们确实存在引入额外内存开销的缺点。
另一方面,基于位码的代码表示不需要为每个基本指令实例化树节点,这就是基于位码的 GraalVM 解释器通常具有更小的内存占用的原因。
由于每个 WebAssembly 块仅包含线性指令序列,因此 GraalWasm 能够结合两种解释器方法中的最佳方法:AST 叠加在 WebAssembly 的控制流指令之上,如 if 和 loop。但是每个块都用一个 Truffle AST 节点,称之为 Wasm 块节点,这减少了内存占用,因为每个块中的单个指令不需要单独的节点对象。
此外,GraalWasm 块节点不会复制原始指令流的各个部分,而是仅将指针包含在 WebAssembly 二进制文件的字节数组中。
项目地址: https://github.com/oracle/graal/tree/master/wasm