当前位置: 首页 > article >正文

Wasm是什么

WebAssembly 是什么?

在这里插入图片描述

在这里插入图片描述

1.1 WebAssembly 的定义

WebAssembly(简称 Wasm)是一种二进制指令格式,设计用于在现代 Web 浏览器中高效运行程序。它可以被认为是一种低级的、接近硬件的编程语言,是一种介于字节码和机器码之间的跨平台中间语言(.net,java虚拟机)。

  • 官方目标:让 Web 能运行接近原生性能的代码。
  • 核心功能:提供一种安全跨平台高性能的沙盒执行环境。
1.2 WebAssembly 的特性
  1. 高性能
    • Wasm 是通过紧凑的二进制格式传输和运行,加载速度快,执行效率接近原生性能。
  2. 跨平台
    • 编译成 Wasm 的程序可以在任何支持 WebAssembly 的环境中运行(包括浏览器、服务端、嵌入式设备等)。
  3. 语言无关性
    • 支持多种编程语言(如 C、C++、Rust、Go 等)编译为 Wasm 字节码。
  4. 沙盒环境
    • 提供安全的运行时隔离机制,防止恶意代码侵入系统。
  5. 与 JavaScript 集成
    • WebAssembly 和 JavaScript 互操作性良好,能被 JS 调用,也能调用 JS 函数。
1.3 WebAssembly 的工作原理
  1. 编译阶段
    • 使用支持的语言(如 Rust、C++)编写代码,并通过工具链编译为 WebAssembly 字节码(.wasm 文件)。
  2. 加载阶段
    • 浏览器或运行时通过字节码加载 WebAssembly 模块。
  3. 执行阶段
    • 使用底层的 JIT 或 AOT(Ahead-of-Time Compilation)技术,生成与平台相关的机器码并执行。

WebAssembly 和 Java 的 JIT(即时编译)对比

2.1 什么是 JIT?

Java 的 JIT(Just-In-Time Compilation)是一种将字节码(Java 编译器生成的中间代码)字节码是一种中间表示形式,它不是直接由CPU执行的指令集,而是设计为可以在虚拟机(Virtual Machine, VM)中解释或进一步编译成机器码来执行

  • 核心理念:动态优化,提升运行时性能。
  • 特点
    • 在运行时完成字节码到机器码的转换。
    • 利用实时的代码分析和优化技术,改善程序执行效率。

2.2 WebAssembly 和 Java JIT 的相似之处

  1. 字节码的本质
    • 两者都使用字节码作为中间表示:Java 使用 .class 文件,而 WebAssembly 使用 .wasm 文件。
    • 字节码本身与底层硬件无关。
  2. 即时编译
    • WebAssembly 和 Java JIT 都依赖即时编译,将中间代码翻译为平台相关的机器码。
  3. 跨平台性
    • 两者都通过字节码和运行时实现了跨平台支持,运行时根据目标设备环境生成对应的机器码。

2.3 WebAssembly 和 Java JIT 的区别

特性WebAssemblyJava JIT
初始目标优化浏览器中的高性能应用(如游戏、音视频处理)。提供跨平台的企业级应用开发与运行支持。
运行时依赖需要 WebAssembly 支持的运行时(如浏览器或 Wasm 引擎)。依赖 JVM(Java Virtual Machine)。
优化策略偏向轻量、快速加载和运行,注重启动速度。动态优化运行代码,注重长期运行的高性能(如方法内联等)。
安全性沙盒隔离,确保与宿主环境完全分离。依赖 JVM 的内存管理和安全机制。
语言支持多语言(C/C++、Rust、Go 等)。主要支持 Java 和兼容语言(如 Kotlin、Scala)。
使用场景高性能 Web 应用、边缘计算、嵌入式开发。企业级应用、复杂的分布式系统和服务器端应用。

2.4 性能对比

  1. 启动速度
    • WebAssembly:加载速度快,设计时考虑到 Web 场景,注重低延迟。
    • Java JIT:启动速度稍慢,JIT 需要运行时收集分析信息再进行优化。
  2. 长期运行性能
    • WebAssembly:运行性能接近原生,但不具备长期优化能力。
    • Java JIT:通过持续的动态分析和优化(如热点方法优化、分支预测等),在长期运行下性能可能更优。
  3. 内存消耗
    • WebAssembly:运行时非常轻量级,适合嵌入式和资源受限场景。
    • Java JIT:运行时依赖 JVM,占用的内存相对更大。

