Rust + wasm 使用

这篇具有很好参考价值的文章主要介绍了Rust + wasm 使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、wasm是什么

WebAssembly(WASM)是一个简单的机器模型和可执行格式,具有广泛的规范。它被设计为便携、紧凑,代码执行能够达到接近本机原生指令的执行速度。
作为一种编程语言,WebAssembly 由两种格式组成,它们以不同的方式表示相同的结构:

后缀为 .wat 的文本格式(称为“WebAssembly Text”),可以被人类理解,使用 S-表达式。
后缀为 .wasm 的二进制格式是较低级别的,人类无法读懂,它旨在供 wasm 虚拟机直接使用

1.为什么使用Wasm?

为什么要使用wasm,可以在JavaScript中使用c++代码或者rust代码从而提高代码效率。有几个原因可以说明使用WebAssembly的意义:

  • 它允许在浏览器中执行用任何语言编写的代码。
    • 这包括利用现有的库(数字、音频处理、机器学习等),这些库是用JavaScript以外的语言编写的。
  • 根据所使用语言的选择,Wasm能够以接近原生的速度运行。这有可能使网络应用程序的性能特征更接近于移动和桌面的本地体验。

2.什么情况不适合使用功能Wasm?

WebAssembly的普及肯定会继续增长;然而,它并不适合所有的Web开发:

  • 对于简单的项目,坚持使用JavaScript、HTML和CSS可能会在更短的时间内提供一个工作产品。
  • 旧的浏览器,如Internet Explorer,不直接支持Wasm。
  • WebAssembly的典型使用需要在你的工具链中添加工具,如语言编译器。如果你的团队优先考虑保持开发和持续集成工具尽可能的简单,使用Wasm将与此背道而驰。

3.为什么选择Rust+Wasm?

虽然许多编程语言都可以编译成Wasm,但我为这个例子选择了Rust。Rust是由Mozilla在2010年创建的,并在不断地普及。在2020年Stack Overflow的开发者调查中,Rust占据了 "最受喜爱的语言 "的位置。但在WebAssembly中使用Rust的原因不仅仅是潮流:

  • 首先,Rust的运行时间很小,这意味着当用户访问网站时,发送到浏览器的代码更少,有助于保持网站的低足迹。
  • Rust有出色的Wasm支持,支持与JavaScript的高级互操作性。
  • Rust提供了接近C/C++级别的性能,但有一个非常安全的内存模型。与其他语言相比,Rust在编译代码时执行了额外的安全检查,大大减少了由空变量或未初始化变量引起的崩溃的可能性。这可以导致更简单的错误处理,并在发生意外问题时保持良好的用户体验的机会更高。
  • Rust不是垃圾收集的。这意味着Rust代码可以完全控制内存的分配和清理时间,从而实现一致的性能–这是实时系统的关键要求。

二、rust代码打包成wasm

1. 安装 wasm-pack

一个构建、测试和发布 WASM 的 Rust CLI 工具,我们将使用 wasm-pack 相关的命令来构建 WASM 二进制内容。

2.在 Cargo.toml 文件中添加下列代码并保存,保存之后 Cargo 会自动下载依赖。

  • cdylib 用来指明库的类型。
  • wasm-bindgen 是一个简化 Rust WASM 与 JS 之间交互的库。它能够将如 DOM 操作、console.log 和 performance 等 JS 相关 API 暴露给 Rust 使用,能够将 Rust 功能导出到 JS 中,如类、函数等
[package]
name = "greeting"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib", "rlib"]
path = "src/main.rs" # 这个路径得有 用于包wasm

[dependencies]
wasm-bindgen = "0.2.83"  # 用于包wasm

3.在main.rs中编写目标函数

// 标记为#[no_mangle]以确保其名称不被修改 用于wasm打包
#[no_mangle]
fn add(a: i32, b: i32) -> i32 {
    return a + b;
}

4.编译构建wasm包

wasm-pack build

命令行执行这个代码,最终会得到pkg文件夹,在里面可以找到xxx.wasm

三、js中使用wasm包

方法一:直接读取二进制文件并对字节进行实例化

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
<script type="application/javascript">
    var exports;
    fetch('/greeting_bg.wasm')
        .then(response => response.arrayBuffer())
        .then(bytes => WebAssembly.instantiate(bytes))
        .then(result => {
            exports = result.instance.exports;
            console.log("导入完成")
            // 在此处执行.wasm文件的导出函数或操作
            console.log(exports.add(5, 3))
        })
        .catch(error => {
            console.error('Failed to load and execute .wasm file:', error);
        });
</script>
</html>

方法二:通过使用 instantiateStreaming 调用流式实例化

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>

</body>
<script type="application/javascript">
    WebAssembly.instantiateStreaming(fetch("/greeting_bg.wasm")).then((obj) => {
        const add = obj.instance.exports.add;
        console.log(add(5,3));
    })
</script>
</html>

