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

Rust + WASM 入门

一、参考资料

参考官方技术文档 https://rustwasm.github.io/

二、安装脚手架 cargo-generate

# cargo-generate 用于快速生成 WASM 项目的脚手架(类似 create-react-app)
cargo install cargo-generate

三、下载安装 wasm-pack.exe 打包工具 

 双击安装之后在 Cargo 根路径下多出一个 wasm-pack.exe 

四、创建一个 WASM 项目

# 使用模板生成
cargo generate --git https://github.com/rustwasm/wasm-pack-template# 使用文档 GitHub - cargo-generate/cargo-generate: cargo, make me a project# templates on github
cargo generate --git https://github.com/username-on-github/mytemplate.git# or just
cargo generate username-on-github/mytemplate# templates on other git platforms
cargo generate gl:username-on-gitlab/mytemplate
cargo generate bb:username-on-bitbucket/mytemplate# this scheme is also available for github
cargo generate gh:username-on-github/mytemplate# for a complete list of arguments and options
cargo help generate

 在项目目录下运行 wasm-pack build 命令,即可编译出 WASM 模块。wasm-pack 会在项目的 pkg 目录下生成 .wasm 文件和相关的 js 胶水代码。

wasm-pack build --target web

五、创建一个Vue项目 

# VueCli,弃用
# vue create -m cnpm webdemo
# 使用 Vite
cnpm create vite@latest

六、引用 wasm 模块

<script setup lang="ts">
import { onMounted, ref } from 'vue'import init, { greet } from '../../pkg/mydemo.js'defineProps<{ msg: string }>()const count = ref(0)onMounted(async () => {await init()greet()
})

将 pkg 复制到前端根目录下。 

七、运行测试

八、 序列化与出入参

> js-sys 用于将 Rust 类型 => JS 类型
> wasm_bindgen 中的 JsValue 用于将 JS 类型 => Rust 类型
// 示例一
#[wasm_bindgen]
pub extern "C" fn gen_pubKey(seed: &[u8]) -> Uint8Array {let (privKey, pubKey) = ed25519::keypair(&seed);unsafe { Uint8Array::view(&pubKey) }
}// 示例二
extern crate serde_json;
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;#[macro_use]
extern crate serde_derive;
#[wasm_bindgen]
pub fn test(array: JsValue) {let elements: Vec<u32> = array.into_serde().unwrap();
}// 示例三
pub extern "C" fn greet(a: &str) -> String {format!("Hello, {}!", a)
}
#[export_name = "greet"]
pub extern "C" fn __wasm_bindgen_generated_greet(arg0_ptr: *const u8,arg0_len: usize,
) -> *mut String {let arg0 = unsafe {let slice = ::std::slice::from_raw_parts(arg0_ptr, arg0_len);::std::str::from_utf8_unchecked(slice)};let _ret = greet(arg0);Box::into_raw(Box::new(_ret))
}// 示例四
#[wasm_bindgen]
pub fn get_printers() -> js_sys::Array {let list = js_sys::Array::new();let printers = printers::get_printers();for printer in printers.clone() {list.push(&js_sys::JsString::from(printer.name));}list
}
// 示例五
extern crate serde_json;
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
#[macro_use]
extern crate serde_derive;
#[derive(Serialize, Deserialize)]
pub struct Element {name: String,id: String,parent_id: String,
}#[wasm_bindgen]
pub fn test(js_objects: &JsValue) {let elements: Vec<Element> = js_objects.into_serde().unwrap();
}

九、WASM 安全性【OS 资源访问限制】

WASM 想要执行 WindowOS 的一些脚本,抛出平台不支持异常;

