本文探讨WebAssembly(Wasm)在服务端作为隔离单元的应用,对比V8 Isolate,分析其沙箱机制、WASI 0.2接口、能力安全模型及组件模型。文章指出Wasm适合多语言插件与边缘计算,但长生命周期、线程支持及完整POSIX需求仍依赖容器,并建议选型时优先pin WASI 0.2,为0.3演进预留空间。
WebAssembly(Wasm)是一种与JavaScript协作的二进制指令格式,旨在加速网页应用的数据处理。它支持多种编程语言,提升性能,广泛应用于游戏和科学计算等领域。自2019年成为W3C标准以来,Wasm已在约43,000个网站上使用。通过WASI,Wasm还可以在浏览器外运行,拓展了应用场景。
Alex Radovici讨论了WebAssembly组件及其在软件扩展中的应用,强调了使用不同编程语言构建插件的需求。WebAssembly作为一种安全高效的字节码,支持在浏览器外部运行第三方代码。通过WASI接口,开发者可以创建安全的Rust扩展,并实现多语言模块链接。他还分享了构建扩展的工具和经验教训。
WebAssembly在Wasm 3.0和组件模型发布后取得显著进展,预计2026年2月发布WASI 0.3.0。这一标准化将使WebAssembly逐步取代不适合某些应用的容器,特别是在边缘设备和无服务器环境中。WebAssembly已在多个环境中稳定运行,未来将支持更高层次的抽象和API,以促进开发者的使用。
PEP 816 旨在为 CPython 提供对 WASI 的支持,明确支持的 WASI 和 WASI SDK 版本。此支持自 Python 3.11 开始,以确保社区对 CPython 的期望一致。WASI 版本向后兼容,但 WASI SDK 不具备兼容性,因此需要明确支持的版本,以避免潜在的错误和不兼容问题。
Fungi是一个开源工具,支持设备连接和安全数据传输,具备文件传输和端口转发功能。它使用libp2p实现端到端加密,支持桌面、安卓和树莓派等多平台。0.4.0版本更新了gRPC协议,增强了命令行工具,并引入了wasi运行时。Fungi仍在开发中,欢迎反馈和贡献。
Wasm 3.0是一个重要版本,但组件模型尚未完成,WebAssembly的“Docker时刻”仍未实现。WASI的标准化将推动WebAssembly在服务器和浏览器之外的应用,尽管进展缓慢,但行业已广泛采用。
QT 的 WebAssembly 不支持 TCPServer,因安全沙箱模型限制。Wasm 只能通过宿主环境间接访问系统资源,浏览器禁止入站连接。要实现 TCPServer,需使用支持 WASI 的运行时或非浏览器环境。
通过WebAssembly和WASI,浏览器可以安全地运行真实的Bash脚本,无需服务器。这种方法适用于教育工具和DevOps仪表板,提供强大的无依赖Shell脚本功能。
作者分享了使用WebAssembly(WASM)开发水排序游戏的经验。最初,他用SDL2创建了桌面游戏,后希望在手机上运行,因此重写为JavaScript并探索WASM。文章介绍了WASM的基本概念、模块结构、编译过程及其与WASI的结合,强调了开发中的挑战和调试困难。最终,游戏成功在浏览器中运行,并提供了相关代码示例。
微软的Azure Hyperlight现已支持Hyperlight Wasm,允许在虚拟机上快速部署WebAssembly模块。该项目捐赠给CNCF,利用小型嵌入函数和虚拟机保护,支持多种编程语言,简化工作负载分发,提升安全性和性能,开发者可灵活选择运行时。
Rust 1.82版本引入了wasm32-wasip2目标,支持WASI 0.2的二级平台,允许开发者使用WASI 0.2接口编写网络代码。标准库对WASI 0.2的支持仍在扩展中,预计将逐步完善。
2023年10月,.NET 9 RTM不再支持wasi-experimental,WASI实验将延续至.NET 10。Bytecode Alliance推出componentize-dotnet工具,简化.NET/C#开发者创建WebAssembly组件的流程,支持Mono编译器和NativeAOT-LLVM,鼓励开发者参与社区。
2023年10月,.NET 9 RTM不支持wasi-experimental,WASI实验将继续在.NET 10中进行。Bytecode Alliance发布了componentize-dotnet项目,以简化.NET/C#开发者创建WebAssembly组件的过程。文章介绍了如何使用.NET 9 Preview 7和componentize-dotnet构建组件,并探讨组件间的互操作性,鼓励开发者参与该项目。
Wasmer 5.0 正式发布,支持 WASI 和 Emscripten 的 WebAssembly 运行时。新版本增加了对 V8、Wasmi 和 WAMR 的实验性支持,首次在 iOS 上引入 WebAssembly,提升了性能,精简了代码库,删除了约 20,000 行代码,并升级了编译器,增强了兼容性和运行速度。
监控应用性能至关重要,WASI(WebAssembly系统接口)使开发者能够创建跨平台的系统监控工具,无需编写平台特定代码。WASI程序轻量高效,适合资源有限的环境。通过Rust编写的代码可以收集系统指标并自动发送至中央服务器,从而提高监控的可靠性和效率。WASI简化了系统指标的收集,适用于云、边缘设备及容器化环境。
Wasmer 4.4 是最新的 WebAssembly 运行时版本,支持 WASIX、WASI 和 EmScripten。作为轻量级容器,它能从边缘扩展到云,广泛运行软件。新版本增加了对象大小估计、改进的代理处理和可执行文件生成,并进行了多项修复。虽然更新不大,但在现有基础上有所提升。
作者使用 wasmtime 执行编译为 WASM/WASI 字节码的 CPython 虚拟机,并通过 Rust 实现的 Host Function 扩展功能。WASM/WASI 提供跨平台兼容性和安全性,广泛用于浏览器和服务端。尽管面临技术挑战,如缺乏 dlopen 支持和 wasmtime Python 绑定的复杂性,该项目展示了 Python 与 WASI 结合的潜力。
在国庆假期,我进行了一项个人项目,使用wasmtime执行编译为WASM/WASI字节码的CPython虚拟机,并通过Python扩展主机功能。项目成功验证了Python与WASI结合的可能性,尽管面临一些技术挑战。
WebAssembly承诺提供跨平台的模块化编程能力,现在通过WASI和TinyGo,可以在WebAssembly环境中使用Go语言。TinyGo支持Go的编译,并且二进制大小更小。WebAssembly的标准化将扩展其在设备上的使用。移植Go代码到WebAssembly模块可能改善对其他语言的支持,如Python。
完成下面两步后,将自动完成登录并继续当前操作。