3

例如,如果 Microsoft 为 .NET 创建了一个 WebAssembly 目标,他们是否需要将 .NET 运行时嵌入到已编译的二进制文件中?如果他们不这样做,垃圾收集器和基类库之类的东西将如何工作?

4

1 回答 1

3

简单的回答:是的。

要在 WebAssembly 中运行任何语言,您必须将其运行时嵌入到您的二进制文件中。Emscripten 如何处理 C++(它将musl libclibc++libc++abicompiler-rtpthread嵌入到您的二进制文件中)以及其他语言也是如此。


更长、更细致的回答:

正确完成并且一旦可用,GC将成为 WebAssembly 本身的一部分,但您始终可以自担风险嵌入Boehm GC (在 WebAssembly 中扫描堆栈非常棘手,因为在 VM 中无法访问本地人!)。

不过,并非所有语言的 VM 都有 GC。它们还有许多其他功能,有些甚至可能希望在 WebAssembly 之上进行自己的即时编译。

基类库通常只是关于对象布局,它们很容易转换为 WebAssembly。请参阅libc++abi了解这对 C++ 意味着什么。

也就是说,运行时不必在编译的二进制文件中。两种选择:

  1. 而是在 JavaScript 中嵌入运行时。你可以在 JavaScript 中实现重要的代码,比如libc 的块。语言 VM 的运行时并没有真正的不同。
  2. 将运行时嵌入到单独的动态链接.wasm文件中。这意味着多个不同.wasm的文件可以共享运行时!多个网站甚至可以共享它,runtime.wasm并希望所有缓存命中已编译的代码(假设CORS有效)。

事实上,要做任何有用的事情,您至少必须做以下 1.: WebAssembly 没有为嵌入器定义任何 API。Web 嵌入中,做任何事情的唯一方法是从 JavaScript 调用,和/或通过 WebAssemblyimportexportsection调用 JavaScript 。从这个意义上说,JavaScript 是应用程序的微内核,提供与平台其余部分通信的能力。

当您的语言运行时需要某些平台功能时,这会变得很棘手。例如,为 Web 重新创建平台的原生 UI 库并非易事。语言的大部分运行时都可以“正常工作”,但某些部分可能需要大量工作。

于 2017-03-29T05:04:32.263 回答