3. WebAssembly 和 Java JIT 的实际应用场景

3.1 WebAssembly 的应用场景
  1. 高性能 Web 应用
    • 游戏(如 Unity 的 Web 部署)。
    • 视频/图像处理(如 Figma 部分功能通过 Wasm 实现)。
  2. 跨语言模块
    • 使用 Rust/C++ 编写高性能逻辑,并将其编译为 Wasm,嵌入到 JS 项目中。
  3. 边缘计算和嵌入式开发
    • Wasm 的沙盒和轻量特性适合边缘设备和微服务。
3.2 Java JIT 的应用场景
  1. 企业级应用
    • Java 的稳定性和成熟的生态使其成为银行、保险等企业系统的首选。
  2. 大数据处理
    • Hadoop 和 Spark 等大数据工具广泛依赖 Java。
  3. 分布式系统
    • 如 Spring Cloud 微服务架构,依赖 Java 的开发效率和 JVM 的性能优化。

  • WebAssembly 专注于高性能和跨平台的 Web/嵌入式开发,其轻量特性和沙盒安全性使其在浏览器和边缘计算领域独具优势。
  • Java JIT 则强调动态优化和长期性能,更适合复杂的企业级系统和服务器端开发。

WebAssembly (Wasm) 的成就

1. 成为现代 Web 的性能基石
  • WebAssembly 已被所有主流浏览器(Chrome、Firefox、Safari、Edge)广泛支持,成为 Web 性能提升的重要工具。
  • 高性能图像/视频处理
    • Figma 这样的协作设计工具使用 Wasm 实现高性能的图形渲染。
    • Google Earth 使用 Wasm 提供高质量的三维地图渲染。
2. 在游戏开发中的成功应用
  • Unity 和 Unreal Engine
    • 两大主流游戏引擎支持将游戏部署为 WebAssembly,实现在浏览器中运行接近原生性能的 3D 游戏。
  • 浏览器游戏
    • WebAssembly 推动了高性能浏览器游戏的开发,例如 DOOM 3 的 Web 版移植展示了其潜力。
3. 服务端和边缘计算的普及
  • Fastly
    • Fastly 使用 Wasm 构建其 Compute@Edge 平台,使开发者可以部署高性能的边缘函数。
  • Cloudflare Workers
    • Cloudflare 将 Wasm 引入其 Workers 平台,用于运行轻量的服务器端任务。
  • WasmEdge
    • 一个高性能 Wasm 运行时,专注于边缘计算,已在 IoT 和服务端处理领域取得成功。
4. 开发工具生态的成熟
  • wasm-bindgenwasm-pack
    • Rust 社区为 WebAssembly 提供了完善的工具链,开发者可以轻松将 Rust 代码编译为 Wasm 并与 JavaScript 集成。
  • AssemblyScript
    • Wasm 社区推出了 AssemblyScript,允许开发者用 TypeScript 编写 Wasm 模块,降低了开发门槛。
5. 在多语言支持上的突破
  • WebAssembly 是一种语言无关的技术,现在已经支持多种编程语言,包括 Rust、C/C++、Go、AssemblyScript、Python 等。
  • 多语言生态
    • 为了更好地支持语言互操作,Wasm 社区推出了 WASI(WebAssembly System Interface),使 Wasm 可以脱离浏览器运行。
6. 应用于 AI 和机器学习
  • TensorFlow.js
    • TensorFlow.js 使用 Wasm 提供硬件加速支持,将 AI 推理任务带入浏览器。
  • ONNX Runtime
    • ONNX Runtime 支持使用 Wasm 部署轻量化的机器学习模型。

JavaScript 调用 WebAssembly (Wasm) 通常涉及到几个步骤。

这里有一个简化的流程,展示了如何通过 JavaScript 加载和调用一个 WebAssembly 模块:

步骤 1: 编译 C/C++ 或 Rust 等代码为 WebAssembly

