【Rust日报】2023-06-07 使用 C++ 编写通用库并在 Rust 中使用它 (WASI)

news2024/11/29 8:45:02

使用 C++ 编写通用库并在 Rust 中使用它 (WASI)

WebAssembly 简介

WebAssembly 是一种二进制指令格式,旨在成为一种低级虚拟机,可以在 Web 浏览器中以接近本机的速度运行代码。它不特定于网络,也可以在其他平台上运行。WebAssembly 代码可以从各种编程语言编译而来,例如 C、C++、Rust、C# 等。 Wasmer 是一个轻量级且快速的 WebAssembly 运行时,可以在各种平台上运行 WebAssembly 模块,包括 Windows、Linux 和 macOS。Wasmer 支持多种编程语言,包括 C、C++、Rust 等。

使用 C++ 创建 WebAssembly 库

首先,我们将使用 C++ 创建一个简单的“加法”函数,它将两个整数作为输入并返回它们的和。

// add.cpp 

extern  "C" { 
    int  add ( int a, int b)  { 
        return a + b; 
    } 
}

在这段代码中,我们将使用 Rust 中的 add 函数。使用外部“C”是为了使函数“add”不被编译器破坏。我们将不得不在我们的 Rust 代码中使用相同的名称。以下是将代码编译为 WebAssembly 的更新命令:

wasmc++ add.cpp -o add.wasm

完成执行后,您应该能够看到文件 add.wasm。我们会将这个 Web 程序集加载到我们的 Rust 项目中。

在 Rust 中使用它

让我们使用创建一个简单的 Rust 项目

cargo new wasmer-consume

在 Cargo.toml 中添加如下依赖

wasmer = “3.1.1” 
wasmer-wasi = “3.1.1”

替换main.rs中的以下代码

use wasmer::{Instance, Module, Store, Value, Function};
use wasmer_wasi::{WasiState, WasiEnv, generate_import_object_from_env, WasiFunctionEnv};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Read the WebAssembly module bytes
    let wasm_bytes = include_bytes!("/Users/shyamsundarb/Library/cppWrk/wasmerblog/wasmer-consume/add.wasm");
    
    // Create a new store to hold WebAssembly instances
    let mut store = Store::default();

    // Create a new WASI state for the WASI environment
    let wasi_state = WasiState::new("wasi_snapshot_preview1").build()?;
    
    // Create a new WASI environment using the WASI state
    let wasi_env = WasiEnv::new(wasi_state);

    // Compile the WebAssembly module from the provided bytes
    let module = Module::new(&store, wasm_bytes)?;

    // Create a new instance of the WASI functions using the store and WASI environment
    let wasi_func = WasiFunctionEnv::new(&mut store, wasi_env);

    // Generate the import object from the WASI functions and environment
    let mut import_object = generate_import_object_from_env(&mut store, &wasi_func.env, wasmer_wasi::WasiVersion::Latest);
    
    // Create a host function that exits the program
    let exit_func = Function::new_typed(&mut store, |i: i32| {
        std::process::exit(i);
    });

    // Add the missing `proc_exit` function to the import object
    import_object.define("wasi_snapshot_preview1", "proc_exit", exit_func);
    
    // Create a new instance of the WebAssembly module with the import object
    let instance = Instance::new(&mut store, &module, &import_object)?;

    // Get the `add` function from the instance exports
    let add: &Function = instance.exports.get_function("add")?;

    // Call the `add` function with two integer arguments
    let result = add.call(&mut store, &[Value::I32(2), Value::I32(3)])?;
    
    // Retrieve the result value from the function call
    let result_value: i32 = result[0].unwrap_i32();

    // Print the result
    println!("Result: {}", result_value);

    Ok(())
}

当您运行 cargo run 命令时,如果一切顺利,您应该会看到以下内容:

19569d2455a03cdce89b133839b804ab.png.

我们可以看到该函数在控制台应用程序中可用。现在让我们看看如何在浏览器中使用它。

结论

尽管这个例子很简单,但从概念上讲,它为“一次编写,到处运行”开辟了新的含义。Webassembly 作为一项技术仍处于初期阶段。它帮助我们弥合编程语言和平台之间的鸿沟。


