1 什么是WebAssembly
WebAssembly(Wasm)是一种可移植的字节码格式,本身为了解决日益复杂的前端 Web 应用以及有限的JavaScript 脚本解释性能而诞生的技术,通过该技术可以使用非JavaScript 编程语言编写代码并且能在浏览器上运行[1]。
随着Wasm的发展,现在Wasm不仅仅可以用于浏览器,同样可以被应用在server-side程序中,它已经被定义为一个可移植、体积小、加载快的一种通用二进制格式。其指令本身并不直接面向程序开发者,而是被设计为其他编程语言(如Rust、C++、Go)的编译目标,可以在任何具有Wasm运行时的平台上运行。
Wasm在云原生领域的应用生态正在蓬勃发展。Wasm程序可以像容器一样在云原生环境中运行,帮助开发者轻松地构建和部署应用程序。Wasm可以提供更高的性能,更快的启动时间,更低的资源消耗,以及更好的可移植性,是除容器外的另一种对计算和资源的抽象方式。因此Wasm出身就符合云原生的理念,可以很好地在云上运行。目前围绕Wasm相关的云原生相关项目正在涌现。
2 为什么需要WebAssembly
上层语言无关
其实像Wasm这种“编译中间目标 + 跨平台执行”的思想在某些编程语言中已经存在。例如在Java语言中,开发者编写的代码被编译为字节码,再由Java虚拟机执行字节码。不同的是,Wasm是一个通用的编译目标,它允许开发者用任何他们熟悉的编程语言(只要支持编译目标为Wasm,具体请参见支持的语言列表[2])来编写Wasm程序,不需要为了开发某个功能而学习一门新的语言。同时,语言无关性意味着Wasm解锁了各种上层语言生态的大门,使其开发过程本身就具备灵活便利的特点。
轻量级和高性能
Wasm能够达到接近原生机器码的运行速度,有着快速的启动时间和很小的空间占用。与Docker容器相比,Wasm及其运行时可以快速执行并且体积非常小,在运行时性能方面,WebAssembly 比 Docker 快 10%-50%;在启动时间方面,Wasm比Docker快约100倍[3]。在serverless场景中,冷启动是一个困扰已久的问题,而Wasm在这方面有着天然的优势,因此Wasm被认为是一个解决冷启动问题的高效运行时。
高安全性
Wasm二进制是在内存安全的隔离沙箱中执行的,它不仅比原生二进制文件更安全,而且比Docker这样的OS级容器更安全。Wasm对系统资源的操作必须申请明确的权限[4],拥有权限后通过一系列接口与主机环境通信。通过严格的资源约束控制,Wasm可以安全可靠地在各种平台上运行。
Wasm这种良好的隔离性和安全性也使得其非常适合多租户的场景。这种特性正是云计算非常需要的,因此Wasm有潜力成为除容器外的另一种计算运行时。