vlambda博客
学习文章列表

Oracle在GraalVM中实现WebAssembly引擎GraalWasm

近日,Oracle在GraalVM中实现了WebAssembly的MVP规范,能以二进制格式运行WebAssembly程序,由诸如Emscripten的编译器后端生成,算是初步集成了WebAssembly。

GraalWasm以GraalVM作为平台提供部分求值引擎,使用GraalVM的Truffle API,首先给WebAssembly二进制格式实现一个解释器。

WebAssembly的半结构化格式,使处理程序的控制流结构很简便,从而使得存储代码的内存数据结构可以表示为抽象语法树,这样的解释器可以很直接的实现。基于抽象语法树的数据结构更易于检查和操作,但却带来了额外的内存开销。而基于字节码的代码表示不需要为每个指令实例化树节点,这就是为什么基于字节码的GraalVM解释器(例如LLVM的Sulong)通常具有更小的内存占用的原因。


由于每个WebAssembly块仅包含线性指令序列,因此GraalWasm能够结合两种解释器中的最佳方法——抽象语法树叠加在WebAssembly控制流指令(如if和loop)的顶部,而每个块表示一个单一的Truffle抽象语法树节点(称为Wasm块节点)。每个块中的各个指令不需要单独的节点对象,如此就减少了内存开销。而且GraalWasm块节点不会拷贝原指令流的各个部分,仅将指针包含在WebAssembly二进制文件的字节数组中。

在这个数据结构之上实现的解释器是一个基于AST解释和基于字节码解释的混合体。在更高的控制流级别上,它在适当的基本块之间分配。在每个基本块中,解释在迭代该基本块的操作码的解释循环内完成。这种设计使解释器更容易理解,并简化了它的部分求值。

在运行时阶段,解释器和程序被传递到Truffle的部分求值引擎,然后该引擎令解释器解释程序,并将生成的代码传递给GraalVM编译器,最后为目标平台生成高效的汇编代码。


虽然GraalVM还只是个体验版,后续提升性能以及完全实现WebAssembly扩展还在开发中,但毫无疑问这大大拓展了GraalVM的语言栈。


该项目的源码已经集成进Graal的repo,详细的安装和使用请访问:https://github.com/oracle/graal/tree/master/wasm