2017-04-20 142 views
2

让我们假设我们有以下几点:Webassembly多个模块?

(module) 

只是一个简单的模块,没有功能,本地人,内存和所有的花哨的东西。 现在如果我不想过度使用我的模块?我的意思是ID想有两个模块,但我显然得到一个错误试图编译像时:

(module) 
(module) 

那么,有没有办法给每个模块自身的存储器或ID?或者有什么办法可以这样做?它有意义吗?我只是说,因为一个模块真的会变得巨大。

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

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

回答

2

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

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

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

在JavaScript嵌入the APIWebAssembly.ModuleWebAssembly.Instance构造,还有WebAssembly.compileWebAssembly.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") 
+0

我还在使用由Mozilla(尚在测试阶段上有)https://mbebenita.github.io/WasmExplorer/提供的探险家。后来即将安装真实的东西,但我假设浏览器使用相同的编译器,我们可以从git等下载那些编译器 – Asperger

+0

我是否明白,使模块彼此协作的这项任务绝对需要JavaScript? – Asperger

+0

WebAssembly不指定您可以使用哪种编译器。 LLVM + Emscripten是不错的选择,还有一个GCC实验,我相信我们会在未来看到更多。 –