Chicory:让Java调用C/C++/Rust的WebAssembly解释器

爱的威利斯 2024-06-02 03:32:00

WebAssembly (Wasm) 是一种用于在现代Web浏览器中运行高效、跨平台代码的二进制指令格式。Wasm具有高度的可移植性和性能接近原生代码的优势,同时提供了安全的沙盒执行环境。最初,Wasm主要用于Web开发,但它的强大功能和通用性使其逐渐被应用于服务器端开发、物联网设备和嵌入式系统等多种领域。

Wasm的主要特点是它可以用多种编程语言编写,然后编译成Wasm模块。这些模块可以在任何支持Wasm的运行时中执行,包括Java环境中的Chicory。

Chicory: 让Java调用C/C++/Rust的WebAssembly解释器

Chicory 是一个专为JVM设计的WebAssembly (Wasm)解释器,完全用Java编写,无需本地依赖或JNI,能够在任何JVM环境中运行。其设计理念是简洁和安全,旨在允许开发者安全地与任何Wasm生态系统中支持的语言库进行交互。

项目背景

由Dylibso的首席技术官Benjamin Eckel和RedHat的首席软件工程师Andrea Peruffo发起的Chicory项目,利用Wasm的沙盒内存模型和系统资源访问限制,使其成为运行不可信或第三方代码的理想选择。Wasm高效运行低级语言的特性也使其适合广泛的应用场景。

功能与特点

Chicory与Graal的WebAssembly实现类似,但仅需作为一个jar库运行,无需本地依赖,理论上可在任何JVM上运行,包括GraalVM(https://www.graalvm.org/latest/reference-manual/wasm/)。其设计灵感来自于Go生态系统中的wazero。

快速入门

要使用Chicory,只需添加其依赖:

Maven依赖:<dependency> <groupId>com.dylibso.chicory</groupId> <artifactId>runtime</artifactId> <version>0.0.10</version></dependency>Gradle依赖:implementation 'com.dylibso.chicory:runtime:0.0.10'

使用CLI工具安装和加载Wasm模块,然后实例化它,Wasm模块是由其他编程语言(如C、Rust等)编译(C,C++使用Emscripten编译;Rust使用wasm-pack;go使用TinyGo)而成的二进制文件。这些模块可以包含任意的计算逻辑,并可以在任何支持Wasm的运行时中执行。

curl https://raw.githubusercontent.com/dylibso/chicory/main/wasm-corpus/src/main/resources/compiled/iterfact.wat.wasm > factorial.wasmimport 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();ExportFunction iterFact = instance.export("iterFact");Value result = iterFact.apply(Value.i32(5))[0];System.out.println("Result: " + result.asInt()); // 输出应为120 (5!)内存和复杂类型

Wasm仅支持基本的整数和浮点数类型。要传递复杂类型,可以使用指针。在Chicory中,开发者可以利用Memory类进行内存的读写操作:

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默认情况下只能进行计算,不能影响外部世界。通过宿主函数,开发者可以为Wasm模块提供外部功能。宿主函数可以在Java中编写,并由Wasm模块调用:

import com.dylibso.chicory.runtime.HostFunction;import com.dylibso.chicory.wasm.types.ValueType;var func = new HostFunction( (Instance instance, Value... args) -> { var len = args[0].asInt(); var offset = args[1].asInt(); var message = instance.memory().readString(offset, len); System.out.println(message); return null; }, "console", "log", List.of(ValueType.I32, ValueType.I32), List.of());开发进展

目前,Chicory通过了WebAssembly测试套件,能够运行任何正确的Wasm项目。其开发目标包括在2024年夏天前实现生产就绪,年底前实现高性能和广泛兼容。开发团队计划实现AOT编译器生成JVM字节码,并支持WASI、SIMD和垃圾回收等特性。

参与与贡献

项目还处于早期开发阶段,团队欢迎早期使用者和贡献者加入。感兴趣的开发者可以通过GitHub页面或zulip chat与团队互动,共同推动Chicory成为JVM生态系统中的标准WebAssembly运行时。

github地址:https://github.com/dylibso/chicory

0 阅读:3