WASM 是运行于浏览器当中,而浏览器本身设计为没有权限访问OS资源,这是出于安全考虑。
通过设计,WebAssembly模块运行所在的环境与基础主机系统的本机功能完全隔离(或沙盒化)。这意味着默认情况下,Wasm模块被设计为仅执行纯计算。
因此,通常无法从WASM访问“ OS”级资源,例如文件描述符,网络套接字,系统时钟和随机数。但是,在许多情况下,Wasm模块需要执行的工作不仅仅是执行纯计算。它们必须与本机“ OS”功能交互。 因此一群天才们提出了使用 WASI 操作 OS 资源,并且能够独立在浏览器之外运行,下一篇文章再做一个Rust + WASI 的 DEMO。

相关文章:

Rust + WASM 入门

一、参考资料 参考官方技术文档 https://rustwasm.github.io/ 二、安装脚手架 cargo-generate # cargo-generate 用于快速生成 WASM 项目的脚手架&#xff08;类似 create-react-app&#xff09; cargo install cargo-generate 三、下载安装 wasm-pack.exe 打包工具 双击安装…...

【操作系统】内存空间

最小的操作系统Hello world 想要pmap这个进程&#xff0c;需要进程号 但是这个进程在启动的一瞬间就执行完了 用GDB把程序暂停下来&#xff0c;然后用pmap观察地址空间 用info inferiors得到gdb里的进程号 ro 可读 &#xff1a;只读数据 rx 可读可执行 &#xff1a;代码 rw 可…...

详解静态、动态代理以及应用场景

一篇不太一样的代理模式详解&#xff0c;仔细阅读&#xff0c;你一定会获取不一样的代理见解&#xff0c;而不是人云亦云。 查看了社区里关于代理模式描述&#xff0c;发现很多博客千篇一律甚至存在共性错误&#xff0c;写此文提出自己对代理的见解。 静态代理动态代理 JDKCGLi…...

ChatGLM-6B本地cpu部署

ChatGLM-6B是清华团队研发的机器人对话系统&#xff0c;类似ChatGPT&#xff0c;但是实际相差很多&#xff0c;可以当作一个简单的ChatGPT。 ChatGLM部署默认是支持GPU加速&#xff0c;内存需要32G以上。普通的机器无法运行。但是可以部署本地cpu版本。 本地部署&#xff0c;需…...

算法修炼之练气篇——练气七层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…...

vscode常用快捷方式

基本编辑 Ctrl X&#xff1a;剪切当前行或选定内容 Ctrl C&#xff1a;复制当前行或选定内容 Ctrl V&#xff1a;粘贴当前行或剪切板内容 Ctrl Z&#xff1a;撤销上一步操作 Ctrl Y&#xff1a;恢复上一步撤销的操作 Ctrl F&#xff1a;在当前文件中查找内容 Ctrl H&am…...

如何压缩mp3文件大小,5分钟学会4种方法

如何压缩mp3文件大小&#xff1f;我们在开车的时候都很喜欢听歌&#xff0c;一般歌曲库里的mp3文件都很多&#xff0c;小编的就有上千首。如果我们还想要增加更多mp3文件&#xff0c;有时候就会出现内存不足的情况啦。所以我们需要压缩mp3文件大小&#xff0c;这样才能在我们手…...

从0搭建Vue3组件库(十二):引入现代前端测试框架 Vitest

Vitest 是个高性能的前端单元测试框架,它的用法其实和 Jest 差不多,但是它的性能要优于 Jest 不少,还提供了很好的 ESM 支持,同时对于使用 vite 作为构建工具的项目来说有一个好处就是可以公用同一个配置文件vite.config.js。因此本项目将会使用 Vitest 作为测试框架。 安装 …...

使用Handler创建一个Android秒表应用

本文所有代码都放在以下链接中&#xff1a;https://github.com/MADMAX110/Stopwatch 0、应用是一个有活动、布局和其他资源组成的集合。其中一个活动是应用的主活动。每个应用都有一个主活动&#xff0c;在文件AndroidManifest.xml中指定。 1、默认地&#xff0c;每个应用都在…...

node-sass安装失败解决方法总结

