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日

#492WebAssembly

Download history 10157/week @ 2024-03-14 7281/week @ 2024-03-21 10981/week @ 2024-03-28 11708/week @ 2024-04-04 16127/week @ 2024-04-11 8703/week @ 2024-04-18 8066/week @ 2024-04-25 8359/week @ 2024-05-02 11045/week @ 2024-05-09 14389/week @ 2024-05-16 14303/week @ 2024-05-23 16023/week @ 2024-05-30 11284/week @ 2024-06-06 18458/week @ 2024-06-13 10813/week @ 2024-06-20 7090/week @ 2024-06-27

49,749 每月下载量
26 个包中使用(直接使用3个)

Apache-2.0

23KB
276

WebAssembly接口

wai 的语言绑定生成器

基于 Wasmerwai 项目

build status supported rustc stable

关于

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

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

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

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

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

本工程基于接口类型提案。此存储库将跟踪上游更改。《wai》的目的在于为接口类型和标准ABI提供向前兼容的工具链和故事。生成的语言绑定都使用标准ABI进行通信,使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的wai-bindgen版本,并发布到NPM。

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

支持的语言

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

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

  • c - 这是针对C编译到WebAssembly的,同样可以使用上述任一目标。对于C,wai-bindgen命令行工具会生成一个*.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。请注意,此语言的长期集成目的是将 wai-bindgen 本身编译为 WebAssembly,并为流行的 JS 构建系统发布 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 - 从源 *.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 中获得支持。

依赖关系

~74–630KB
~17K SLoC