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


​for a stack-based virtual machine​​Web​

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

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

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

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

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

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

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

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

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

嵌入 WebAssembly 运行时和实例化 WebAssembly 模块非常简单,如果省略错误处理,下面几行代码就可以完成所有这些工作。




2023-01-23 21:59  ​​JerryWang_汪子熙​​