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 聊天 进行互动。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。