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日

#575WebAssembly

Download history 10187/week @ 2024-03-14 7321/week @ 2024-03-21 11049/week @ 2024-03-28 11738/week @ 2024-04-04 16167/week @ 2024-04-11 8752/week @ 2024-04-18 8106/week @ 2024-04-25 8396/week @ 2024-05-02 11087/week @ 2024-05-09 14424/week @ 2024-05-16 14326/week @ 2024-05-23 16071/week @ 2024-05-30 11313/week @ 2024-06-06 18477/week @ 2024-06-13 10872/week @ 2024-06-20 7103/week @ 2024-06-27

49,880 每月下载量
45 个crate中使用 (16 直接)

Apache-2.0

225KB
4.5K SLoC

WebAssembly接口

wai的语言绑定生成器

一个基于waiWasmer项目

build status supported rustc stable

关于

注意:遗憾的是,wit-bindgen的维护者不希望添加对Wasmer的支持,因此我们必须进行硬分叉才能使事物与Wasmer一起工作。

此项目是一个WebAssembly程序和WebAssembly嵌入的绑定生成器框架。它支持*.wai文件,这些文件描述了模块的接口,无论是导入的还是导出的。例如,此项目可以在以下情况下使用

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

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

  • 你正在消费一个WebAssembly模块(比如在浏览器中),你不想处理奇特的ABI细节。你会使用此项目来生成JS绑定,它为你提供了一个TypeScript接口,该接口处理WebAssembly模块描述的*.wai中的本地JS类型。

本项目基于接口类型提案。该仓库将遵循上游变更。工具链wai的目的是提供对接口类型和规范ABI的前向兼容工具链和故事。生成的语言绑定都使用规范ABI进行通信,使得可以使用支持的语言编写WebAssembly模块,并在任何具有语言支持的环境中消费WebAssembly模块。

演示

在线查看生成的绑定!

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

用法

目前提供的命令行工具主要用于调试和探索目的。它可以与wasmer命令行工具轻松使用。

// 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版本。

尽管如此,您可以通过命令行探索每种语言中的绑定。如果您愿意依赖它,请在Slack上联系我们,以便我们可以为您的情况制定一个比依赖命令行工具更好的方案。

支持的语言

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

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

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

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

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

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

  • wasmer-py - 这是为使用 wasmer PyPI 包的 Python 用户提供的。这底层使用 Wasmer,但您可以用 Python 编写代码来向 WebAssembly 模块提供导入或使用接口类型来消耗模块。这会生成一个 *.py 文件,该文件带有类型注释,以便在 mypy 或其他类型检查器中使用。

所有生成器都支持 --import--export 标志。

$ 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 中获得支持。

依赖关系

~2MB
~65K SLoC