当前位置: 首页 > Web前端 > HTML

嵌入WebAssembly运行时和实例化WebAssembly模块的几大要素

时间:2023-03-28 17:22:10 HTML

以下代码忽略了错误处理机制,介绍了如何在Go语言开发的宿主程序中嵌入WebAssembly.func。createWasmVM(code[]byte){engine:=wasmtime.NewEngine()module,_:=wasmtime.NewModule(engine,code)store:=wasmtime.NewStore(engine)linker:=wasmtime.NewLinker(engine)inst,_:=linker.Instantiate(store,module)_=inst}这段代码涉及几个重要的WebAssembly概念,简单介绍如下:Engine:用于编译和管理wasm模块的全局上下文。模块:已编译的WebAssembly模块。此结构表示实例化后准备执行的内存中JIT代码。Store:所有的WebAssembly对象和主机值都会“连接”到store。实例:一个实例化的WebAssembly模块,你可以从中实际获得一个函数,例如称呼。在实例化时,调用模块的启动函数。链接器(仅限Wasmtime):将wasm模块/实例链接在一起的辅助结构。上面的代码虽然创建了一个WebAssembly模块的实例,但是根据WebAssembly的规范,start函数还是会被执行的。但是由于安全限制,无法输出执行结果,所以即使执行了也没有效果。因此,我们需要实现宿主程序与WebAssembly程序的互操作,为WebAssembly程序提供输入/输出接口。假设我们的WebAssembly程序有一个名为sum的函数,它接受两个整数变量作为参数并返回它们的和,宿主程序可以使用以下代码调用该函数:fn:=inst.GetExport(store,"sum").Func()r,_:=fn.Call(store,1,2)fmt.Println(r.(int32))虽然具体的调用方式与宿主程序的编程语言和使用的WebAssembly运行时不同,但是运行时文档一般都有相关说明,照着文档做就行了。这里的困难部分是如何从WebAssembly程序中导出sum函数,以便宿主程序可以找到并调用它。前面说了,只要有编译器,任何语言都可以编译成WebAssembly,但是大部分语言在设计的时候都没有考虑WebAssembly的需求,也没有办法在WebAssembly中导出函数。所以这个问题只能通过特定编译器的非标准扩展来解决。也就是说,找到这个非标准扩展是解决问题最关键的一步。

猜你喜欢