

WebAssembly可以提供跨任何开发语言、操作系统,甚至是处理器架构的运行环境,成了云原生生态圈今年的热门技术,GAI开发者也开始重视,要用来实现超高速的即时AI推论
高盛银行有一个每天数百万次调用请求的开发者API平台,他们在2023年时开始验证如何用Wasm,来封装不同语言所开发的API插件,统一这些插件程序的部署和管理,最后让全部的API插件程序都改用Wasm形式来提供。/高盛集团
德国制造大厂Bosch有个研究团队,则在2023年底时,分享了在自驾车软件和工厂系统运用Wasm的经验。他们用Wasm搭配容器技术,来部署汽车驾驶系统的嵌入式软件组件,大幅简化了电动车内不同类型异质设备的安装管理。他们还看上Wasm的毫秒级冷启动能力,在工业自动化设备的边缘主机上,用Wasm来部署监控软件,可以几乎即时的速度,来分析工控PLC系统回传的数据,来判断是否出现问题要发出预警,就算边缘主机当机(制造工厂环境常见的故障风险),也能快速(毫秒等级)在另一台边缘主机激活新的Wasm监控软件,做到几乎即时的故障自动切换能力,不会中断对工厂自动化产线的持续监控。
Amazon影音服务靠Wasm支持8千种各类设备
Amazon的Prime Video服务则看上了Wasm通吃各种设备、平台的能力。Amazon这项影音服务数百万名顾客所用的设备高达8千种类型,除了电脑、手机,还有游戏主机、各类数位电视、机上盒、USB串流棒等。每次要改版,几乎很难针对每一种环境提供专门的升级版本。所以,Amazon从2020年8月开始测试Wasm,发现同样的功能,用Rust语言开发,再编译成Wasm文件格式运行,可以比用JavaScript开发的运行速度快上10到25倍,便决定在2021年大幅改用WebAssembly混用JavaScript,来简化软件版本升级的流程。
Amazon会在设备上预载两种运行环境,一个是WebAssembly VM,另一个是JavaScript VM。需要大量运算的功能,例如动画模拟、渲染计算等,就改用Wasm技术编译成二进位档,放到WebAssembly VM中运行,而Prime Video App则保留原本的JavaScript代码,加载到另一个JavaScript VM环境中来运行。这个做法,不只更容易靠一两种语言,支持到更多类型的设备,高运算负载的代码从JavaScript改为Wasm后,省下了30MB的内存,只需要7.5MB就能顺畅运行,也降低了不少硬件规格的门槛,提高在低级或行动设备上的运行性能。
WebAssembly并非是这几年隔空出现的新技术,而是问世十年的老技术,一开始是为了解决 JavaScript直译式语言速度太慢的问题,尤其Web应用的功能越来越复杂,程序档也越来越大,动辄数万、数十万行的Web应用代码,如何提高大型Web应用在浏览器中的运行速度成了一大挑战。早在2010年时,有位软件工程师Alon Zakai打造了一款工具Emscripten,可以将C/C++代码编译成JavaScript可运行的形式,2012年更是发布了asm.js技术,这是JavaScript的一项子集合,可以在浏览器中运行C和C++代码来加速。这是WebAssembly标准出现前的JavaScript应用优化尝试。
2015年5月,JavaScript之父Brendan Eich特别来台参加iThome举办的Modern Web大会,回顾这项技术的开发幕后秘辛以及20年来的发展。在演讲中,他特别展示了在浏览器中运行的第一人称3D射击游戏,来展示当JavaScript运行效率跟Bytecode程序一样时,可以做到的能耐。这个现场展示,震惊所有参加者,包括台下的我。
一个月后,JavaScript之父就和四大浏览器平台,发起了W3C WebAssembly社群小组,想要重新发明JavaScript网页应用,以WebAssembly来命名新技术,顾名思义,就是Web的Assembly(汇编语言)形式,要让网页应用也能拥有二进位Bytecode的运行格式。
Brendan Eich指出,WebAssembly格式标准将成为一个网站代码的新中介层,可以提供一个二进位文件格式标准来运行网页。最大特色是,可以让JavaScript程序的运行速度快20倍,让网页应用也能像桌面原生应用一样的运行速度。因为,WebAssembly标准的作法是,直接定义了一个新的网页运行层,而非如JavaScript子集合的作法,让浏览器能直接运行二进位文件格式的WebAssembly文件,来达到像是运行Bytecode程序般的高性能。而且,当时JavaScript之父更指出一个未来的发展趋势,这项技术不限于JavaScript这种语言,而是任何语言都可以用的技术。
这项技术有多强?像是Adobe大砸200亿美元收购的设计平台Figma,正是靠WebAssembly技术才打造出操作流畅的在线工具,可以在浏览器上使用大量矢量组件,组合成复杂、精美的网页版面。正因为WebAssembly可以让Web应用的运行速度,媲美桌面原生软件般的运行速度,所以,不少人用「网页汇编语言技术」来形容。
经过两年努力,在2017年时,WebAssembly 发表了第一个版本,获得Chrome、Safari、Edge、Firefox等主要浏览器的支持,也正式成了网页标准之一。不过,这项技术,一开始只能在浏览器环境中运行,想要运行Wasm,还得先安装一只浏览器或浏览器引擎。
Wasm走出浏览器,连Docker之父都惊艳
直到2019年,这一年是 Wasm走出浏览器,迈向广大云原生世界的关键一年。Mozilla、云端业者Fastly等联手发表了WASI(WebAssembly System Interface)项目,提供了一个runtime程序和命令行工具,不需要浏览器,可以直接在桌机或服务器端运行Wasm应用。同时,项目成员也发起了Bytecode联盟,要将WebAssembly推广到浏览器以外的世界。这也让同一套Wasm封装的代码,可以在浏览器或非浏览器的环境中运行,不需要维护两套代码。

