Rust编程实战:初探WebAssembly

WebAssembly: 网页应用的性能革命

​互联网技术日新月异,Web应用已经从简单的网页跃升为功能丰富的平台。然而,JavaScript作为Web的主力语言,在处理计算密集型任务时仍然存在性能瓶颈。今天,我们来聊一聊可能改变Web格局的技术—— WebAssembly

从asm.js到WebAssembly:速度的进化

还记得几年前的asm.js吗?它通过一系列优化手段让JavaScript运行更快:

  • 跳过语法分析,直接转成汇编语言
  • 调用WebGL通过GPU执行计算
  • 去掉大部分自动GC机制,采用强类型设计

这些"奇技淫巧"确实提升了性能,但依然受限于JavaScript本身。而WebAssembly则是一次质的飞跃!

WebAssembly是什么?

WebAssembly(简称Wasm)是一种新型的二进制格式,它有几个关键特点:

  • 它是一门面向底层的"汇编语言",但不需要开发者直接编写
  • 它是预编译的二进制格式,类似Java的ByteCode
  • 它是专为Web设计的,所有主流浏览器都能执行它
  • 它可以用C/C++/Rust等多种语言开发后编译生成

为什么WebAssembly碾压asm.js?

简单来说,WebAssembly在各方面都优于asm.js:

  1. 体积更小:二进制格式比文本JavaScript更紧凑
  2. 解析更快:比JavaScript快一个数量级
  3. 更好利用CPU特性:不再受限于JavaScript实现
  4. 编译工具链更优:使用Binaryen替代Emscripten,性能提升5%-7%

WebAssembly的应用场景

如果你的Web应用中有这些场景,考虑使用WebAssembly吧:

  • 视频处理与编解码
  • 3D渲染与游戏
  • 图像处理
  • 数据分析与可视化
  • 加密算法

WebAssembly的三大价值

  1. PC端应用无缝移植:C++/C/Rust等语言编写的应用可直接编译到Web,无需重写
  2. 高性能计算场景:音视频处理、游戏等领域性能提升显著
  3. 微服务/Serverless:支持多语言的云函数平台

引用一个wasm文件

先去下载wasm测试文件: wasm

async function run() {const response = await fetch("./test.wasm")const buffer  = await response.arrayBuffer()const wasm = await WebAssembly.instantiate(buffer)const addTwoFunction = wasm.instance.exports.addTwoconst result = addTwoFunction(10, 20)console.log(result)
}

会加载wasm文件,并且执行addTwo函数。

亲手尝试WebAssembly

想尝试WebAssembly的威力吗?以下是使用Rust开发WebAssembly的简易教程:

准备工作

  1. 安装Rust和Node环境
  2. 创建项目结构:
# 创建项目主目录
cargo new --lib wasm-project# 创建前端目录
cd wasm-project
mkdir www
cd www
npm init -y
npm i -S webpack-cli copy-webpack-plugin
npm i -D webpack-dev-server

编写cargo.toml 文件

[dependencies]
wasm-bindgen = "0.2.78"[lib]
crate-type = ["cdylib"][package.metadata.wasm-pack.profile.release]
wasm-opt = false
  1. wasm-bindgen: 是一个 Rust 库,用于让 Rust 代码与 JavaScript 互操作。
  2. crate-type : 配置告诉 Rust 编译器,生成的库是 动态库(cdylib),用于 WebAssembly 目标;cdylib(C dynamic library)用于生成可以与 C 兼容的动态库

编写Rust代码

lib.rs中:

use wasm_bindgen::prelude::*;#[wasm_bindgen]
extern "C" {pub fn alert(name: &str);
}#[wasm_bindgen]
pub fn hello(name: &str) {alert(name);
}

这个简单的函数可以调用浏览器的alert功能。

  1. #[wasm_bindgen]:告诉 wasm-bindgen 这个 hello 函数应该暴露给 JavaScript 使用。
  2. extern “C”:声明一个 外部函数接口 (FFI),它告诉编译器,这个函数的实现不是 Rust 提供的,而是来自外部(这里是 JavaScript)

编译WebAssembly

安装wasm-pack工具并编译:

cargo install wasm-pack
wasm-pack build --target web

