写点什么

云上应用技术架构 -WebAssembly (WASM)

作者:深蓝
  • 2023-11-20
    北京
  • 本文字数:5046 字

    阅读完需:约 17 分钟

链接 https://github.com/svc-design/ebooks/


计算模式的演变

从物理机,到虚拟机,再到容器引擎,最后到 WebAssembly,计算领域的技术趋势主要包括以下几个方面:

  • 资源隔离和共享:在物理机时代,每个应用程序都运行在各自的物理硬件上,资源隔离性强但共享性差。虚拟机技术的出现使得多个虚拟机可以在一台物理机上共享硬件资源,提高了资源的利用率。容器技术进一步提高了资源的隔离和共享能力,每个容器内的应用程序可以在隔离的环境中运行,同时又可以共享主机的资源。

  • 轻量化和便携性:虚拟机相比物理机更轻量级,容器技术比虚拟机更轻量级。WebAssembly 则进一步提高了应用程序的轻量化和便携性,应用程序可以以二进制代码的形式运行在任何支持 WebAssembly 的浏览器中。

  • 跨平台和通用性:虚拟机技术使得应用程序可以在不同的物理硬件上运行。容器技术和 WebAssembly 进一步提高了应用程序的跨平台能力和通用性,开发者只需要编写一次代码,就可以在任何支持容器或 WebAssembly 的平台上运行。

  • 安全性:从物理机到虚拟机,再到容器和 WebAssembly,每个阶段都在提高应用程序的安全性。虚拟机提供了硬件级别的隔离,容器提供了操作系统级别的隔离,WebAssembly 则在浏览器的沙箱环境中运行应用程序,提供了更高级别的安全保障。

  • 计算与存储分离:从物理机到虚拟机,再到容器,计算与存储的分离趋势日益明显。这种分离使得资源可以按需分配和扩展,提高了系统的灵活性和可扩展性。

WebAssembly 概述

WebAssembly(通常缩写为 WASM)是一种用于现代网络浏览器的二进制指令格式。它是一种低级别的语言,具有高级别的可移植性,效率和安全性。WASM 旨在为在浏览器中运行的高性能应用程序提供一个有效的编译目标。

WASM 的主要特点如下:

  • 速度:WebAssembly 旨在以接近原生代码的速度执行。

  • 安全:WebAssembly 设计为在现代浏览器的沙箱环境中安全运行。

  • 开放和调试:WebAssembly 是开放的 web 标准,并且被设计为易于调试。

  • 硬件适应:WebAssembly 是为了适应所有现代计算机架构而设计的,不论是桌面、移动设备还是嵌入式系统。

  • 语言支持:WebAssembly 设计为支持多种编程语言,如 C、C++、Rust 等,让开发者可以使用他们熟悉的语言来编写代码。

  • 可移植性:WASM 代码可以在任何支持 WASM 的环境中运行,无论是前端还是服务端。这使得它在前端和服务端都有很广泛的应用。

前生今世

在 WebAssembly 出现之前,Web 开发的主导语言是 JavaScript。然而,随着 Web 应用程序变得越来越复杂,JavaScript 的性能问题和某些设计限制开始显现, 其性能问题和设计限制使得它难以满足复杂、大规模应用程序的需求。

2015 年,Mozilla、Google、Microsoft 和 Apple 等公司联合提出了 WebAssembly 项目,意图解决 JavaScript 的问题。它被设计为一种低级的字节码格式,可以直接在浏览器中执行,无需解释或 JIT 编译,从而显著提高了性能。

自 2015 年首次公开发布以来,WebAssembly 已经得到了广泛的支持和应用。许多大型的 Web 应用程序,如 Google Earth 和 AutoCAD,都已经开始使用 WebAssembly 来提高性能和用户体验。现在,WebAssembly 已经成为 Web 开发的重要组成部分,开始被用于区块链、游戏、音频和视频处理等领域。

