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 的集成更加无缝和强大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949833.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用深度学习来实现图像超分辨率 综述!

今天给大家介绍一篇图像超分辨率邻域的综述,这篇综述总结了图像超分辨率领域的几方面:problem settings、数据集、performance metrics、SR方法、特定领域应用以结构组件形式,同时,总结超分方法的优点与限制。讨论了存在的问题和挑…

直播预告|StarRocks 3.4,打造 AI 时代的智能数据基座,应用场景全面扩展

随着新年的到来,StarRocks 3.4 即将上线,为 AI Workload 和更多应用场景提供强大支持!此次升级聚焦于提升 AI 场景支持,并扩展更多应用场景,全方位提升数据分析体验。 更强的 AI 场景支持: 引入 Vector In…

【GOOD】A Survey of Deep Graph Learning under Distribution Shifts

深度图学习在分布偏移下的综述:从图的分布外泛化到自适应 Northwestern University, USA Repository Abstract 图上的分布变化——训练和使用图机器学习模型之间的数据分布差异——在现实世界中普遍存在,并且通常不可避免。这些变化可能会严重恶化模…

【微服务】5、服务保护 Sentinel

Sentinel学习内容概述 Sentinel简介与结构 Sentinel是Spring Cloud Alibaba的组件,由阿里巴巴开源,用于服务流量控制和保护。其内部核心库(客户端)包含限流、熔断等功能,微服务引入该库后只需配置规则。规则配置方式有…

神经网络的进展与挫折

神经网络的概念可追溯到上世纪40年代,当时被认为是一种模拟大脑神经元网络的计算系统。 1940年代,麦卡洛克(McCulloch)和沃尔特皮茨(Walter Pitts)率先提出了受人类大脑和生物神经网络启发的人工神经网络。 1951年,马文明斯基(Marvin Minsky)的SNARC系统标志着第一个…

搭建企业AI助理的创新应用与案例分析

在大健康零售行业,企业面临着日益增长的市场需求和复杂的供应链管理挑战。AI助理的应用不仅能够提升客户服务效率,还能优化供应链管理,降低运营成本。 一、AI助理在大健康零售行业的创新应用 个性化健康咨询 AI助理可以通过分析客户的健康…

一文读懂「LoRA」:大型语言模型的低秩适应

LoRA: Low-Rank Adaptation of Large Language Models 前言 LoRA作为大模型的微调框架十分实用,在LoRA出现以前本人都是通过手动修改参数、优化器或者层数来“炼丹”的,具有极大的盲目性,但是LoRA技术能够快速微调参数,如果LoRA…

接口项目操作图-thinkphp6-rabbitmq

一、用户开户流程 用户首次需要联系商务开通账户,需要提供手机号及来访问的IP。开好户之后,平台方将提供用户访问的key值及header头部参数的公钥加密文件、body访问参数以及返回数据的公私钥加解密文件。 二、用户请求流程 用户将拿到的key值进行rsa公钥…

程序环境及预处理

一.程序的翻译环境和执行环境 在ANSI C(标准c)的任何一种实现中,存在两个不同的环境。 计算机是能够执行二进制指令的,但是我们写出的c语言代码是文本信息,计算机不能直接理解 第1种是翻译环境,在这个环境…

回顾 Tableau 2024 亮点功能,助力 2025 数据分析新突破

2024 年,Tableau 用更智能、更高效的工具,重新定义了数据分析的可能性。 回顾 2024 年,Tableau 凭借一系列创新功能,在数据可视化与分析领域再次引领潮流。无论是深度整合 AI 技术,还是优化用户体验的细节,…

【姿态估计实战】使用OpenCV和Mediapipe构建锻炼跟踪器【附完整源码与详细说明】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

快速上手Python,制作趣味猜数字游戏

在编程学习的旅程中,游戏是一个极佳的切入点。今天,我们将一起创建一个简单而有趣的猜数字游戏,借此机会深入学习Python编程的基础知识和一些实用的编程技巧。无论你是初学者还是有一定基础的开发者,相信你都能从中获得乐趣和收获…

AI驱动的可演化架构与前端开发效率

1. 引言 在当今快节奏的数字时代,软件系统需要具备强大的适应能力才能在瞬息万变的市场需求中保持竞争力。软件可演化架构的重要性日益凸显,它能够让软件系统在面对需求变更、技术升级以及市场波动时,能够快速、高效地进行调整和升级&#x…

用豆包MarsCode IDE打造精美数据大屏:从零开始的指南

原标题:用豆包MarsCode IDE,从0到1画出精美数据大屏! 豆包MarsCode IDE 是一个云端 AI IDE 平台,通过内置的 AI 编程助手,开箱即用的开发环境,可以帮助开发者更专注于各类项目的开发。 作为一名前端开发工…

基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS

产品设计初衷 HS-P2-2D是一款针对大车盲区开发的360度全景影像 安全行车辅助系统,通过车身四周安装的超广角像机,经算法合成全景鸟瞰图,通过鸟瞰图,司机非常清楚的看清楚车辆四周情况,大大降低盲区引发的交通事故。 产…

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 #窗口尺寸 import random import p…

c++ 两线交点计算程序(Program for Point of Intersection of Two Lines)

给定对应于线 AB 的点 A 和 B 以及对应于线 PQ 的点 P 和 Q,找到这些线的交点。这些点在 2D 平面中给出,并带有其 X 和 Y 坐标。示例: 输入:A (1, 1), B (4, 4) C (1, 8), D (2, 4) 输出:给定直线 AB 和…

Taro+react 开发第一节创建 带有redux状态管理的项目

Taro 项目基于 node,请确保已具备较新的 node 环境(>16.20.0),推荐使用 node 版本管理工具 nvm 来管理 node,这样不仅可以很方便地切换 node 版本,而且全局安装时候也不用加 sudo 了。 1.安装 npm inf…

2024AAAI SCTNet论文阅读笔记

文章目录 SCTNet: Single-Branch CNN with Transformer Semantic Information for Real-Time Segmentation摘要背景创新点方法Conv-Former Block卷积注意力机制前馈网络FFN 语义信息对齐模块主干特征对齐共享解码头对齐 总体架构backbone解码器头 对齐损失 实验SOTA效果对比Cit…

代码随想录 数组test5(leetcode 59.螺旋矩阵)

59. 螺旋矩阵 II - 力扣(LeetCode) 大致的想法是从起点开始以顺时针走到中心,有两种实现方式:一圈一圈赋值或者每走一步就赋值 方法一:按圈循环 思路: 外层循环是要循环的圈数,这里需要分奇偶讨论,若题目给出的n为偶…