node-sass 安装失败的原因 npm 安装 node-sass 依赖时&#xff0c;会从 github.com 上下载 .node 文件。由于国内网络环境的问题&#xff0c;这个下载时间可能会很长&#xff0c;甚至导致超时失败。 解决方法一&#xff1a;使用淘宝镜像源&#xff08;推荐&#xff09; npm …...

C++特殊类设计

文章目录 1.设计一个类&#xff0c;不能被拷贝2.设计一个类&#xff0c;只能在堆上创建对象3.设计一个类&#xff0c;只能在栈上创建对象4.设计一个类&#xff0c;不能被继承5.设计一个类&#xff0c;只能创建一个对象5.1 单例模式5.2 饿汉模式5.3 懒汉模式5.4 两种模式的析构函…...

常用的python gpu加速方法

在使用 PyCharm进行机器学习的时候&#xff0c;我们常常需要自己创建一些函数&#xff0c;这个过程中可能会浪费一些时间&#xff0c;在这里&#xff0c;我们为大家整理了一些常用的 Python加速方法&#xff0c;希望能给大家带来帮助。 在 Python中&#xff0c;我们经常需要创建…...

SpringCloud-Gateway

什么是网关&#xff1f; 网关是一个服务&#xff0c;是访问内部系统的唯一入口&#xff0c;提供内部服务的路由中转&#xff0c;额外还可以在此基础上提供如身份验证、监控、负载均衡、限流、降级与应用检测等功能。 Spring Cloud Gateway 与 Zuul 对比 zuul1.x与zuul2.x Zu…...

【C++ qt4】操作json学习笔记

本博文源于笔者在学习c qt4操作json文件&#xff0c;qt4不支持json&#xff0c;里面的函数是json.h与jsoncpp.cpp我已经附在文末&#xff0c;大家可复制重命名用&#xff0c;里面的案例可以自己拿来敲或者直接copy也行.,一定利用好目录拖动&#xff0c;不然很长。 文章目录 1.从…...

【牛客刷题专栏】0x25:JZ24 反转链表(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…...

useEffect

useEffect 1.依赖项是什么&#xff1f;2.useEffect怎么知道依赖项数组发生了改变&#xff1f;3.依赖项的改变会导致无限渲染吗&#xff1f;4.使用 Object.is 来比较新/旧 state 是否相等&#xff0c;浅比较&#xff1f;5.为什么要用浅比较&#xff0c;而不用深比较呢&#xff1…...

如何利用splice()和slice()方法操作数组

如何利用splice&#xff08;&#xff09;和slice&#xff08;&#xff09;方法操作数组 前言splice()是什么&#xff0c;有什么用&#xff1f;怎么用&#xff1f;slice()是什么&#xff0c;有什么用&#xff1f;怎么用&#xff1f;splice和slice方法的区别小结 前言 splice&am…...

一文读懂ChatGPT(全文由ChatGPT撰写)

最近ChatGPT爆火&#xff0c;相信大家或多或少都听说过ChatGPT。到底ChatGPT是什么&#xff1f;有什么优缺点呢&#xff1f; 今天就由ChatGPT自己来给大家答疑解惑~ 全文文案来自ChatGPT&#xff01; 01 ChatGPT是什么 ChatGPT是一种基于人工智能技术的自然语言处理系统&…...

如何提升应届生职场竞争力

引言 对于应届毕业生来说&#xff0c;进入职场是既令人兴奋又具有挑战性的。面对竞争激烈的就业市场&#xff0c;提高自身的职场竞争力对于应届生来说尤为重要。本文旨在为应届生提供有价值的见解和实用的策略&#xff0c;帮助他们提升职场竞争力&#xff0c;增加在就业市场中的…...

David Silver Lecture 5: Model-Free Control

1 Introduction 1.1 内容 上一章是对一个unknown MDP进行value function的预测&#xff0c;相当于policy evaluation。这一章是对unknown MDP找到一个最优的policy&#xff0c; optimise value function. 1.2 On and Off-Policy Learning On-policy learning learn on the…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...