从前端到服务端

WebAssembly(WASM)最初被设计为一种在 Web 前端运行的字节码格式,用于提高 JavaScript 的性能和效率。然而,随着其发展,WASM 的应用已经扩展到了服务端,带来了一些重要的变化。

  1. 性能优化:在前端,WASM 可以提供接近原生的性能,使得开发者可以在浏览器中运行复杂的应用程序,如 3D 游戏、音视频处理等。在服务端,WASM 也可以提供高效的运行环境,比如使用 WASM 运行服务器端的计算密集型任务。

  2. 语言支持:在前端,WASM 使得开发者可以使用 C、C++、Rust 等语言来开发 Web 应用程序,而不仅仅是 JavaScript。在服务端,这个优点更加明显,开发者可以使用他们熟悉的语言来编写服务端代码,并通过 WASM 运行。

  3. 安全性:无论是在前端还是服务端,WASM 都提供了一个安全的运行环境。WASM 代码在一个沙箱环境中运行,可以防止恶意代码对系统造成破坏。

  4. 可移植性:在前端,WASM 代码可以在任何支持 WASM 的浏览器中运行。在服务端,WASM 也可以在任何支持 WASM 的环境中运行,无论是 Linux、Windows 还是 MacOS。

  5. 新的应用场景:随着 WASM 向服务端扩展,出现了一些新的应用场景。例如,云计算提供商开始支持 WASM,使得用户可以在云端运行 WASM 代码。另外,一些新兴的领域,如区块链和边缘计算,也开始使用 WASM。

从前端到服务端,WASM 的发展带来了性能优化、更广泛的语言支持、更好的安全性、更高的可移植性以及新的应用场景。

WASM 与编程开发

以下是一些主流编程语言对 WASM 的原生支持

  1. C 和 C++:这是最早以及最完善的支持 WASM 的语言。Emscripten 是一个将 C/C++ 编译成 WASM 的工具链。

  2. Rust:Rust 官方支持 WASM,有一套完整的工具链(包括 wasm-bindgen 和 wasm-pack)可以将 Rust 代码编译成 WASM。

  3. AssemblyScript:这是一种基于 TypeScript 的语言,专门设计用于编译到 WASM。

  4. Go:Go 1.11 版本开始支持编译到 WASM,但目前还不够成熟。

  5. 其他语言:还有许多其他语言也在努力支持 WASM,包括 Kotlin、Python、Java 等。

开发工具、库和框架

以下是一些主流编程语言对应的 WASM 开发工具、库和框架:

  1. Java: TeaVM, JWebAssembly

  2. PHP: WASM-PHP

  3. Python: Pyodide

  4. Node.js: WASI, wasm-pack-plugin

  5. Vue3: Vue3 不直接支持 WASM,但你可以在 Vue3 项目中使用 WASM 模块。

  6. React: wasm-bindgen, react-wasm

  7. Go: Go 自带对 WASM 的支持,直接使用 GOOS=js GOARCH=wasm go build -o main.wasm 命令即可编译为 WASM。

  8. Rust: wasm-pack, wasm-bindgen

  9. C/C++: Emscripten

  10. Ruby: Ruby on WebAssembly

总结对比如下:

虚拟机、容器和 WASM 技术对比

WebAssembly(WASM)、容器和虚拟机都是用于隔离应用程序和提高其可移植性的技术,但它们在设计、性能、安全性等方面有所不同。以下是一个比较表格:

WebAssembly 运行环境

