Design: 异步/承诺支持

创建于 2018-01-07  ·  7评论  ·  资料来源: WebAssembly/design

许多 JavaScript 库是异步的,我还没有看到 WebAssembly 支持承诺。
为了轻松编写利用 JS 生态系统的高性能应用程序,我建议在导入的函数中添加对 promise 的支持。

例如,这应该有效:

const importObject = { 
  returnOneAsync: () => new Promise(done => done(1)) 
};
extern "C" int returnOneAsync();

int main(){
  int x = returnOneAsync(); // should suspend main until promise resolved.
  return x+x;
}

最有用的评论

我认为您误解了网络的计算模型。 JavaScript 不是多线程的,因此暂停计算会停止引擎,实际上整个渲染器都会停止运行。 页面会冻结并且没有其他代码可以运行(除了单独的工作人员)。 您需要一种具体化和稍后恢复延续的方法以使悬架飞行,这是目前发动机无法做到的。

所有7条评论

任何对 JS 承诺的支持都必须是JS 主机绑定提案的一部分

但恐怕它不可能像您的示例所暗示的那样工作,因为这需要 C 本身来理解异步执行和暂停,而事实并非如此。 此外,您的示例中没有任何异步内容,它只是创建了一个承诺,因此等效的代码甚至不会在 JS 本身中挂起,而只是生成一个像"[object Promise][object Promise]"这样的字符串。

此外,您的示例中没有任何异步内容

好吧,在 eventloop 处理 promise 之前,该值不可用。
这个想法是暂停 webassembly 引擎的执行,直到值可用。
提供的示例当然非常简单。 一个更具体的例子可能是通过网络进行数据库查询: getAgeOf: (name) => db.find({name}).then(x=>x.age)

C 本身理解异步执行和暂停,它不

那是不正确的。 C 有多种协程实现。
此外,LLVM-5.0 及更高版本支持协程和 async/await。

https://llvm.org/docs/Coroutines.html

作为 C++17 的附录,有自 clang-5.0 以来已经实现的coroutine-ts
已经有几个实验库在使用它:
https://github.com/lewissbaker/cppcoro#generator

C 中协程的实现不会神奇地与 JavaScript 的事件循环进行互操作。 此外,它们通常依赖于特定于实现的行为。 为了可靠且可移植地实现诸如协程或异步之类的东西,您需要在语言中使用一种分隔的延续形式。 最接近的 C 必须提供的是 longjmp,这还不够,目前还不能在 Wasm 本身中实现(使用 Emscripten,longjmp 在 JS 中实现,但有 JS 例外)。 Wasm 目前无法表示暂停,尽管最终计划添加一些内容。 C++ 协程还不是标准的,Emscripten AFAICT 无法处理。

我知道你来自哪里。
我觉得我的想法表达得不够好。
我不是建议在 C/C++ 中支持协程或承诺,也不是在 wasm 字节码中实现这一点。

但恐怕它不可能像你的例子所暗示的那样工作,因为这需要 C 本身来理解异步执行和暂停,而它没有

为什么你认为 C 需要理解异步执行?

在 promise 解决之前暂停 wasm 执行引擎的技术难点是什么?

我知道 wasm 应该提前编译为 x86,但这并不意味着您无法控制执行流程。
停止执行的常用方法是使用硬件中断和系统调用,如 ptrace; 这就是调试器的工作方式。 我们确切地知道哪些函数被导入,我们可以注入适当的 (x86) 操作码来实现这一点。 虽然这会减慢这些函数的执行速度 - 这并不重要,因为我们在这些情况下正在等待承诺解决。
这就是我们在基于 LLVM 的 C++JIT/AoT 中实现挂起/调试/恢复的方式。

我想这个问题应该在主机绑定仓库中提交......

我认为您误解了网络的计算模型。 JavaScript 不是多线程的,因此暂停计算会停止引擎,实际上整个渲染器都会停止运行。 页面会冻结并且没有其他代码可以运行(除了单独的工作人员)。 您需要一种具体化和稍后恢复延续的方法以使悬架飞行,这是目前发动机无法做到的。

相关: https :

我认为您误解了网络的计算模型。 JavaScript 不是多线程的,因此暂停计算会停止引擎,实际上整个渲染器都会停止运行。 页面会冻结并且没有其他代码可以运行(除了单独的工作人员)。 您需要一种具体化和稍后恢复延续的方法以使悬架飞行,这是目前发动机无法做到的。

确切地说,wasm 应该在 worker 内部运行,因为它们都是为计算任务创建的,而不是处理 UI。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Thaina picture Thaina  ·  8评论

konsoletyper picture konsoletyper  ·  6评论

aaabbbcccddd00001111 picture aaabbbcccddd00001111  ·  3评论

dpw picture dpw  ·  3评论

cretz picture cretz  ·  5评论