近日 Oracle 开源了其在 GraalVM 中完成的 WebAssembly 引擎 GraalWasm,开发团队引见,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 二进制文件的字节数组中。
文本 WebAssembly、二进制 WebAssembly 与 GraalWasm AST 之间的对应关系
在此数据结构之上完成的解释器是基于 AST 的解释器和基于位码的解释器之间的混合体。在较高的控制流级别上,它在适当的基本块之间分配。在每个基本块中,解释器在迭代该基本块的操作码的解释循环内完成。这种设计使转译更容易了解,并简化了部分评价。
运转时,解释器和顺序将传递到 Truffle 的部分评价引擎,然后该引擎将解释器专门用于顺序,并将专门的代码传递给 GraalVM 编译器,最终为目的平台生成高效的汇编代码。
关于 GraalWasm 的更多技术细节可以查看官方博客:
https://medium.com/graalvm/announcing-graalwasm-a-webassembly-engine-in-graalvm-25cd0400a7f2
开发团队还引见了项目接上去的开展规划,其表示,GraalWasm 的动机之一是扩展 GraalVM 的 node.js 完成支持的 API 集,WebAssembly 支持的添加将使其可以完成加载 WebAssembly 二进制文件的 V8 兼容 API 功用。
下一步将是完成 WebAssembly 系统接口(WASI),这关于在 Web 上下文外部运转 WebAssembly 顺序是必需的。WASI 是一组 API,用于笼统化对各种操作系统功用的拜访,例如文件 API、网络套接字和时钟。
同时 GraalWasm 将专注于提高功用,初步实验和对多个 C 微基准的功用调整表明,与以最高优化水平停止编译的本地 GCC 二进制文件相比,GraalWasm 以后可完成约 0.5 倍至 0.75 倍的峰值功用。
另一方面是改善 GraalWasm 中的调试支持,并将其与 GraalVM 的其他部分集成。
【编辑引荐】
2019 年女性顺序员报告:掌握 C、Java 和 C++ 的人最多
2019 编程言语排行榜:Java 稳坐榜首!
2019 年 JavaScript 现状调查报告炽热出炉!
2019年 Java 调查报告:“被取代”是不存在的!
年末将至,值得你关注的16个Java 开源项目!
(责任编辑:admin)