对于托管语言,是否需要将语言运行时嵌入到Web程序集可执行文件中?

时间:2017-03-29 04:49:37

标签: webassembly

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

1 个答案:

答案 0 :(得分:2)

简单回答:是的。

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

更长,细致入微,回答:

完成正确且一旦可用,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

那就是说运行时不必在 编译的二进制文件中。两个选项:

  1. 将运行时嵌入JavaScript中。您可以在JavaScript中实现重要代码,例如chunks of a libc。语言VM的运行时并没有什么不同。
  2. 将运行时嵌入到单独的dynamically-linked .wasm file中。这意味着多个不同的.wasm文件可以共享运行时!多个网站甚至可以共享runtime.wasm并希望所有缓存命中已编译的代码(假设CORS已成功)。
  3. 事实上,要做任何有用的事情,必须至少执行1中的某些操作:WebAssembly没有为嵌入器定义任何API。在web embedding中,通过WebAssembly import and export sections从JavaScript调用和/或调用JavaScript,从而完成任何的唯一方法。从这个意义上讲,JavaScript是应用程序的微内核,为communicate with the rest of the platform提供了功能。

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