【问题标题】:For managed languages, will the language runtime need to be embedded into the web assembly executable?对于托管语言,语言运行时是否需要嵌入到 Web 程序集可执行文件中?
【发布时间】:2017-03-29 04:49:37
【问题描述】:

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

【问题讨论】:

    标签: webassembly


    【解决方案1】:

    简单的回答:是的。

    要在 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

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

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

    1. 改为在 JavaScript 中嵌入运行时。你可以用 JavaScript 实现重要的代码,比如chunks of a libc。语言虚拟机的运行时并没有什么不同。
    2. 将运行时嵌入到单独的dynamically-linked .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 库并非易事。语言的大部分运行时都可以“正常工作”,但某些部分可能需要大量工作。

    【讨论】:

    • 信任如何在共享动态链接的 WASM 文件方面发挥作用?目前,缓存是在域级别,但如果一个域可以链接到另一个域提供的运行时,这不会引入一些非常基本的信任问题吗?
    • @w.brian 与网络上的任何其他内容相同:如果您不信任它,请小心!通过 https 加载它,并验证校验和(或使用 SRI,如果可用)。在任何情况下,都不能保证浏览器会跨源缓存内容或缓存已编译的代码。不过,如果这种用法变得普遍,我希望我们会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多