WebAssembly (Wasm) 被设计为在各种环境中高效运行,包括浏览器和服务器。以下是一些最小、最高效的 WebAssembly 运行环境:

  1. Web 浏览器:大多数现代 Web 浏览器都内置了 WebAssembly 支持,包括 Chrome, Firefox, Safari 和 Edge。这些浏览器的 JavaScript 引擎都有一个 WebAssembly 解释器和/或编译器,可以直接在浏览器中执行.wasm 文件。这是最常见的运行 WebAssembly 的环境。

  2. Wasmer:Wasmer 是一个独立的 WebAssembly 运行时,它允许在没有浏览器的环境中运行 WebAssembly 程序。Wasmer 可以在各种操作系统上运行,包括 Linux、macOS 和 Windows。它的目标是提供一个轻量级、安全、可移植的运行时。

  3. Wasmtime:Wasmtime 是 Bytecode Alliance 开发的一个独立的 WebAssembly 运行时。它旨在提供一个轻量级、高效、安全的方式来运行 WebAssembly 程序。

  4. Lucet:Lucet 是 Fastly 开发的一个 WebAssembly 编译器和运行时。它旨在在服务器环境中提供极高的启动速度和低延迟。

  5. WAVM:WAVM 是一个独立的 WebAssembly 虚拟机,它包含一个编译器,可以将 WebAssembly 编译为本地代码并执行。

这些运行环境都有各自的优点和特点,适用于不同的应用场景。选择哪个取决于你的具体需求,例如你是否需要在浏览器中运行你的程序,或者你是否需要特定的性能特性。

当然,以下是一个表格,总结了各种 WebAssembly 运行时的优缺点:

这些优缺点可能会随着各个项目的发展而变化。例如,Wasmer 和 Wasmtime 的社区和生态系统可能会随着时间的推移而发展壮大。同样,Node.js 也可能会增加更多的 WebAssembly 支持和优化。

同时 WebAssembly(WASM)和容器化技术(如 Docker 和 Kubernetes)可以结合使用,提供一个高效、可移植的应用开发和部署环境。例如,你可以使用 Docker 来构建一个包含所有必要的 WASM 编译工具和依赖的环境,然后在这个环境中编译和运行你的 WASM 应用。此外,你还可以使用 Kubernetes 来部署和管理你的 WASM 应用,确保它在集群中的高可用性和可扩展性。

WebAssembly 的当下与未来

当前的主要应用场景:

  • Web 应用性能优化:WASM 可以作为 JavaScript 的补充,提升 web 应用的性能。例如,一些计算密集型或者需要高性能的 web 应用,如游戏、音视频处理、3D 渲染等,可以利用 WASM 来提升性能。

  • 跨平台应用开发:WASM 的可移植性使得它可以在各种不同的平台和设备上运行。例如,开发者可以使用 WASM 来开发跨平台的桌面应用、移动应用、甚至是物联网设备应用。

  • 服务器端应用:虽然 WASM 最初是为 web 浏览器设计的,但是其高效和安全的特性也使得它可以用于服务器端。例如,云函数(Function as a Service, FaaS)可以利用 WASM 来提升性能和安全性。

可能替代的技术栈:

  • JavaScript:虽然 WASM 不太可能完全替代 JavaScript,但是它可以作为 JavaScript 的补充,处理那些需要高性能的任务。

  • Native App:WASM 的跨平台特性和高性能使得它有可能替代一些 native app 的开发。例如,开发者可以使用 WASM 来开发高性能的跨平台应用,而不需要针对每个平台分别开发。

  • Docker 和虚拟机:在服务器端,WASM 可以提供一种轻量级、高效和安全的运行环境,这使得它有可能替代 Docker 和虚拟机。

  • 某些系统级编程语言:由于 WASM 的高效和安全,它也有可能替代某些系统级编程语言,如 C 和 C++,成为系统编程的一个选择。