2019年是 Wasm走出浏览器,迈向广大云原生世界的关键一年。Mozilla、云端业者Fastly等联手发表了WASI(WebAssembly System Interface)项目,通过独立的runtime和命令行工具,不需要浏览器,也可以直接在桌机或服务器端中运行Wasm应用。/Fastly杰出工程师Luke Wagner
「如果WASM和WASI在2008年就出现,我们就不需要发明Docker技术了。」Docker之父Solomon Hykes这一句话点出了WebAssembly技术对云原生生态圈的影响力,可以媲美Docker技术创造了整个云原生技术浪潮的重要性。这句话也成了后来大家谈到WebAssembly发展时,最常被引述的一句话,这是一项连Docker之父都赞叹的新技术。
跨出浏览器之后,横跨到云原生技术圈的WASM生态圈,从2020年开始茁壮,而且相关工具和技术项目数量越来越多,贡献者规模越来越大,更多任务具,更多开发语言开始支持,也开始出现大规模开发Wasm用的技术框架。
WASI项目在2021年提出了新的组件模式(Component Model)草案,可以让不同语言写的代码,编译成Wasm组件,此彼此有一套标准的组件输入输出方式来交互,举例来说,用Go语言写的Wasm组件,和用Rust语言写的Was组件,有共同的标准输入输出方式,就像用同一种语言开发的组件一样,甚至可以把这两个组件,放入一个更大的Wasm组件中混用。这个组件模型,让Wasm具备了跨各种语言的能力,这也是后来WASI项目0.2版的重要特色。Brendan Eich多年前提到的WebAssembly跨开发语言的能力,不只在浏览器中落实,更在浏览器外的广大云原生世界中实现了。
到了2022年,已有超过40种语言支持Wasm,包括Rust, C, C++, JavaScript和GO语言。而且不只服务器环境,还可以在边缘设备,甚至是IoT设备上运行Wasm程序。2022年10月,Docker公司更宣布加入Bytecode联盟,要让Docker引擎开始支持Wasm,直接在容器运行环境中,也能直接运行Wasm的二进比特件档。
Docker这一步,吸引了更多云原生采用企业对这项技术的关注,云原生组织CNCF在年度调查中观察到,超过37%的企业开始试水温尝试WebAssembly,尤其可用于Serverless架构中的两款Runtime,包括WasmEdge和WAMR开始受到关注。CNCF这份调查报告最后的结论是「容器已经成为新标准,而WebAssembly是未来。」这个云原生生态圈最重要的组织,开始认真将WebAssembly视为接下来的重要发展方向。
不只是容器技术指针厂商开始拥抱,虚拟化技术也开始向Wasm靠拢。微软Azure首席技术官Mark Russinovich在2023年Build开发者大会上发表了Hyperlight,可以在Hypervisor上直接运行Wasm应用。Hyperlight可以产生一个微型VM(Micro-VM),比运行一个容器所用的资源更小,启动速度超快,具有Hypervisor层隔离强度的运行环境,来运行Wasm组件。1秒钟可以启动1千个这种运行Wasm的微型VM ,延迟时间甚至只有250微秒,也就是一秒的四千分之一。微软让虚拟机、容器和Wasm可以在同一个Hypervisor环境中并存。
后续报导请见:
WebAssembly如何成为云原生生态圈关键技术
WebAssembly生态圈有哪些重要项目?Wasm生态地图重点剖析