完成后,在pkg目录中会生成WebAssembly文件和JavaScript胶水代码。
在这里插入图片描述

在前端使用

在JavaScript中引入并使用:

import initSync, { hello } from "../pkg/wasm_project"initSync().then(() => {hello("WebAssembly已加载!")
})

运行后,你会看到一个弹窗,这就是Rust代码通过WebAssembly在浏览器中执行的结果!

你可能好奇为什么引用js文件。我们可以看一下打包出来的源码:
在这里插入图片描述
可以看出来还是wasm文件,在wasm-bindgen 自动生成的代码简化了这种交互,使开发者可以专注于核心逻辑而非低级互操作细节。

结语

WebAssembly正在悄然改变Web开发的格局。无论是提升现有应用性能,还是将桌面级应用搬上Web,它都提供了前所未有的可能性。

在Web性能至关重要的今天,掌握WebAssembly技术无疑是前端开发者的一项重要技能。未来,我们可能会看到更多复杂应用通过WebAssembly在浏览器中流畅运行。


关注我们,获取更多前沿技术分享!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯4T平台(串口打印电压值)

知识点:串口(单片机发送数据)按键ADC 题目 配置 代码 adc.c uint16_t getadc2(void) {uint16_t adc0;HAL_ADC_Start(&hadc2);adcHAL_ADC_GetValue(&hadc2);return adc; } adc.h uint16_t getadc2(void); main.c #include "lcd.h" #include…

【异常解决】Unable to start embedded Tomcat Nacos 启动报错

Unable to start embedded Tomcat Nacos 启动报错解决方案 一、背景描述二、原因分析三、解决方案 一、背景描述 Windows 本地启动 Nacos(2.2.0) 服务,控制台报错 Unable to start embedded Tomcat。 报错信息:Unable to star…

Spark核心之02:RDD、算子分类、常用算子

spark内存计算框架 一、目标 深入理解RDD弹性分布式数据集底层原理掌握RDD弹性分布式数据集的常用算子操作 二、要点 ⭐️1. RDD是什么 RDD(Resilient Distributed Dataset)叫做**弹性分布式数据集,是Spark中最基本的数据抽象&#xff0c…

Machine Learning 初探

前置知识 pandas 读取文件:read_csv查看信息 describe:查看整体信息,包括每列的平均值、最大最小值、标准差等head:输出头部几行数据columns:输出所有列名loc:查询数据,或是根据索引取对应的数…

linux第四讲----基础开发工具vim

1.软件安装 这里以ubuntu为例,安装sl软件,输入这个命令即可自动安装~ 使用一下,输入sl,屏幕上会出现一个移动的小火车 之后不想要了准备卸载就输入: 注意:1)下载软件时也可以进行搜索~ 2)cento…

【Wireshark 02】抓包过滤方法

一、官方教程 Wireshark 官网文档 : Wireshark User’s Guide 二、显示过滤器 2.1、 “数据包列表”窗格的弹出过滤菜单 例如,源ip地址作为过滤选项,右击源ip->prepare as filter-> 选中 点击选中完,显示过滤器&#…

在 macOS 使用 .pem 私钥免密登录腾讯云服务器

前言 在腾讯云上创建服务器时,如果选择了「密钥对」的登录方式,就会得到一个 .pem 文件作为私钥。很多小伙伴在使用 macOS 系统时,可能不清楚如何使用这个私钥文件来 SSH 免密登录远程服务器。本文将详细介绍如何在本地配置 .pem 私钥文件并…

Android U 分屏——SystemUI侧处理

WMShell相关的dump命令 手机分屏启动应用后运行命令:adb shell dumpsys activity service SystemUIService WMShell 我们可以找到其中分屏的部分,如下图所示: 分屏的组成 简图 分屏是由上分屏(SideStage)、下分屏(MainStage)以及分割线组…

【Python】——使用python实现GUI图书管理系统:Tkinter+SQLite实战

本文将通过一个完整的python项目——图书管理系统,演示如何利用Tkinter构建GUI 界面,结合SQLite数据库实现增删改查功能。代码简洁易懂,适合python初学者学习和二次开发。 一、项目功能概览 图书管理:添加、查看、修改、删除图书…

文件上传靶场(1--9关)

