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

在 WebAssembly的官方定义中,for a stack-based virtual machine 这句话也值得关注,因为它引领了 WebAssembly 这一原本为 Web 设计的技术(名字中就包含了Web一词),最终进入后端领域。

这是因为,从早期的 VMWare WorkStation、VirtualBox,到今天的 Docker,虚拟化技术一直是云计算的基础。 因此,作为一种具有诸多优势的虚拟机代码格式,WebAssembly 进入后端应用领域是必然趋势。 Docker 创始人 Solomon Hykes 在 2019 年表示:

如果 WASM+WASI 在 2008 年就存在,我们就不需要创建 Docker

可见 WebAssembly 在后端应用中确实具有广阔的应用前景。

当然,Solon Hykes 表示,他的意思并不是稍后 WebAssembly 将取代 Docker.

这也是当今业界普遍的看法:WebAssembly 和 Docker 各有优势,相得益彰。 具体来说:

  • WebAssembly 程序的大小通常在 1M 左右,而 Docker 镜像往往很容易超过 100M,因此 WebAssembly 的加载速度要快得多。
  • WebAssembly 程序的冷启动速度比 Docker 容器快约 100 倍。
  • WebAssembly 运行在沙箱中,任何与外界的交互都需要获得明确的许可后才能进行,安全性极佳。
    WebAssembly 模块只是一个二进制程序,不包含操作系统环境,所以它不能像我们在 Docker 中那样编译后执行。

如下图所示,无论是 Web 应用还是非 Web 应用,我们都需要在宿主程序中嵌入WebAssembly Runtime(运行时)才能使用 WebAssembly.

唯一不同的是,在 web 应用中,宿主程序是浏览器,而在非 web 场景中,宿主程序是我们自己的应用,具体到后端应用,宿主程序则是我们的后端服务。

如何在 Go 语言开发的宿主程序中嵌入 WebAssembly_第1张图片

目前可用的 WebAssembly 运行时包括 Wasmtime、WasmEdge、WAVM、Wasmer 等,各有优缺点。

下面以 Wasmtime 为例,介绍如何在 Go 语言开发的宿主程序中嵌入 WebAssembly.

嵌入 WebAssembly 运行时和实例化 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
}

你可能感兴趣的:(如何在 Go 语言开发的宿主程序中嵌入 WebAssembly)