例如,如果Microsoft为.NET创建了WebAssembly目标,他们是否需要将.NET运行时嵌入到已编译的二进制文件中?如果他们没有,垃圾收集器和基类库如何工作?
答案 0 :(得分:2)
简单回答:是的。
要在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。
基类库通常只是关于objet布局,它们很容易转换为WebAssembly。有关C ++的含义,请参阅libc++abi。
那就是说运行时不必在 编译的二进制文件中。两个选项:
.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库并非易事。语言的大部分运行时都可以“正常工作”,但某些部分可能需要大量的工作。