WASM
知识积累
WebAssembly(WASM)是一种为Web设计的高性能二进制指令格式,允许C++、Rust等语言编写的代码以接近原生速度在浏览器中运行。它并非替代JavaScript,而是与其协作,专门处理计算密集型任务,如游戏、图形设计和音视频编辑,同时具备安全、可移植和快速启动的优势。读者可了解如何利用WASM提升Web应用性能并复用现有代码库,扩展开发可能性。
目录
WASM
WASM,全称为 WebAssembly,它是一种为Web设计的高性能、低级别的二进制指令格式。
您可以把它理解为一个在现代Web浏览器中运行的、接近机器码的“虚拟机”。它的主要目标是让用C、C++、Rust等非JavaScript语言编写的代码,能够以接近原生的速度在Web上运行。
核心概念解析
1. 它是什么?(本质)
- 一种编译目标: 开发者不用直接编写WASM代码,而是先用C/C++/Rust等系统级语言编写代码,然后将其编译成
.wasm格式的二进制文件。 - 一种低级虚拟指令集: 它的指令非常紧凑,更接近机器码,因此文件小,加载和解析速度快。
- 不是一种编程语言: 你不能像写JavaScript或Python那样去“写”WASM,它主要是其他语言的编译输出结果。
2. 设计目标
- 高效: 二进制格式使其具有小巧的体积和接近原生代码的执行速度。
- 安全: 在一个内存安全的沙箱环境中运行,无法直接访问操作系统或宿主机的内存,遵循浏览器的同源策略。
- 开放: 是一种开放的Web标准,由W3C组织维护,所有主流浏览器厂商都参与其中。
- 可移植: 设计为与硬件和平台无关,可以在任何支持WASM的环境中运行(不仅是浏览器,现在也扩展到了服务端)。
为什么需要WASM?
在WASM出现之前,Web应用的重度计算任务几乎完全由JavaScript承担。但JavaScript在某些领域存在瓶颈:
-
性能密集型应用:
- 游戏: 需要处理复杂的图形、物理计算和AI。
- CAD/3D建模: 例如AutoCAD和Figma现在都在使用WASM。
- 音视频编辑: 如在线版的Adobe Photoshop。
- 科学模拟与可视化: 在浏览器中运行复杂的数学模型。
-
代码复用:
- 许多核心库和引擎(如游戏引擎Unity、Unreal)是用C++等语言写的。WASM允许开发者将这些现有的、成熟的代码库直接移植到Web上,而无需用JavaScript重写。
主要特点
- 与JavaScript协作,而非替代: WASM并不是要取代JavaScript。它们被设计为协同工作。JavaScript负责DOM操作、调用Web API等,而WASM则处理那些对性能要求极高的计算任务。你可以从JavaScript中调用WASM模块的函数,反之亦然。
- 启动速度快: 相比于需要先解析再编译的JavaScript,WASM的二进制格式可以被浏览器快速编译和优化。
- 广泛的语言支持: 除了C/C++/Rust,现在也有很多其他语言(如Go, AssemblyScript等)可以编译成WASM。
一个简单的比喻
想象一下Web浏览器是一个餐厅厨房:
- JavaScript 就像是那位多才多艺、沟通顺畅的主厨。他负责接收顾客订单(用户交互),指挥其他厨师(调用API),并最终把菜装盘上桌(操作DOM)。他非常灵活,但处理大量重复性切菜工作时可能不是最快的。
- WASM 则像是一台高性能的自动切菜机。它被主厨请来专门负责最耗时、最需要力气的切菜任务(高性能计算)。它只做这一件事,但做得极快极好。主厨(JavaScript)把蔬菜(数据)交给切菜机(WASM),切菜机处理完后,再把切好的菜(结果)交还给主厨进行下一步操作。
应用场景举例
- Figma: 著名的在线UI设计工具,其核心图形渲染引擎就是用C++编写并编译为WASM运行的,保证了流畅的编辑体验。
- Google Earth: 在浏览器中实现了复杂3D地球的流畅渲染。
- Unity/Unreal Engine游戏: 可以将用这些引擎开发的游戏直接发布到Web平台。
- 服务器端计算: 随着WASI等系统接口标准的出现,WASM也开始在云原生、边缘计算等非浏览器环境中大放异彩,因为它具有轻量、安全和跨平台的特性。
总结
WASM(WebAssembly)是一项突破性的Web技术,它通过为C++、Rust等语言提供一个高性能的Web编译目标,极大地扩展了Web应用的能力边界,使得在浏览器中运行以前只能在桌面端才能实现的复杂、高性能应用成为可能。它是Web平台功能的一个强大补充,与JavaScript相辅相成。