【发布时间】:2017-03-29 04:49:37
【问题描述】:
例如,如果 Microsoft 为 .NET 创建了 WebAssembly 目标,他们是否需要将 .NET 运行时嵌入到已编译的二进制文件中?如果他们不这样做,垃圾收集器和基类库之类的东西将如何工作?
【问题讨论】:
标签: webassembly
例如,如果 Microsoft 为 .NET 创建了 WebAssembly 目标,他们是否需要将 .NET 运行时嵌入到已编译的二进制文件中?如果他们不这样做,垃圾收集器和基类库之类的东西将如何工作?
【问题讨论】:
标签: webassembly
简单的回答:是的。
要在 WebAssembly 中运行任何语言,您必须将其运行时嵌入到您的二进制文件中。 Emscripten 如何处理 C++(它将 musl libc、libc++、libc++abi、compiler-rt 和 pthread 嵌入到您的二进制文件中)以及其他语言也是如此。
更长、更细致的回答:
正确完成并且一旦可用,GC would be part of WebAssembly itself,但您始终可以自担风险嵌入 Boehm GC(在 WebAssembly 中扫描堆栈非常棘手,因为在 VM 中无法访问本地人!)。
但并非所有语言的 VM 都有 GC。他们还有很多其他功能,有些甚至可能想要自己的just-in-time compilation on top of WebAssembly。
基类库通常只是关于对象布局,它们很容易转换为 WebAssembly。请参阅 libc++abi 了解这对 C++ 的意义。
也就是说,运行时不必在编译的二进制文件中。两种选择:
.wasm file 中。这意味着多个不同的.wasm 文件可以共享运行时!多个网站甚至可以共享 runtime.wasm 并希望所有缓存命中已编译代码(假设 CORS 有效)。事实上,为了做任何有用的事情,您必须至少做以下 1.:WebAssembly 没有为嵌入器定义任何 API。在web embedding 中,做任何事情的唯一方法是通过 WebAssembly 的import and export sections 从 JavaScript 调用和/或调用 JavaScript。从这个意义上说,JavaScript 是您应用程序的微内核,为communicate with the rest of the platform 提供功能。
当您的语言运行时需要某些平台功能时,这会变得很棘手。例如,为 Web 重新创建平台的原生 UI 库并非易事。语言的大部分运行时都可以“正常工作”,但某些部分可能需要大量工作。
【讨论】: