当前位置: 首页 > 后端技术 > PHP

如何在Go语言开发的宿主程序中嵌入WebAssembly

时间:2023-03-29 16:46:58 PHP

在WebAssembly的官方定义中,“forastack-basedvirtualmachine”这句话也很值得关注,因为它引领了WebAssembly这一原本为Web(名为ThetermWebisincludedin),终于进入了后端领域。这是因为,从早期的VMWareWorkStation、VirtualBox,到今天的Docker,虚拟化技术一直是云计算的基础。因此,作为一种具有诸多优势的虚拟机代码格式,WebAssembly进军后端应用领域是必然趋势。Docker创始人SolomonHykes在2019年表示:如果WASM+WASI在2008年存在,我们就不需要创建Docker。可见WebAssembly在后端应用中确实有着广阔的应用前景。当然,SolonHykes表示,他并不是说WebAssembly以后会取代Docker。这也是当今业界普遍的看法:WebAssembly和Docker各有优势,相得益彰。具体来说:WebAssembly程序的大小通常在1M左右,而Docker镜像往往很容易超过100M,因此WebAssembly的加载速度要快得多。WebAssembly程序的冷启动比Docker容器快大约100倍。WebAssembly在沙箱中运行,与外界的任何交互都需要明确的许可才能进行,安全性极佳。WebAssembly模块只是一个二进制程序,不包含操作系统环境,因此不能像我们在Docker中那样编译和执行。如下图所示,无论是Web应用还是非Web应用,我们都需要在宿主程序中嵌入WebAssemblyRuntime(运行时)才能使用WebAssembly。唯一不同的是,在web应用中,宿主程序就是浏览器,而在非web场景中,宿主程序就是我们自己的应用,而在后端应用中,宿主程序就是我们的后端服务。目前可用的WebAssembly运行时包括Wasmtime、WasmEdge、WAVM、Wasmer等,各有优缺点。下面以Wasmtime为例,介绍如何在Go语言开发的宿主程序中嵌入WebAssembly。嵌入WebAssembly运行时和实例化WebAssembly模块非常简单。如果省略错误处理,下面几行代码就可以完成所有这些任务。funccreateWasmVM(code[]byte){engine:=wasmtime.NewEngine()module,_:=wasmtime.NewModule(engine,code)store:=wasmtime.NewStore(engine)linker:=wasmtime.NewLinker(engine)inst,_:=链接器。实例化(商店,模块)_=inst}