从此
文章
📄文章 #️⃣专题 🌐上网 📺 🛒 📱

WebAssembly发展的三大支柱

🕗2021-12-18

 

围绕WebAssembly的软件行业正大行其道。这项技术通常名为WASM,正在改变我们的代码在Web浏览器、边缘云和物联网设备等环境中的执行方式。

 

 

本文主要介绍什么让WASM显得很特殊、为什么您应该关心它,以及为什么我认为它会在未来几年驱动新一代软件。我将列出WebAssembly的三大支柱——安全性、可移植性和性能,并概述为什么这三大支柱使WASM成为一股不可忽视的力量。

 

 

安全性

 

 

不妨从安全性开始说起。如今,安全性是许多人的头等大事,供应链问题、加密货币劫持和数据泄露的报道屡见不鲜。WebAssembly从许多方面加强安全,从安全沙箱开始入手。

 

 

执行WASM后,代码无法访问任何内容,包括网络、文件系统或沙箱外面的其他任何内容。这被称为默认拒绝安全模式,它不是由Docker等容器技术实现的。针对WASM沙箱内运行、与外界进行交互的代码,必须明确授予它对主机功能的访问权限。

 

 

Web浏览器可以授予WASM模块某些功能,比如获取API和访问DOM。云环境等其他主机可以使用WASI(WebAssembly系统接口)授予模块对文件系统、随机性(如 /dev/urandom)和系统时间等常见对象的访问权限。这一切确保了WASM模块内的代码只可以访问其运行所需要的资源,别的资源访问不了。

 

 

为了应对猖獗的供应链攻击,还有组织竭力使WebAssembly模块的加密签名成为该规范的标准部分。能够使用受信任的密钥对模块进行签名,并在系统尝试运行该模块时验证该签名,这将是一大胜利,并有助于在使用WebAssembly构建应用程序时夯实“纵深防御”这种理念。

 

 

软件供应商开始将其API库作为WASM模块来分发时,这将变得尤为重要;我们将能够充分利用跨语言模块链接(指由不同语言构建的模块能够共享内存和函数),同时还可以验证模块是由供应商开发的、并且未经篡改。

 

 

可移植性

 

 

链接模块这个想法引出了第二个支柱:可移植性。我喜欢从两个方面来思考WASM的可移植性:语言可移植性和平台可移植性。语言可移植性是用一种语言(比如Rust)编写的模块在用另一种语言(比如Go)编写的系统中运行的能力。由于WASM运行时环境可以嵌入到其他软件中,它们可用于引入专门的组件,而这些组件原本是您团队使用的主要语言不可能实现的。这个概念还可以应用于通过将用不同语言编写的多个WASM模块组合起来以形成单个软件而构建的应用程序,比如Atmo 框架。

 

 

在平台可移植性方面,WebAssembly不依赖任何硬件架构,因此它可以在多个不同平台上执行,无需重新编译。比如说,这将让您可以生成单个WASM文件,在物联网设备和云虚拟机上都可以运行。WASM模块被执行时,它就被提前(AOT)或即时(JIT)编译成机器原生代码。

 

 

WASM运行时环境(比如Chrome的V8、Wasmtime或Wasmer)自动执行该编译,这使得运行任何模块都非常简单。比如说,这在以下场景中变得很有用:当流量高峰导致某个模块面临大量的入站请求时,您的代码自动从中央云实例移动到边缘计算网络。

 

 

性能

 

 

最后一个支柱是性能。WebAssembly旨在以原生或接近原生的速度执行代码。有众多因素影响任何应用程序的性能,包括语言、硬件、垃圾收集和虚拟化等。

 

 

使用WebAssembly,只需在运行时针对每个平台优化自己,就可以以高性能的方式轻松执行代码。我们仍处于WebAssembly的早期阶段,但它的性能已经可以与经过多年优化的V8 JavaScript引擎相媲美。所有可编译成WebAssembly的语言都将受益于将来为WASM运行时环境带来的任何性能改进,这对所有人来说都是一大利好。

 

 

我邀请您思考您在构建软件时,问问自己开发平台的哪些方面对您最重要。我敢打赌,本文讨论的三个支柱中至少有两个是贵公司的关键因素,您可以通过采用WebAssembly这种技术,改进代码的关键属性。但愿WASM会成为支持软件工作流程的底层技术,开发人员根本不需要操心它,就像今天大多数开发人员并不操心所用语言的编译器生成的汇编代码一样。

 

 

主要区别在于,WebAssembly一开始就内置了这些出色的属性,确保您的代码在默认情况下是安全的、可移植的和高性能的,而今天的软件工具做不到这点。