Web组装多个模块?

时间:2017-04-20 07:52:34

标签: webassembly

让我们假设我们有以下内容:

(module)

只是一个简单的模块,没有功能,本地,内存和所有花哨的东西。 现在如果我不想超出我的模块怎么办?我的意思是id喜欢有两个模块,但我在尝试编译类似的东西时显然会出错:

(module)
(module)

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

在JavaScript嵌入the API中有WebAssembly.ModuleWebAssembly.Instance构造函数,以及WebAssembly.compileWebAssembly.instantiate函数(可以正常工作,{{1}更简单/更好)。您将实例构造函数/函数传递给导入对象。 WebAssembly存储器可以通过在二进制文件中声明一个内存部分(然后在实例化时自动创建一个内存),或者通过导入对象导出它来创建。

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

在规范解释器中,您可以声明多个经过验证的模块,并且您可以使用额外的帮助程序来查看它们。请参阅以{:3}开头的this test

WebAssembly.instantiate

答案 1 :(得分:0)

a specification for linkable WebAssembly modules。它是非官方的和可选的,但是如果您创建WebAssembly模块以使其符合此规范,则可以使用LLVM’s lld之类的链接器进行链接。