尽管 WebAssembly (WASM) 为网络和存储带来了许多优势,如高效性、跨平台兼容性和安全性,但它也存在一些不足之处:

  • 文件大小:WASM 文件通常比相应的 JavaScript 文件大,这可能会影响网络传输的速度和效率,尤其是在网络环境较差的情况下。

  • 冷启动时间:虽然 WASM 的执行速度非常快,但是它的加载和编译过程可能会比 JavaScript 慢。这是因为 WASM 需要先下载整个 WASM 文件,然后再进行编译,这可能会导致冷启动延迟。

  • 缺乏直接访问 DOM 和 Web API 的能力:WASM 不能直接访问 DOM 或 Web API,它需要通过 JavaScript 作为中介。这不仅增加了复杂性,而且可能会降低性能。

  • 缺乏成熟的工具链和社区支持:虽然 WASM 的生态系统正在快速发展,但与 JavaScript 和其他成熟的技术相比,它的工具链和社区支持仍然较少。

  • 学习曲线:对于许多 web 开发者来说,学习 WASM 可能需要一些时间和努力,尤其是对于那些只熟悉 JavaScript 的开发者。

  • 兼容性问题:虽然大多数现代浏览器都支持 WASM,但一些旧的浏览器或特定环境可能不支持。

WebAssembly (WASM) 和 eBPF (Extended Berkeley Packet Filter) 是两种强大的技术,它们的结合可能会推动一些未来的技术趋势。以下是一些可能的趋势:

  1. 更高效的网络策略和监控:eBPF 是一种在内核空间运行的虚拟机,它可以用于网络策略和监控。与此同时,WASM 可以提供高效的、接近原生的性能。这两者结合,可以实现更高效、更灵活的网络策略和监控。

  2. 跨平台和跨语言的内核编程:WASM 是一种可以在任何支持 WASM 的环境中运行的二进制指令格式,而 eBPF 则允许在内核空间运行程序。这种结合可以使得开发者使用他们熟悉的语言(如 C、C++、Rust 等)进行内核编程,并且这些程序可以在不同的平台上运行。

  3. 更安全的系统编程:WASM 和 eBPF 都提供了一种安全的运行环境,它们可以防止恶意代码对系统造成损害。这种结合可以提供一种更安全的系统编程模式。

  4. 云原生和边缘计算的发展:随着云计算和边缘计算的发展,需要一种高效、安全、可移植的编程模型。WASM 和 eBPF 的结合可能会成为这种模型的一个重要选择。

  5. 更强大的微服务架构:微服务需要高效、安全、可移植的编程模型,而 WASM 和 eBPF 的结合正好满足这些需求。因此,它们可能会推动微服务架构的发展。

这些只是可能的趋势,具体的发展还需要取决于技术社区和市场的接受度。

相关文档

以下是一些主流编程语言对应的 WebAssembly (WASM) 开发工具、库和框架的文档链

  1. Java:TeaVM: http://teavm.org/JWebAssembly: https://github.com/i-net-software/JWebAssembly

  2. PHP:WASM-PHP: https://github.com/wasmerio/wasmer-php

  3. Python:Pyodide: https://pyodide.org/en/stable/

  4. Node.js:WASI: https://nodejs.org/api/wasi.htmlwasm-pack-plugin: https://github.com/wasm-tool/wasm-pack-plugin

  5. Vue3:https://vuejsdevelopers.com/2019/03/26/webassembly-rust-webpack/

  6. React:wasm-bindgen: https://rustwasm.github.io/docs/wasm-bindgen/react-wasm: https://github.com/reactjs/react-wasm

  7. Go:Go's own WASM support: https://golang.org/pkg/syscall/js/

  8. Rust:wasm-pack: https://rustwasm.github.io/wasm-pack/wasm-bindgen: https://rustwasm.github.io/docs/wasm-bindgen/

  9. C/C++:Emscripten: https://emscripten.org/

  10. Ruby:

  11. Ruby on WebAssembly: https://github.com/Shopify/truffleruby-wasm

发布于: 刚刚阅读数: 4
用户头像

深蓝

关注

还未添加个人签名 2018-08-28 加入

还未添加个人简介

评论

发布
暂无评论
云上应用技术架构-WebAssembly (WASM)_深蓝_InfoQ写作社区