3

假设我们有以下内容:

(module)

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

(module)
(module)

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

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

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

4

2 回答 2

4

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

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

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

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

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

在规范解释器中,您可以声明多个经过验证的模块,并且您有额外的助手可以戳它们。请参阅此测试,其开头为:

(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")
于 2017-04-20T07:59:58.823 回答
0

一个可链接的 WebAssembly 模块的规范。它是非官方的和可选的,但是如果您创建 WebAssembly 模块以使其符合本规范,则可以使用LLVM 之lld类的链接器来链接它们。

于 2019-01-02T14:55:14.870 回答