WebAssembly 模块类似于磁盘上的可执行文件:它们尚未加载到内存中。
WebAssembly 实例是使模块栩栩如生的原因。您可以多次实例化同一个模块,也可以实例化多个模块。实例化将加载模块,编译/验证它,初始化它的全局变量和内存(如果有的话),填充导出,然后调用它的启动函数。
您的示例使用 s-expression 语法,但您没有指定如何执行 WebAssembly。s 表达式本身只是文本,需要一个嵌入器来运行编译结果!
在嵌入的 JavaScript 中,API具有WebAssembly.Module
andWebAssembly.Instance
构造函数,以及WebAssembly.compile
andWebAssembly.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")