实验环境: 1,upload的靶场环境可以去GitHub上自行查找 2,打开小皮面板的nginx和数据库 3,将文件上传的靶场部署到本地: 放到小皮的phpstduy_pro的www下面 小提示: 另外如果你用的是php7的版本建议将版…

leetcode每日一题——1745分割回文串

给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false 。 当一个字符串正着读和反着读是一模一样的,就称其为 回文字符串 。 示例 1: 输入:s "abcbdd"…

Python的那些事第三十九篇:MongoDB的Python驱动程序PyMongo

PyMongo:MongoDB的Python驱动程序 摘要 PyMongo 是 MongoDB 的官方 Python 驱动程序,用于在 Python 应用程序中与 MongoDB 数据库进行交互。本文将详细介绍 PyMongo 的安装、基本操作、高级功能以及实际应用案例,并通过示例代码和表格展示其强大的功能和灵活性。 1. 引言 …

Windows 使用 Docker + WSL2 部署 Ollama(AMD 显卡推理)搭建手册‌

Windows 使用 Docker WSL2 部署 Ollama(AMD 显卡推理)搭建手册‌ ‌手册目标‌ 在 Windows 11 上通过 ‌Docker WSL2‌ 调用 AMD 显卡运行 Ollama 推理服务。 实现 ‌低延迟、高性能的本地模型推理‌,同时不影响 Windows 正常使用。 标记…

【大模型基础_毛玉仁】1.1 基于统计方法的语言模型

【大模型基础_毛玉仁】1.1 基于统计方法的语言模型 1.语言模型基础1.1 基于统计方法的语言模型1.1.1 n-grams 语言模型1.1.2 n-grams 的统计学原理 1.语言模型基础 语言是概率的。语言模型(LanguageModels, LMs)旨在准确预测语言符号的概率。 将按照语…

IDEA 2025最新版2024.3.3软件安装、插件安装、语言设置

IntelliJ IDEA是一款由JetBrains公司开发的集成开发环境(IDE),主要用于Java语言的开发,它通过提供丰富的功能如智能代码补全、代码分析、版本控制集成等来提高开发效率。 IDEA有社区版和专业版两个版本,社区版是免费开…

springbootWeb入门--创建springbootweb项目

步骤: 1.建立空工程 2.选择项目的jdk版本 3.在工程中建立模块,选择“spring initilazer”,类型勾选“maven” 4.勾选“spring web”之后,就无需再自行写dependcy了。 5.等待联网下载 6.生成的工程文件,如下绿色框中文件&…

Windows10系统构建本地安全私有化的个人知识库——采用DeepSeek+RAGFlow

一、为什么要构建本地私有化个人知识库 1.1、自身需求 1、需要相关隐私资料内容的安全保护可控; 2、需要根据自身的隐私资料内容构建出个性化的知识库; 一些常见的业务场景如:①希望我们的智能助手可以根据公司的管理制度回答问题,让员工可以随时了解公司相关制度内容信息;…

江协科技/江科大-51单片机入门教程——P[3-1] 独立按键控制LED亮灭

本文围绕51单片机开发中的独立按键控制技术展开,系统讲解其硬件结构、电平检测原理与C51编程实现方法。文章从开发板独立按键的物理构造与电路连接入手,剖析按键按下与松开时的电平变化规律,并结合单片机I/O口寄存器操作原理,阐释…

【QGIS二次开发】地图显示与交互-01

1. 系统界面设计 设计的系统界面如下,很好还原了QGIS、ArcGIS等软件的系统界面,充分利用了QT中顶部工具栏、菜单栏、底部状态栏,实现了图层管理器、鹰眼图、工具箱三个工具面板。 菜单栏、工具栏、工具箱集成了系统中实现的全部功能&#x…

第40天:安全开发-JavaEE应用SpringBoot框架JWT身份鉴权打包部署JARWAR

时间轴: 演示案例: SpringBoot-身份鉴权-JWT 技术 SpringBoot-打包部署-JAR&WAR SpringBoot-身份鉴权-JWT 技术 SpringBoot- 身份鉴权 -JWT 技术 JWT(JSON Web Token) 是由服务端用加密算法对信息签名来保证其完整性和不可伪 造; …