首先,你需要将你想要在浏览器中运行的 C/C++ 或 Rust 等代码编译成 WebAssembly (.wasm) 文件。这通常使用工具链如 Emscripten、wasm-pack(针对 Rust)等来完成。

步骤 2: 准备 WebAssembly 模块

确保你的 WebAssembly 模块被正确地托管在一个可以由你的网页访问的位置。如果你正在开发本地项目,你可能需要设置一个简单的 HTTP 服务器来提供 .wasm 文件,因为浏览器安全策略不允许直接从文件系统加载 WebAssembly 模块。

步骤 3: 使用 JavaScript 加载并实例化 WebAssembly 模块

在 HTML 页面中,你可以使用 WebAssembly.instantiateStreaming 方法或 fetch API 来加载 WebAssembly 模块。以下是一个使用 instantiateStreaming 的例子,它更高效,因为它可以在下载的同时解析模块。

// 假设 wasm 模块位于 'myModule.wasm'
async function loadWasm() {
    try {
        const response = await fetch('myModule.wasm');
        if (!response.ok) throw new Error('Network response was not ok');

        // Instantiate the WebAssembly module.
        const { instance } = await WebAssembly.instantiateStreaming(response, {});

        // Now you can call functions from the WebAssembly instance
        console.log(instance.exports.myExportedFunction());
    } catch (err) {
        console.error('Failed to load wasm module:', err);
    }
}

loadWasm();

步骤 4: 调用 WebAssembly 导出的函数

一旦 WebAssembly 实例创建完成,你就可以像调用普通 JavaScript 函数一样调用导出的 WebAssembly 函数。例如,如果 WebAssembly 模块导出了名为 myExportedFunction 的函数,你可以直接在 JavaScript 中调用 instance.exports.myExportedFunction()

注意事项

  • 内存管理:WebAssembly 和 JavaScript 共享线性内存(Linear Memory)。这意味着你可以通过共享同一段内存来传递数据,但是需要注意手动管理内存,尤其是在处理大型数据集时。

  • 类型转换:WebAssembly 只支持整数和浮点数类型的参数和返回值。如果你有更复杂的结构(如对象或字符串),你需要在两者之间进行适当的序列化和反序列化。

  • 异常处理:WebAssembly 本身并不支持异常传播到 JavaScript。如果你的 WebAssembly 代码抛出异常,那么这个异常会被截获并且会终止模块的执行,除非你在 WebAssembly 代码中显式处理了这些异常。

随着 WebAssembly 技术的发展,更多的高级功能和优化将会被引入,使得 JavaScript 和 WebAssembly 的集成更加无缝和强大。


http://www.kler.cn/a/471378.html

相关文章:

  • oracle闪回恢复数据:(闪回查询,闪回表,闪回库,回收站恢复)
  • 二维数组:求最大元素及其所在的行坐标及列坐标(PTA)C语言
  • 在 ASP.NET CORE 中上传、下载文件
  • Android Telephony | 协议测试针对 test SIM attach network 的问题解决(3GPP TS 36523-1-i60)
  • vue 什么时候使用v-if 什么时候使用v-show
  • NUTTX移植到STM32
  • 微信小程序之历史上的今天
  • 如何监控批量写入的性能瓶颈?
  • 快速上手:采用Let‘sEncrypt免费SSL证书配置网站Https (示例环境:Centos7.9+Nginx+Let‘sEncrypt)
  • 屏幕显示技术再突破!海信RGB- Mini LED,让色彩“活”起来
  • 【计算机操作系统:三、操作系统的用户接口】
  • nginx-灰度发布策略(基于cookie)
  • 02.02、返回倒数第 k 个节点
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验七----城市三维建模与分析(超超超详细!!!)
  • Docker镜像下载链接-开发工具集
  • 交换机划分Vlan配置
  • Objective-C语言的数据结构
  • 添加系统级res资源包
  • Apache Paimon-实时数据湖
  • pyhton 掩码 筛选显示
  • Python中的时间管理模块:whenever
  • nuxt3发请求
  • 秋叶大神中文版Stable Diffusion下载安装使用教程
  • PHP二维数组去除重复值
  • 9. C 语言 循环控制结构详解
  • Flutter 鸿蒙化 flutter和鸿蒙next混和渲染