介绍 WebAssembly JavaScript Promise 集成 API • V8

主要观点

  • JavaScript Promise Integration (JSPI) API 可让假设同步访问外部功能的 WebAssembly 应用在实际异步的环境中平稳运行。
  • JSPI 通过拦截异步 Web API 函数返回的Promise对象并暂停 WebAssembly 应用,当异步 I/O 操作完成时恢复应用,从而弥合同步应用和异步 Web API 之间的差距。
  • JSPI 只需对 WebAssembly 应用本身进行很少的更改,且预期使用成本不高,与其他基于转换的方法相比更优。
  • JSPI 目前处于 W3C WebAssembly WG 的第 4 阶段,已在 Chrome 137 和 Firefox 139 中可用。

关键信息

  • 异步 API 通过分离操作的启动和解析来工作,应用在启动操作后继续执行,然后在操作完成时得到通知。
  • JSPI 在 WebAssembly 模块实例化阶段包装导入和导出,添加暂停行为并将暂停路由到Promise对象回调。
  • 示例展示了如何使用 JSPI 计算斐波那契数列、动态加载代码等,包括相关的 C 代码和 Emscripten 编译命令等。

重要细节

  • fetch API 是异步的,返回Promise对象,通过附加回调来处理响应。
  • C/C++应用通常基于同步 API 编写,而浏览器主线程不允许阻塞,许多环境也不支持同步编程,JSPI 解决了这一矛盾。
  • JSPI 工作时拦截 JavaScript 调用返回的Promise对象并暂停 WebAssembly 应用,导出的Promise对象在原始调用完成时解析或拒绝。
  • 在动态加载代码的示例中,使用fetch获取模块,通过EM_ASYNC_JS宏和WebAssembly.instantiateStreaming编译和实例化模块,使用函数指针实现透明的动态加载。
  • 附录中提供了badfibu42.cp42.c的完整代码清单,以及相关的注释说明。
阅读 46
0 条评论