【问题标题】:Webassembly multiple modules?Webassembly多个模块?
【发布时间】:2017-04-20 07:52:33
【问题描述】:

假设我们有以下内容:

(module)

只是一个简单的模块,没有函数、本地变量、内存和所有花哨的东西。 现在如果我不想过度填充我的模块怎么办?我的意思是 id 喜欢有两个模块,但在尝试编译类似以下内容时显然会出错:

(module)
(module)

那么有没有办法让每个模块都有自己的内存或ID?或者有什么办法吗?它甚至有意义吗?我只是说,因为一个模块真的可以变得很大。

我试图完成的是在两个模块之间进行通信,因为我认为防止模块变得太大是有意义的。我是 webassembly 的新手,所以我说的可能听起来很疯狂。

对于编译测试,我使用https://mbebenita.github.io/WasmExplorer/

【问题讨论】:

    标签: webassembly


    【解决方案1】:

    WebAssembly 模块类似于磁盘上的可执行文件:它们尚未加载到内存中。

    WebAssembly 实例使模块栩栩如生。您可以多次实例化同一个模块,也可以实例化多个模块。实例化将加载模块,编译/验证它,初始化它的全局变量和内存(如果有的话),填充导出,然后调用它的启动函数。

    您的示例使用 s-expression 语法,但您没有指定如何执行 WebAssembly。 s-expression 本身只是文本,需要一个嵌入器来运行编译结果!

    在 JavaScript 嵌入中,the API 具有 WebAssembly.ModuleWebAssembly.Instance 构造函数,以及 WebAssembly.compileWebAssembly.instantiate 函数(两者都有效,WebAssembly.instantiate 更简单/更好)。您将实例构造函数/函数传递给导入对象。 WebAssembly 内存要么通过在二进制文件中声明内存部分(然后在实例化时自动创建内存)来创建,要么通过导入对象导出。

    您甚至可以通过创建多个模块、通过在它们之间共享内存来实例化它们以及让它们导入/导出彼此的功能来执行动态链接。

    在规范解释器中,您可以声明多个经过验证的模块,并且您可以使用额外的助手来处理它们。请参阅this test,其开头为:

    (module "\00asm\01\00\00\00")
    (module "\00asm" "\01\00\00\00")
    (module $M1 "\00asm\01\00\00\00")
    (module $M2 "\00asm" "\01\00\00\00")
    
    (assert_malformed (module "") "unexpected end")
    (assert_malformed (module "\01") "unexpected end")
    

    【讨论】:

    • 我仍在使用 mozilla 提供的资源管理器(仍在尝试)mbebenita.github.io/WasmExplorer。稍后我将安装真实的东西,但我假设资源管理器使用与我们可以从 git 等下载的编译器相同的编译器
    • 我是否明白 JavaScript 是绝对需要让模块相互协作的任务?
    • WebAssembly 并没有规定您可以使用哪种编译器。 LLVM+Emscripten 是不错的选择,有一个 GCC 实验,我相信我们将来会看到更多。
    • 所以基本上我们需要一些 javascript 桥接器。所以我有模块 A 并导出数据,导入到 javascript 和 javascript 可以使用该数据将其传递给模块 B,因此 A 和 B 通过 javascript 提供的 api 进行通信?
    • JavaScript 不是需要,但它是目前最好的嵌入。你也可以试试 spec 解释器、binaryen 的解释器等等……WebAssembly 是为non-web embeddings 设计的,也可以正常工作。现在 JavaScript 是最好的嵌入。
    【解决方案2】:

    a specification for linkable WebAssembly modules。它是非官方的和可选的,但是如果您创建 WebAssembly 模块以使其符合本规范,则可以使用像 LLVM’s lld 这样的链接器来链接它们。

    【讨论】:

      猜你喜欢
      • 2022-12-16
      • 1970-01-01
      • 2022-09-28
      • 2019-03-11
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      相关资源
      最近更新 更多