Chicory - 一个纯Java编写的WebAssembly解释器,无任何本地依赖

WebAssembly 多语言支持与 Chicory 项目

近年来,多种编程语言开始支持编译为 WebAssembly(Wasm),这使得开发者能够构建真正的多语言系统。Chicory 是一个在 JVM 上运行的 Wasm 解释器,无需任何本地依赖,可以在任何 JVM 上运行。类似于 Go 生态系统中的 wazero,Chicory 使开发者能够安全地与 Wasm 生态系统支持的任何语言编写的库进行交互。

项目背景与动机

Chicory 项目的发起者包括 Dylibso 的首席技术官 Benjamin Eckel 和 Red Hat 的首席软件工程师 Andrea Peruffo。他们决定在 JVM 上构建 WebAssembly 解释器,主要基于以下原因:

  • 安全性:Wasm 的沙盒内存模型防止模块读取内存或跳转到其范围之外的代码,默认情况下不允许访问文件或网络等系统资源。
  • 高效性:Wasm 没有对象或堆的概念,因此可以高效运行低级语言。
  • 多语言支持:Wasm 是运行不受信任/第三方代码的理想运行时。

Chicory 的特点

Chicory 类似于 Graal 的 WebAssembly 实现,但它仅需要一个作为 jar 的库,并且没有本地依赖。理论上,它可以在任何 JVM 上运行,包括 GraalVM。Peruffo 提到 wazero 是 Chicory 的灵感来源,称其为“来自 Go 生态系统的远房表亲”。

使用 Chicory

要开始使用 Chicory,只需将 chicory 依赖添加到项目中,然后加载并实例化 Wasm 文件:

import com.dylibso.chicory.runtime.ExportFunction;
import com.dylibso.chicory.wasm.types.Value;
import com.dylibso.chicory.runtime.Module;
import com.dylibso.chicory.runtime.Instance;
import java.io.File;

Module module = Module.builder(new File("./factorial.wasm")).build();
Instance instance = module.instantiate();
  • Module 类:表示“惰性”代码。
  • Instance 类:是加载代码并可运行的 Wasm 虚拟机。

开发者可以调用模块导出的函数:

ExportFunction iterFact = instance.export("iterFact");
Value result = iterFact.apply(Value.i32(5))[0];
System.out.println("Result: " + result.asInt()); // 应输出 120 (5!)

Wasm 的特点

  • 方法可能返回多个结果。
  • 仅支持基本整数和浮点原语,复杂类型可以通过传递指针来处理。

使用低级别 API 提供字符串的示例:

import com.dylibso.chicory.runtime.Memory;
Memory memory = instance.memory();
String message = "Hello, World!";
int len = message.getBytes().length;
int ptr = alloc.apply(Value.i32(len))[0].asInt();
memory.writeString(ptr, message);

安全性与本机函数

默认情况下,Wasm 程序是沙盒化的,无法影响“外部世界”。如果需要,开发者可以使用“本机函数”。HostFunction 类用 Java 编写,可以从 WebAssembly 代码中调用。

项目目标与未来计划

Chicory 已经通过了 WebAssembly 测试套件,可以运行“任何正确的 Wasm 项目”。接下来的重点将是使运行时安全,并在之后提高性能。项目的目标包括:

  • 成为 JVM 生态系统中“事实上的”标准 WebAssembly 运行时。
  • 在 2024 年 9 月之前“生产就绪”。
  • 到 2024 年底“快速”且兼容。
  • 创建生成 JVM 字节码的 AOT 编译器,并支持 WebAssembly 系统接口预览 1(WASI)、单指令多数据(SIMD)和垃圾收集支持。

有兴趣的贡献者可以通过 项目的 GitHub 页面zulip 聊天 进行互动。

阅读 52
0 条评论