假设我们有以下内容:
(module)
Run Code Online (Sandbox Code Playgroud)
只是一个简单的模块,没有函数、局部变量、内存和所有花哨的东西。现在,如果我不想过度填充我的模块怎么办?我的意思是 id 喜欢有两个模块,但在尝试编译类似以下内容时,我显然遇到了错误:
(module)
(module)
Run Code Online (Sandbox Code Playgroud)
那么有没有办法让每个模块都有自己的内存或id呢?或者有什么办法可以做到吗?这还有道理吗?我只是说因为模块真的会变得很大。
我想要完成的是在两个模块之间进行通信,因为我相信防止模块变得太大是有意义的。我对 WebAssembly 很陌生,所以也许我所说的听起来很疯狂。
WebAssembly 模块类似于磁盘上的可执行文件:它们尚未加载到内存中。
WebAssembly 实例使模块变得栩栩如生。您可以多次实例化同一个模块,也可以实例化多个模块。实例化将加载模块,编译/验证它,初始化其全局变量和内存(如果有),填充导出,然后调用其启动函数。
您的示例使用 s-表达式语法,但您没有指定如何执行 WebAssembly。s-表达式本身只是文本,需要嵌入器来运行编译结果!
在 JavaScript 嵌入中,API具有WebAssembly.Module和WebAssembly.Instance构造函数,以及WebAssembly.compile和WebAssembly.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")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4197 次 |
| 最近记录: |