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日

891WebAssembly

Download history 9372/week @ 2024-04-20 6329/week @ 2024-04-27 11630/week @ 2024-05-04 14023/week @ 2024-05-11 13410/week @ 2024-05-18 15478/week @ 2024-05-25 12553/week @ 2024-06-01 11203/week @ 2024-06-08 19966/week @ 2024-06-15 6659/week @ 2024-06-22 17386/week @ 2024-06-29 24419/week @ 2024-07-06 30202/week @ 2024-07-13 18003/week @ 2024-07-20 17032/week @ 2024-07-27 23003/week @ 2024-08-03

92,758 个月下载量
用于 29 个存储库(3 个直接使用)

Apache-2.0

150KB
3K SLoC

WebAssembly 接口

用于 wai 的语言绑定生成器

一个基于 Wasmer 的项目,构建于 wai

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 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应用程序中的使用可能需要将wai-bindgen的一个版本编译成WebAssembly并发布到NPM。

不过,目前您可以通过CLI探索每种语言中的绑定看起来像什么。如果您愿意依赖这个,请通过Slack联系我们,我们可以为您的用例制定一个比依赖CLI工具更好的方案。

支持的语言

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

  • rust-wasm - 这是针对编译为WebAssembly的Rust,通常使用wasm32-wasiwasm32-unknown-unknown目标,具体取决于您的用例。在此模式下,您可能需要依赖位于crates/rust-wasmwai-bindgen-rust包,并使用import!export!宏来生成代码。

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

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

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

  • js - 适用于执行 WebAssembly 模块的 JavaScript 用户。这可以在浏览器、Node.js 或 Deno 中完成。从理论上讲,这涵盖了类似 web workers 等浏览器用例。在此模式下,wai-bindgen 命令行工具将生成一个 *.js 和一个 *.d.ts 文件,描述接口并提供必要的 JS 运行时支持以实现标准 ABI。请注意,此语言的长期集成目标是将其本身编译为 WebAssembly,并发布 NPM 包以将 wai-bindgen 集成到流行的 JS 构建系统中。

  • wasmer-py - 适用于使用 wasmer PyPI 包的 Python 用户。这底层使用 Wasmer,但您可以在提供 WebAssembly 模块的导入或使用接口类型消费模块时编写 Python 代码。这生成一个 *.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 命令行工具还支持:

  • markdown - 生成一个 *.md 和一个 *.html 文件,其中包含从源 *.wai 文件中的注释渲染的可读文档。

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

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

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

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

请注意,这不是一个排他性的列表,只是想给您一个其他绑定可能看起来怎样的概念。有大量的运行时和语言可以编译为 WebAssembly,接口类型应该能够与所有这些一起工作,理论上只需一些工作小时就能在 wai-bindgen 中得到支持。

依赖关系

~2.2-3MB
~82K SLoC