让我们假设我们有以下内容:
(module)
只是一个简单的模块,没有功能,本地,内存和所有花哨的东西。 现在如果我不想超出我的模块怎么办?我的意思是id喜欢有两个模块,但我在尝试编译类似的东西时显然会出错:
(module)
(module)
那么有没有办法给每个模块自己的内存或ID?或者有没有办法这样做?它甚至有意义吗?我只是说,因为一个模块真的可以变得很大。
我想要完成的是在两个模块之间进行通信,因为我认为防止模块变得太大是有意义的。我是webassembly的新手,所以也许我说的听起来很疯狂。
答案 0 :(得分:4)
WebAssembly模块类似于磁盘上的可执行文件:它们尚未加载到内存中。
WebAssembly实例使模块变为现实。您可以多次实例化同一模块,或实例化多个模块。实例化将加载模块,编译/验证它,初始化其全局变量和内存(如果有的话),填充导出,然后调用它的启动函数。
您的示例使用s-expression语法,但您没有指定执行WebAssembly的方式。 s-expression本身只是文本,运行编译结果需要一个嵌入器!
在JavaScript嵌入the API中有WebAssembly.Module
和WebAssembly.Instance
构造函数,以及WebAssembly.compile
和WebAssembly.instantiate
函数(可以正常工作,{{1}更简单/更好)。您将实例构造函数/函数传递给导入对象。 WebAssembly存储器可以通过在二进制文件中声明一个内存部分(然后在实例化时自动创建一个内存),或者通过导入对象导出它来创建。
您甚至可以通过创建多个模块来执行动态链接,通过在它们之间共享内存来实例化它们,并让它们导入/导出彼此的功能。
在规范解释器中,您可以声明多个经过验证的模块,并且您可以使用额外的帮助程序来查看它们。请参阅以{:3}开头的this test
WebAssembly.instantiate
答案 1 :(得分:0)
有a specification for linkable WebAssembly modules。它是非官方的和可选的,但是如果您创建WebAssembly模块以使其符合此规范,则可以使用LLVM’s lld
之类的链接器进行链接。