前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CloudBluePrint-Chapter 1.8 : 云上应用技术架构-WebAssembly (WASM)

CloudBluePrint-Chapter 1.8 : 云上应用技术架构-WebAssembly (WASM)

原创
作者头像
行者深蓝
修改2023-09-07 15:24:30
4630
修改2023-09-07 15:24:30
举报
文章被收录于专栏:云原生应用工坊

计算模式的演变

从物理机,到虚拟机,再到容器引擎,最后到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

总结对比如下:

语言/框架

工具/库

支持程度

局限性

Java

TeaVM, JWebAssembly

可以将Java字节码转换为WebAssembly

成熟度和稳定性相对较低,Java的主流运行时环境并未直接支持WebAssembly

PHP

WASM-PHP

可以在PHP中加载和执行WebAssembly模块

这个项目还处于早期阶段,可能存在稳定性和兼容性问题

Python

Pyodide

可以将Python运行时环境和一些科学计算库编译为WebAssembly,使得Python能够在浏览器中运行

由于Python的动态特性和垃圾回收机制,生成的WebAssembly模块可能会比较大,执行效率也可能不如静态语言

Node.js

WASI, wasm-pack-plugin

可以在Node.js中加载和执行WebAssembly模块

由于JavaScript已经是Node.js的主要语言,所以在Node.js中使用WebAssembly的场景可能会较少

Vue3

N/A

Vue3本身并不直接支持WebAssembly,但你可以在Vue3项目中使用WebAssembly模块

由于WebAssembly模块通常需要异步加载,这可能会增加Vue3项目的复杂度

React

wasm-bindgen, react-wasm

可以在React项目中使用WebAssembly模块

同样的,由于WebAssembly模块需要异步加载,这可能会增加React项目的复杂度

Go

N/A

Go自带对WASM的支持,可以直接编译为WASM

在某些情况下,Go编译出的WASM文件可能会比较大

Rust

wasm-pack, wasm-bindgen

Rust对WebAssembly有很好的支持,可以直接编译为WASM,并且有成熟的工具链和库

Rust的学习曲线可能会比较陡峭

C/C++

Emscripten

可以将C/C++代码编译为WebAssembly,并且有成熟的工具链和库

C/C++的内存管理需要手动进行,这可能会增加开发的复杂度

Ruby

Ruby on WebAssembly

Ruby可以被编译为WebAssembly

这个项目还处于早期阶段,可能存在稳定性和兼容性问题

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

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

技术

优点

劣点

局限性

WebAssembly(WASM)

高性能:接近原生的执行速度。 2. 安全:在沙箱环境中运行代码。 3. 可移植性:可以在任何支持WASM的环境中运行。 4. 多语言支持:支持C、C++、Rust等多种语言。

功能限制:不能直接访问系统资源。 2. 内存限制:目前最大只支持4GB内存。

目前主要用于浏览器环境,对于服务端应用还在探索阶段。

容器(如Docker)

轻量级:比虚拟机更少的资源消耗。 2. 快速启动:几秒钟内可以启动和停止。 3. 高效率:和主机共享操作系统,减少了额外的开销。

隔离性较差:容器之间共享同一操作系统。 2. 安全性问题:如果容器配置不当,可能会被攻击者利用。

主要用于打包和部署应用程序,不适合运行需要完整操作系统的应用。

虚拟机(如VMware)

强隔离:每个虚拟机都有自己的操作系统和资源。 2. 安全:如果一个虚拟机被攻击,不会影响其他虚拟机。

资源消耗大:需要为每个虚拟机分配CPU、内存等资源。 2. 启动慢:需要启动完整的操作系统。

主要用于运行需要完整操作系统的应用,或者需要强隔离的场景。

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

专注于WebAssembly,提供了许多与WebAssembly相关的特性和优化,轻量级,安全性高。

与JavaScript的互操作性较弱,社区和生态系统相对较小。

Wasmtime

专注于WebAssembly,支持WASI和其他WebAssembly扩展,提供了一个C API,可以方便地与其他语言进行交互。

与JavaScript的互操作性较弱,社区和生态系统相对较小。

Node.js

强大的JavaScript支持,提供了丰富的JavaScript运行环境和APIs,广泛的社区和生态系统。

主要专注于JavaScript,对WebAssembly的支持不如Wasmer和Wasmtime完全,资源占用较高。

Web浏览器(如Chrome, Firefox等)

对WebAssembly有原生支持,可以直接在浏览器中运行WebAssembly代码,与JavaScript的互操作性强。

运行环境受到浏览器的限制,可能不适合需要直接访问系统资源或需要高性能计算的应用。

这些优缺点可能会随着各个项目的发展而变化。例如,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:
  2. PHP:
  3. Python:
  4. Node.js:
  5. Vue3:
  6. React:
  7. Go:
  8. Rust:
  9. C/C++:
  10. Ruby:
  11. Ruby on WebAssembly: https://github.com/Shopify/truffleruby-wasm

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 计算模式的演变
  • WebAssembly 概述
    • 前生今世
      • 从前端到服务端
      • WASM与编程开发
        • 开发工具、库和框架
          • 虚拟机、容器和WASM技术对比
            • WebAssembly 运行环境
              • WebAssembly 的当下与未来
              • 相关文档
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档