WebAssembly不是软件!它是计算机中的计算机

整体上看,WebAssembly 不仅通过沙盒执行提高了安全性,还通过使开发人员能够使用几乎所有流行语言创建高性能 Web 应用程序。随着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面临的挑战,受访者则提到了调试和故障排除困难,运行时之间的性能不同,运行时之间缺乏一致的开发人员体验,缺乏学习材料以及与某些浏览器的兼容性问题。

相关推荐
爱学习的程序媛1 天前
【Web前端】WebAssembly实战项目
前端·web·wasm
REDcker2 天前
Wasm 软解 H.265 方案与原理
wasm·h.265
步步为营DotNet8 天前
ASP.NET Core 10中的Blazor WebAssembly性能优化实践
性能优化·asp.net·wasm
前端之虎陈随易9 天前
Vite 8正式发布,内置devtool,Wasm SSR 支持
前端·人工智能·typescript·npm·node.js·wasm
古城小栈11 天前
Rust 开发 WebAssembly 一眼案例
开发语言·rust·wasm
csdn_aspnet11 天前
.NET 10 中的 Blazor:新增功能及常见问题
wasm·blazor·.net10
zhojiew1 个月前
使用envoy配置jwt校验和ratelimit限流以及通过wasm扩展统计llm消耗token
wasm·envoy
狗都不学爬虫_2 个月前
JS逆向 -最新版 盼之(decode__1174、ssxmod_itna、ssxmod_itna2)纯算
javascript·爬虫·python·网络爬虫·wasm
老百姓懂点AI2 个月前
[WASM实战] 插件系统的安全性:智能体来了(西南总部)AI调度官的WebAssembly沙箱与AI agent指挥官的动态加载
人工智能·wasm