5个版本

0.2.3 2023年2月15日
0.2.2 2022年12月8日
0.2.1 2022年11月17日
0.2.0 2022年11月8日
0.2.0-rc.12022年10月31日

#15 in #wasmer

每月 39 次下载

Apache-2.0

3MB
18K SLoC

WebAssembly接口

为wai生成语言绑定的工具

基于Wasmerwai的项目

build status supported rustc stable

关于

注意:不幸的是,wit-bindgen的后台维护者不希望添加对Wasmer的上游支持,因此我们不得不进行硬分叉,以便使事物与Wasmer一起工作。

此项目是一个用于WebAssembly程序和WebAssembly嵌入的绑定生成器框架。此项目与描述模块接口的*.wai文件一起工作,无论是导入的还是导出的。例如,此项目可以用在以下情况中

  • 您的语言(例如,Rust)编译为WebAssembly,您想导入WASI。此项目将生成Rust绑定以导入使用*.wai描述的WASI API。

  • 您的运行时(例如,Wasmer)想要向客户端程序提供WASI功能。此项目将为您生成一个用于实现WASI接口的Rust trait

  • 您正在消费一个WebAssembly模块(例如,在浏览器中),您不想处理奇怪的ABI细节。您将使用此项目生成JS绑定,该绑定为您提供了处理原生JS类型的TypeScript接口,这些类型描述了由*.wai描述的WebAssembly模块。

此项目基于接口类型提议。此仓库将遵循上游更改。wai的目的在于提供一个与接口类型和规范ABI兼容的工具链和故事。生成的所有语言绑定都使用规范ABI进行通信,使WebAssembly模块可以用任何支持的语言编写,并且WebAssembly模块可以在任何支持语言的环境中消费。

演示

在线查看生成的绑定!

如果您想探索并查看特定输入*.wai生成的绑定是什么样的,您可以通过在线探索生成的代码来了解正在生成什么以及粘合代码的样子。

使用方法

目前,这个CLI工具主要提供用于调试和探索。它可以很容易地与wasmer CLI一起使用。

// browser.wai

record person {
  name: string,
  age: u32,
}

// Say hello to either the specified person or the current user
hello: func(who: option<person>) -> string
$ wasmer run wasmer/wai-bindgen-cli --dir=. -- js --import browser.wai
Generating "browser.d.ts"
Generating "browser.js"
Generating "intrinsics.js"

这个工具并不一定是为了集成到工具链中。例如,在Rust中使用时,更有可能通过过程宏和Cargo依赖项来完成。在Web应用程序中使用时,可能会使用编译为WebAssembly并发布到NPM的wai-bindgen版本。

不过,现在您可以通过CLI探索每种语言中绑定的样子。如果您不介意,并希望依赖于此,请通过Slack联系我们,以便我们可以为您的用例制定一个更好的方案,而不是仅仅依赖于CLI工具。

支持的语言

首先,这里是一个支持生成使用接口类型的WebAssembly二进制的语言列表。这意味着这些语言支持*.wai定义的导入和导出。

  • rust-wasm - 这是针对编译为WebAssembly的Rust,根据您的用例,通常使用wasm32-wasiwasm32-unknown-unknown目标。在这种模式下,您可能会依赖wai-bindgen-rust存储库(位于crates/rust-wasm),并使用import!export!宏来生成代码。

  • c - 这是针对编译为WebAssembly的C,使用与Rust相同的目标。在C中,wai-bindgen CLI工具将生成一个*.h和一个*.c文件,这些文件将被编译到wasm模块中。

此存储库还支持一些宿主语言/运行时,可以用来消费使用接口类型的WebAssembly模块。这些模块需要遵循其导出/导入的规范ABI。

  • wasmer - 这是针对使用wasmer存储库的Rust用户。此生成器通过wai-bindgen-wasmer存储库(位于crates/wasmer)使用,并且像编译为wasm的Rust支持一样,有一个import!和一个export!宏来生成代码。

  • js - 这是针对执行WebAssembly模块的JavaScript用户。这可能在浏览器、Node.js或Deno中完成。理论上,这涵盖了像Web Workers这样的浏览器用例。在这种情况下,wai-bindgen CLI工具将生成一个*.js和一个*.d.ts文件,描述接口并在JS中提供必要的运行时支持以实现规范ABI。请注意,该语言的长期目标是将其本身编译为WebAssembly,并为流行的JS构建系统发布NPM包,以将wai-bindgen集成到JS构建过程中。

  • wasmer-py - 这是为使用 wasmer PyPI 包的 Python 用户准备的。它底层使用 Wasmer,但您可以在提供导入给 WebAssembly 模块或使用接口类型消费模块时编写 Python 代码。这会生成一个 *.py 文件,该文件包含用于在 mypy 或其他类型检查器中使用的类型注解。

所有生成器都支持 --import--export 标志,在 wai-bindgen CLI 工具中

$ wasmer run wasmer/wai-bindgen-cli --dir=. -- js --import browser.wai
$ wasmer run wasmer/wai-bindgen-cli --dir=. -- rust-wasm --export my-interface.wai
$ wasmer run wasmer/wai-bindgen-cli --dir=. -- wasmer --import host-functions.wai

在这里,“导入”意味着“我想导入并调用此接口中的函数”,而“导出”则意味着“我想为此接口中的函数定义,供他人调用”。

最后,在一种“杂项”类别中,wai-bindgen CLI 还支持

  • markdown - 从源 *.wai 文件中的注释生成一个 *.md 和一个 *.html 文件,以提供可读的文档。

请注意,这里支持的语言列表是某个时间点的快照,并不是最终的。接口类型提案的目的是在 WebAssembly 模块的编写以及它们的消费方式上保持语言无关。如果您这里没有列出运行时,或者您正在编译到 WebAssembly 且您的语言也没有列出,这并不意味着它永远不会被支持!语言绑定生成器旨在不是世界上最难的事情(但不幸的是也不是最容易的),而这个存储库中的 crate 和支持主要存在是为了使编写生成器尽可能容易。

一些其他语言和运行时,例如,目前 wai-bindgen 中没有支持,但未来是可能的(也可能在这里编写)包括

  • wasmer-go - 与 wasmer-py 相同,但用于 Go。基本上是针对使用 wasmer-go 的 Go 用户,他们想使用接口类型而不是原始指针/内存等。

  • wasmer-ruby - 与 wasmer-py 相同,但用于 Ruby。基本上是针对使用 wasmer-ruby 的 Ruby 用户,他们想使用接口类型而不是原始指针/内存等。

请注意,这不是一个专属列表,只是想给您一个其他绑定可能的样子。有大量的运行时和语言可以将代码编译到 WebAssembly 中,并且接口类型应该能够与所有这些一起工作,理论上只需要一些工作时间就可以在 wai-bindgen 中获得支持。

依赖关系

~5.5MB
~127K SLoC