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日

#1557 in WebAssembly

29 每月下载量
wai-bindgen-cli 中使用

Apache-2.0

53KB
878

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绑定,这将为WebAssembly模块描述的*.wai生成TypeScript接口,并处理WebAssembly模块的本地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 版本。

不过,您可以通过 CLI 探索每种语言中的绑定看起来是什么样子。如果您想依赖它,且不介意的话,请在 Slack 上与我们联系,以便我们可以为您的情况找到一个更好的解决方案,而不是依赖 CLI 工具。

支持的语言

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

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

  • c - 这是用于将 C 编译为 WebAssembly 的工具,也可以使用上述 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。请注意,此语言的预期长期集成是将 wai-bindgen 本身编译为 WebAssembly,并发布 NPM 包以集成 wai-bindgen 到流行的 JS 构建系统中。

  • wasmer-py - 这是为使用 wasmer PyPI 包的 Python 用户设计的。它底层使用 Wasmer,但允许你使用 Python 来提供 WebAssembly 模块的导入,或使用接口类型来消费模块。这将生成一个 *.py 文件,该文件使用 mypy 或其他类型检查器时带有类型注释。

所有生成器都支持在 wai-bindgen 命令行工具中使用 --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,而你使用的语言没有列在这里,并不意味着它永远不会得到支持!语言绑定生成器旨在不是世界上最难写的东西(但不幸的是也不是最容易的),而这个存储库中的 crates 和支持主要是为了使编写生成器尽可能容易。

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

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

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

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

依赖项

~2.3–3MB
~83K SLoC