上手

语言选择

Level 4 的接口是 async func,因此能不能用某门语言,取决于它的工具链是否实现了 组件模型的 async。下面是实测结论,不是推测。

语言状态说明
Rust✅ 官方支持wit-bindgen 对 async 支持最完整,性能与体积最好
Python✅ 官方支持componentize-py 0.25+ 原生支持 async
JavaScript✅ 官方支持需用我们打过补丁的 ComponentizeJS,见下
其他⚠️ 自行验证取决于该语言绑定生成器对 async 的支持程度

JavaScript 的特殊情况

上游 ComponentizeJS(jco 用的 SpiderMonkey 嵌入方案)到 0.22 为止没有实现 async func:WIT 里只要出现一个,splicer 就会直接 panic:

thread '<unnamed>' panicked at crates/spidermonkey-embedding-splicer/src/bindgen.rs:719:
not yet implemented

我们维护了一个分支把这块补上: AstralSightStudios/ComponentizeJS@astrobox/async-func-support

做法是把 async 函数按同步 lower / 同步 lift 处理。这在组件模型里是合法的—— async 描述的是「被调方可能阻塞」这一类型属性,并不要求调用方也用 async ABI; 而运行时判断能否阻塞看的是类型而非 lift 方式(wasmtime 的规则是 may_block = 类型是 async || 已返回),所以同步 lift 的导出照样可以阻塞等待宿主。

JS 插件模板已经指向该分支,正常 npm install 即可。上游合入后会切回官方包。

对写代码的影响

宿主接口虽然在 WIT 里是 async func,但在 JS 侧是同步调用

import { arch } from 'astrobox:psys-host-v4/os';

// 不需要 await,调用期间 JS 线程阻塞到宿主返回
const a = arch();

导出函数则可以照常写成 async,引擎会在返回前结算 Promise。

大纲