WebAssembly模块类似于磁盘上的可执行文件:它们没有被加载到内存中。
WebAssembly实例是什么使模块成为现实。您可以多次实例化相同的模块,或者实例化多个模块。实例化将加载模块,编译/验证它,初始化它的全局变量和内存(如果有的话),填充导出,然后调用它的启动函数。
您的示例使用s表达式语法,但您不指定如何执行WebAssembly。 s表达式本身就是文本,需要使用嵌入器来运行编译结果!
在JavaScript嵌入the API有WebAssembly.Module
和WebAssembly.Instance
构造,还有WebAssembly.compile
和WebAssembly.instantiate
功能(无论是工作,WebAssembly.instantiate
更简单/更好)。您将实例构造函数/函数传递给一个导入对象。 WebAssembly存储器可以通过在二进制文件中声明一个存储器部分来创建(然后在实例化时自动创建一个存储器),或者通过导入对象导出它。
您甚至可以通过创建多个模块来执行动态链接,通过在它们之间共享内存来实例化它们,并让它们导入/导出彼此的功能。
在spec解释器中,你可以声明多个模块,这些模块会被验证,并且你有额外的帮助器来捅他们。见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(尚在测试阶段上有)https://mbebenita.github.io/WasmExplorer/提供的探险家。后来即将安装真实的东西,但我假设浏览器使用相同的编译器,我们可以从git等下载那些编译器 – Asperger
我是否明白,使模块彼此协作的这项任务绝对需要JavaScript? – Asperger
WebAssembly不指定您可以使用哪种编译器。 LLVM + Emscripten是不错的选择,还有一个GCC实验,我相信我们会在未来看到更多。 –