学习参考博客
https://juejin.cn/post/7156102433581383716#heading-10
https://juejin.cn/post/7168351928949145614文章来源地址https://www.toymoban.com/news/detail-488623.html

到了这里,关于Rust + wasm 使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • rust wasm入门

    📕作者简介: 过去日记 ,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。 📘相关专栏Rust初阶教程、go语言基础系列、spring教程等,大家有兴趣的可以看一看 📙Java并发编程系列,设计模式系列、go web开发框架 系列正在发展中,喜欢Java,GoLang,Rust,的

    2024年04月16日
    浏览(26)
  • Rust Web 全栈开发之编写 WebAssembly 应用

    MDN Web Docs:https://developer.mozilla.org/zh-CN/docs/WebAssembly 官网:https://webassembly.org/ Web App 教师注册 - WebService - WebAssembly App 课程管理 WebAssembly 是一种新的编码方式,可以在现代浏览器中运行 它是一种低级的类汇编语言 具有紧凑的二进制格式 可以接近原生的性能运行 并为 C/C ++ 、

    2024年02月07日
    浏览(33)
  • 前端Rust开发WebAssembly与Swc插件快速入门

    现代前端对速度的追求已经进入二进制工具时代,Rust 开发成为每个人的必修课。 一般我们将常见的前端 Rust 开发分为以下几类,难度由上至下递增: 开发 wasm 。 开发 swc 插件。 开发代码处理工具。 我们将默认读者具备最简单的 Rust 知识,进行快速入门介绍。 开发 wasm 意义

    2024年02月12日
    浏览(29)
  • 一个简单的 rust 项目 飞机大战

    一个使用 bevy 引擎制作的飞机游戏。 原视频教程地址,github 地址。 因为 bevy 已经升级到 0.10.1 了,所以重新做一遍。顺带手出个教程。 下面是做的部分变动: 将激光以及玩家的移动模块进行了拆分。 新增了背景图片。 新增了游戏状态管理 Welcome/InGame/Paused。 新增了声音播放

    2023年04月19日
    浏览(26)
  • 给 Web 前端工程师看的用 Rust 开发 wasm 组件实战

    wasm 全称 WebAssembly,是通过虚拟机的方式,可以在服务端、客户端如浏览器等环境执行的二进制程序。他有速度快、效率高、可移植的特点。 对我们 Web 前端工程最大的好处就是可以在浏览器端使用二进制程序处理一些计算量大的处理,使用他比 javascript 快的特点优化性能。

    2024年02月05日
    浏览(38)
  • 使用ChatGPT构建一个AIML聊天机器人是什么体验

    ​ 使用ChatGPT构建一个AIML聊天机器人是什么体验,使用ChatGPT将C#代码转换为Swift代码以实现Swift版的Aiml聊天机器人,AIML(全名为Artificial Intelligence Markup Language)是一种基于XML模式匹配的人工智能标记语言,最早是一个名为\\\"A.L.I.C.E.\\\" (“Artificial Linguistic Internet Computer Entity”)的高

    2024年02月11日
    浏览(35)
  • 使用Python和PyTorch库构建一个简单的文本分类大模型:

            在当今的大数据时代,文本分类任务在许多领域都有着广泛的应用,如情感分析、垃圾邮件过滤、主题分类等。为了有效地处理这些任务,我们通常需要构建一个强大的文本分类模型。在本篇博客中,我们将使用Python和PyTorch库来构建一个简单的文本分类大模型,

    2024年01月25日
    浏览(31)
  • WebGL以及wasm的介绍以及简单应用

    下面主要介绍了WebGL和wasm,是除了html,css,js以外Web标准所支持的另外两个大件 前者实现复杂的图形处理,后者提供高效的代码迁移以及代码执行效率 首先,浏览器里的游戏是怎么做到这种交互又显示不同的画面的? 试想用我们的前端三件套实现一下.好像可以用canvas来实现,但是实

    2024年02月22日
    浏览(33)
  • 简介:在这篇教程中,我们将使用React.js框架创建一个简单的聊天机器人的前端界面,并利用Dialogflo

    作者:禅与计算机程序设计艺术 介绍及动机 聊天机器人(Chatbot)一直是互联网领域中的热门话题。而很多聊天机器人的功能都依赖于人工智能(AI)技术。越来越多的企业希望拥有自己的聊天机器人系统,从而提升自己的竞争力。为此,业界也出现了很多基于开源技术或云

    2024年02月06日
    浏览(42)
  • openai开放gpt3.5-turbo模型api,使用python即可写一个基于gpt的智能问答机器人

    使用 pip 安装openai库,注意 gpt3.5-turbo 模型需要 python=3.9 的版本支持,本文演示的python版本是 python==3.10.10 需要提前在 openai 官网上注册好账号,然后打开 https://platform.openai.com/account/api-keys 就可以创建接口 keys 每个账号注册完成会有18美元在里面,每次调用api,就会花费里面的

    2024年02月06日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包