From 日报小组 侯盛鑫 mock

社区学习交流平台订阅:

  • Rustcc论坛: 支持rss

  • 微信公众号:Rust语言中文社区

Rust语言中文社区视频号live上线啦,以后会不定时直播Rust活动,欢迎关注

d77d37c21f0aed7af83eb6aa93631825.jpeg

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【嵌入式环境下linux内核及驱动学习笔记-(15-1)例程】

目录 1、在APP直接调用标准文件IO操作I2C(针对学习笔记-15的15.3节)1.1 mail.c1.2 mpu6050.h1.3 mpu6050.c1.4 Makefile 2、以外称id的方式进行匹配的i2c驱动2.1 mpu6050.h2.2 mpu6050_i2c_client.c2.3 mpu6050_i2c_driver.c2.4 read_mpu.c 测试的应用层APP2.5 Makefile 3、以设…

Python3数据分析与挖掘建模(10)复合分析-交叉分析与实现示例

1. 复合分析 1.1 概述 复合分析&#xff08;Factorial Analysis&#xff09;是一种统计分析方法&#xff0c;用于研究多个因素对观测结果的影响&#xff0c;并探究各个因素之间的相互作用效应。 在复合分析中&#xff0c;研究者会选择多个因素&#xff08;也称为处理变量或独…

武汉涉密系统集成资质保密制度涵盖哪些内容

涉密信息系统集成资质申请其中最核心的就是保密制度管理&#xff0c;这里面涉及到保密管理的方方面面&#xff0c;现场审查也是围绕保密制度建设内容来打分的。申报单位应当建立规范、操作性强的保密制度&#xff0c;并根据实际情况及时修订完善。保密制度的具体要求应当体现在…

highlight clock tree

当分析clock tree需要在图形界面highlight clock tree时&#xff0c;最朴实无华的方法就是贴报告&#xff0c;除此之外这里也分享一下用命令的方法。 1.Imported Path Pins 1&#xff09;Highlight > Color By > Imported Path Pins 2&#xff09;report_timing icc2…

智慧园区物业可视化大屏

随着万物互联、数字信息时代的到来&#xff0c;也给物业园区管理行业带来变革性影响。 园区作为城市的基本组成单元&#xff0c;是人口和产业的重要聚集区&#xff0c;现已逐渐成为中国经济转型升级和创新发展的主力。 智慧园区物业可视化整合园区现有信息系统的数据资源&#…

OpenStack部署(四)

OpenStack部署 8. Dashboard8.1 安装并配置8.2 重启web服务器以及会话存储服务8.3 浏览器访问配置 9. Designate9.1 创建Designate数据库并授权9.2 获得admin凭证9.3 创建designate用户并设置密码9.4 添加admin角色到designate用户9.5 创建designate服务实体9.6 创建designate服…

【计算机组成与体系结构Ⅰ】章节测试(1-3)

下列是计算机中几种常见的机器数编码&#xff1a; ①原码 ②反码 ③补码 零的表示唯一的是&#xff08; &#xff09; A&#xff0e;仅③ B&#xff0e;② C&#xff0e;①、② D&#xff0e;①、③ 下列采用偶校验的8位奇偶校验编码中正确的是&#xff08; &#xff09;…

【Spring】——Spring简单 读和取

前言 ❤️❤️❤️Spring专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring_冷兮雪的博客-CSDN博客 上期我们讲解了Spring的创建与使用&#xff0c;发现 将Bean 注册到容器 这一步中&#xff0c;如果Bean对象…

Matter协议高速崛起,你真的了解它吗?

今天我们要聊的话题&#xff0c;和智能家居有关。 说到智能家居&#xff0c;大家应该都不会陌生。早在本世纪初&#xff0c;物联网概念刚刚诞生的时候&#xff0c;最主要的应用领域&#xff0c;就是智能家居。 这些年来&#xff0c;随着数字技术的不断发展&#xff0c;越来越多…

MINIX 已死,Linux 又将如何呢?

