Open cisen opened 10 months ago
由于Wasm组件提供了导入和导出“接口”的功能,因此我们可以使用一种称为WIT(Wasm Interface Type)的文档格式来描述这种接口。Wasm接口类型(WIT)格式是一种IDL(接口描述语言),用于以两种主要方式为WebAssembly组件模型提供工具支持:
WIT包是WIT文档的集合。每个WIT文档都定义在一个使用文件扩展名wit的文件中,例如foo.wit,并编码为有效的UTF-8字节。每个WIT文档包含一个接口和世界的集合。类型可以从包内的同级文档(文件)中导入,还可以通过URL从其他包中导入。
简单来说,WIT文件描述了Wasm组件的导入和导出以及其他相关信息,包括:
以下是一个WIT文档的示例,其中描述了:
一个名为my-world的world。可以认为一个world对应一个Wasm组件。
组件内导出了一个名为run的函数,该函数不接受任何参数,也没有返回值。
组件需要导入一个名为host的接口,其需要提供一个名为log的函数,并接收一个名为param的字符串参数。
default world my-world { import host: interface { log: func(param: string) } export run: func() }
鉴于组件模型和 WIT 已经如此出色,那么我们该如何使用它们呢?
BytecodeAlliance 开发了 wit-bindgen 和 wasm-tools 两个工具,可以帮助我们生成处理接口、字符串、数组、结构体等复杂类型的代码,而我们只需要关心具体函数的实现即可。
使用传统的 Wasm 工具链(如 clang、rustc)编译生成 Wasm 模块后,再将其转换成 Wasm 组件。 对于 Rust 开发者来说,Rust 编译器支持原生的 wasm32-wasi 目标,只需要在基于 rustup 的工具链中添加:
rustup target add wasm32-wasi
然后,在 Cargo.toml 文件中添加以下内容,以编译一个 wasi 动态库:
[lib] crate-type = ["cdylib"] cargo add --git https://github.com/bytecodealliance/wit-bindgen wit-bindgen
此时,我们需要在与 Cargo.toml 文件相邻的 wit/ 文件夹中添加 WIT 文件。例如,使用 Rust 编写的组件示例代码如下:
// src/lib.rs // 使用过程宏为我们在 `host.wit` 中定义的接口生成绑定 wit_bindgen::generate!("host"); // 定义一个自定义类型,并为它实现生成的 `Host` trait,表示为此组件实现了所有必要的导出接口 struct MyHost; impl Host for MyHost { fn run() { print("Hello, world!"); } } export_host!(MyHost);
通过以上步骤,我们可以使用 Rust 和 WIT 开发 Wasm 组件,方便快捷地实现功能强大的组件模型。
组件模型的描述文件 - WIT
由于Wasm组件提供了导入和导出“接口”的功能,因此我们可以使用一种称为WIT(Wasm Interface Type)的文档格式来描述这种接口。Wasm接口类型(WIT)格式是一种IDL(接口描述语言),用于以两种主要方式为WebAssembly组件模型提供工具支持:
WIT包是WIT文档的集合。每个WIT文档都定义在一个使用文件扩展名wit的文件中,例如foo.wit,并编码为有效的UTF-8字节。每个WIT文档包含一个接口和世界的集合。类型可以从包内的同级文档(文件)中导入,还可以通过URL从其他包中导入。
简单来说,WIT文件描述了Wasm组件的导入和导出以及其他相关信息,包括:
以下是一个WIT文档的示例,其中描述了:
一个名为my-world的world。可以认为一个world对应一个Wasm组件。
组件内导出了一个名为run的函数,该函数不接受任何参数,也没有返回值。
组件需要导入一个名为host的接口,其需要提供一个名为log的函数,并接收一个名为param的字符串参数。
如何在实际项目中使用 WIT 开发 Wasm 组件
鉴于组件模型和 WIT 已经如此出色,那么我们该如何使用它们呢?
BytecodeAlliance 开发了 wit-bindgen 和 wasm-tools 两个工具,可以帮助我们生成处理接口、字符串、数组、结构体等复杂类型的代码,而我们只需要关心具体函数的实现即可。
使用传统的 Wasm 工具链(如 clang、rustc)编译生成 Wasm 模块后,再将其转换成 Wasm 组件。 对于 Rust 开发者来说,Rust 编译器支持原生的 wasm32-wasi 目标,只需要在基于 rustup 的工具链中添加:
然后,在 Cargo.toml 文件中添加以下内容,以编译一个 wasi 动态库:
此时,我们需要在与 Cargo.toml 文件相邻的 wit/ 文件夹中添加 WIT 文件。例如,使用 Rust 编写的组件示例代码如下:
通过以上步骤,我们可以使用 Rust 和 WIT 开发 Wasm 组件,方便快捷地实现功能强大的组件模型。