WebAssembly不是软件!它是计算机中的计算机
整理丨诺亚
不要把Wasm当成软件,它是计算机中的计算机。
WebAssembly的诞生源起于几大Web浏览器供应商(Apple,Google,Microsoft,Mozilla)之间的合作。设计者最初将其设想为一个安全可靠的执行环境,用于以近乎本机的性能在Web上运行不受信任的代码。
然而时至今日,这门新兴技术早已扩展到Web浏览器之外,甚至有一部分人认为,Wasm将取代容器技术和无处不在的JavaScript。
这些当然远远不足以说明Wasm的惊艳之处,游戏规则的改变者可没有那么简单。
1、比Java还狠:“一次部署、随处部署”
如今,WebAssembly的计算潜力已经得到了很大的认可。这不得不归因于它的设计初衷。
众所周知,人们使用各种不同种类的语言来编写软件,让这些语言相互交互是很困难的。而WebAssembly恰恰提供了一个框架,让开发人员可以用他们想要的语言进行编写,然后,它会生成通用的模拟计算机格式,这种格式允许用各种语言编写的组件相互通信。
正如边缘云平台Fastly的工程师Luke Wagner提到的:“Wasm的设计是编程语言的可移植编译目标。我认为这里的关键词是'编译目标',这意味着我们可以采用我们的各种源语言。”
“除了能够将它们编译成所有不同的本机指令集外,我们还可以将它们编译成WebAssembly。然后,我们可以将这个WASM发送给浏览器或某种类型的WASM引擎,该引擎将在内部将其编译为运行它的实际指令集。这给我们带来的是可移植性、确定性(如果需要的话)、控制流完整性和子进程沙箱。”
由此看来,WebAssembly要实现的是“一次部署,随处部署”。更准确的说,理想情况下,你可以编写一次代码,几乎不需要任何配置,就可以将其部署到任何CPU或设备上。尽管有人可能会觉得有失偏颇,但在某些方面,的确可以把它看作是一个高效的编译器。
2、不止浏览器,简直无处不在
发布于2018年的WebAssembly,最初是作为Web开发领域的技术,引起了关注。而在2019年,WASI(WebAssembly系统接口)的出现使情况发生了变化,它为Wasm提供了一个模块化的界面,将WebAssembly带到了浏览器之外。
WebAssembly的这种转变甚至促使Docker联合创始人Solomon Hykes在2019年发推文说:“如果WASM+WASI在2008年就存在,我们就不需要创建Docker了。这就是它的重要性。服务器上的WebAssembly是计算的未来。”
短短四五年光景,我们看到WebAssembly在浏览器之外的应用也渐入佳境。
根据今年9月发布的《WebAssembly 2023现状报告》,SlashData与CNCF(云原生计算基金会)合作对255名WebAssembly用户进行调查,发现WebAssembly的使用已经远远超出了其最初的 Web 应用程序目标。
该报告发现,虽然Wasm仍然主要用于开发Web应用程序(58%),但它的使用正在从原始用例扩展到数据可视化(35%),物联网(32%),人工智能(30%),后端服务(不包括无服务器)(27%)和边缘计算(25%)等新领域。
“在浏览器之外,在现有系统中嵌入Wasm以使访客代码更接近系统是一种流行的做法。举个例子,一个浏览器有很多不是用JavaScript编写的代码。此外,人们正在使用Wasm来探索分布式计算的替代模型,如无服务器、分布式行动者、记录和回放,边缘计算等等。”Fastly工程师Wagner如是说。
当前,尽管可以从广泛的软件项目中看到WebAssembly的身影,但挑战依然存在,比如WebAssembly模块目前仍然无法支持所有编程语言;即使在它支持的少数编程语言中,如Rust、C++、Python,要将其部署到各种设备中依然有各自的问题;组件结构仍然不够标准化……这些挑战的解决或许只要一两年,或许还需要相当长的时间,届时WebAssembly的跨平台部署才能展现其真正的功能。
WebAssembly应用程序使用的语言排行,JavaScript是Wasm应用程序最流行的语言
3、Wasm不是软件,是一种新型“计算机”
虽然WebAssembly还处于发展早期,但在某些圈内人士来看,它已经表现出将技术车轮推向未来的潜力。
NGINX产品管理高级总监Liam Crilly在最近的一次谈话中,将WebAssembly比作一台概念意义上的计算机。他是这样解释的:虽然WebAssembly不能直接在物理设备上运行,但它有可能通过使用WebAssembly模块在用于数据交换和部署的设备网络上运行。
“WebAssembly允许我们重新思考我们需要的抽象。它使我们能够迈出下一步,而不是持续地锚定在我们用来描述存储和计算的初始元素上。这就是为什么我在Kubernetes的背景中提到它,因为它仍然带有一些包袱。”
实际上,WebAssembly可以被认为是一种新型的计算机。它拥有一个指令集,类似于CPU,“汇编(Assembly)”部分就是从它派生出来的。
当你检查示例代码时,它与此非常相似,前提条件是它是人类可读的。这台简单的“计算机”能做传统计算机可以执行的任何事情。重要的是,这个新的指令集成为所有编程语言的编译目标。从本质上讲,任何高级编程语言不仅可以编译为特定硬件的CPU指令集,还可以编译为WebAssembly指令集。
此外,WebAssembly可以被视为一个强大的编译器目标,正如Crilly所解释的:“WebAssembly的迷人之处在于它提供了编译器的优势,使你能够使用高级语言并生成优化良好的指令集代码。”
然而,由于WebAssembly的功能是一个抽象的计算机,它需要一个虚拟机或运行时来接受这个指令集并在硬件上执行它。虽然这最初看起来像是一个额外的抽象层,但实际上它非常巧妙。
Crilly说,使用WebAssembly,就可以为任何硬件构建一个运行时,开发人员和运营人员就不再需要关注具体的硬件细节。
“如果我有一个编译到这个指令集的 WebAssembly 模块,我就会获得编译器优化的好处,其中包括运行时的即时 (JIT) 优化,因为我将这个指令集的字节码转换为 CPU 指令。这个额外的优化层类似于 JIT 编译器和浏览器运行时,可提供接近本机的计算性能。因此,这个抽象层的缺点很小。”
4、Wasm:计算机中的计算机
“将WebAssembly视为计算机”的概念并非猎奇。
企业管理协会(EMA)分析师Torsten Volk对此更进了一步,将Wasm描述为“计算机中的计算机”。
“它不是提供对CPU,RAM,存储和网络硬件的直接访问,而是为应用程序提供对这些资源的简化通用版本的访问权限。通过将来自为Wasm编译的应用程序字节码的指令转换为直接与CPU、RAM和磁盘指令集通信的字节码来实现这一点。一旦此转换层普遍适用于大多数类型的应用程序,你实际上可以将 Wasm运行时描述为一种新型计算机。"
在操作系统与硬件的关系上,人们的探索从未停止。而WebAssembly的出现无疑为此提供了另一种答案。
Fermyon Technologies的联合创始人兼首席执行官Matt Butcher谈到:“虚拟机打破了将操作系统视为与硬件具有一对一关系的思维。我们可以在单个硬件上运行许多操作系统,而容器通过允许我们安全地(并以多租户方式)运行许多共享一个内核的离散文件系统来进一步推动这一故事。“
“Wasm可以被视为第三次浪潮:应用程序不直接依赖于主机操作系统。它只是声明它需要什么,主机运行时可以专门满足这些需求。最后,开发人员不需要了解目标环境的操作系统或架构。”
5、写在最后
整体上看,WebAssembly 不仅通过沙盒执行提高了安全性,还通过使开发人员能够使用几乎所有流行语言创建高性能 Web 应用程序。随着WebAssembly的不断发展和生态系统的扩展,其“游戏规则改变者”的角色在开源开发的格局中可能会愈发突出。
不过在WebAssembly能发挥其全部潜力之前,还有很长的路要走。在许多方面,Wasm的格局类似于几年前Kubernetes蓬勃发展的早期开发和采用。
值得一提的是,根据《WebAssembly 2023现状报告》,大多数软件开发人员对未来在Web和非Web环境中采用Wasm持乐观态度。报告提到,将现有应用程序迁移到 Wasm 时,30%的受访者体验到超过 50%的性能优势。此外,“更快的加载时间,探索新用例和技术的能力,在项目之间共享代码的能力”均是WebAssembly吸引开发人员的主因。
另外,报告中约有22%的参与者对Wasm在Web或非Web环境中的采用表示悲观。关于Wasm面临的挑战,受访者则提到了调试和故障排除困难,运行时之间的性能不同,运行时之间缺乏一致的开发人员体验,缺乏学习材料以及与某些浏览器的兼容性问题。
参考链接:
https://thenewstack.io/webassembly-reaches-a-cloud-native-milestone/
https://developers.slashdot.org/story/23/09/10/0653235/webassembly-2023-survey-finds-enthusiasm---and-some-challenges
https://www.infoworld.com/article/3706249/developers-have-doubts-about-webassembly-report-finds.html
https://andrewzuo.com/linux-foundation-report-finds-serious-issues-with-webassembly-b9c47b3b0b4c