导读MINIX 操作系统大约的确已经死了。Minix 原来是荷兰阿姆斯特丹的 Vrije 大学计算机科学系的 Andrew S. Tanenbaum 教授所开发的一个类 Unix 操作系统&#xff0c;全部代码共约 12,000 行&#xff0c;起初是为给学生讲解操作系统的运作细节而开发。 Linus Torvalds 也曾表示…

报表生成器FastReport .Net用户指南:“Rich Text“对象

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…

1999-2020年31省省农村人口就业和文化程度相关数据

1999-2020年31省省农村人口就业和文化程度相关数据 1、时间&#xff1a; 2、范围&#xff1a;包括全国31省 3、来源&#xff1a;整理自各省NJ、统计NJ、农村NJ 4、指标包括&#xff1a; 乡村人口和乡村就业人员&#xff1a;乡村人口&#xff08;万人&#xff09;、乡村人口&…

opencv实践项目-停车位检测

目录 1. 步骤1.1 selector选择器1.2 detector探测器 2. 代码3. 效果图 1. 步骤 1.1 selector选择器 我们可以选择摄网络摄像头提供的第一帧&#xff0c;在该图像上选择停车位。为此&#xff0c;保存并使用该图像选择停车位。使用selectROIs函数标记停车位。ROI被定义为感兴趣…

分布式限流算法及实现介绍

分布式系统架构下面对突增的高并发访问请求&#xff0c;如何实现限流以保护系统的可用性是需要关注的一个问题。分布式限流实现机制上有很多中&#xff0c;包括基于网关实现、基于中间件如Redis实现等&#xff0c;本文简要介绍限流的常用算法以及实现方案。 1、分布式限流概述 …

Windows操作系统渗透测试

Windows操作系统渗透测试 任务环境说明&#xff1a;服务器场景名&#xff1a;Server02服务器场景操作系统&#xff1a;未知&#xff08;关闭链接&#xff09; 1.通过本地PC中渗透测试平台Kali对服务器场景进行系统服务及版本扫描渗透测试&#xff0c;并将该操作显示结果中808…

可视化报表系统推荐

在当今信息时代&#xff0c;数据的处理和分析已经成为了企业管理中不可或缺的一部分。而报表则是这个过程中最常见的工具之一。手工写报表虽然简单易懂&#xff0c;但是随着数据量的增加&#xff0c;这种方式逐渐暴露出许多痛点。比如说&#xff1a; 1.时间耗费长&#xff1a;…

Linux之进程间通信——管道

文章目录 前言一、进程间通信1.概念2.目的3.进程间通信分类 二、管道1.管道介绍2.管道分类1.匿名管道pipi创建管道文件&#xff0c;打开读写端fork子进程关闭父进程的读取端&#xff0c;关闭子进程的写入端读写特征管道特征 2.命名管道mkfifo创建管道文件删除管道文件通信 三、…

【openframework】实时路径规划(RTRRTstar算法)

程序框架 视频演示 实时RRT-star算法介绍 实时RRT-star算法是一种基于采样的运动规划算法&#xff0c;它可以在有限的时间内找到一条渐进最优的路径。实时RRT-star算法是在RRT-star算法的基础上进行了改进&#xff0c;主要有两个方面&#xff1a; - 实时更新起始点。实时RRT-st…

那些漏洞挖掘高手都是怎么挖漏洞的?

前言 说到安全就不能不说漏洞&#xff0c;而说到漏洞就不可避免地会说到三座大山&#xff1a; 漏洞分析 漏洞利用 漏洞挖掘 从个人的感觉上来看&#xff0c;这三者尽管通常水乳交融、相互依赖&#xff0c;但难度是不尽相同的。本文就这三者分别谈谈自己的经验和想法。 漏洞分析…

Mac图片批处理工具

PhotoMill X是一款强大的图像处理软件&#xff0c;它可以帮助用户快速地对照片进行编辑、调整和转换。它支持在单个或批量模式下处理大量的图像文件&#xff0c;并具有直观的用户界面和易于使用的工具。 PhotoMill X具有广泛的编辑功能&#xff0c;包括裁剪、缩放、旋转、调整明…