QRust(一) 简介

news/2024/11/14 17:02:03/文章来源:https://www.cnblogs.com/dyf029/p/18539531

QRust是一个开源组件,是Qt和Rust两种语言的混合编程中间件,是Qt调用Rust函数的支持技术。

QRust来源于工具软件OnTheSSH,OnTheSSH软件由Qt和Rust两种语言共同构建,Rust实现了SSH通讯底层协议,Qt搭建程序界面,Qt调用Rust的技术需求催生出了QRust。

一个使用QRust的例子:

Rust端:

fn invoke(fun_name: &str, mut args: Vec<&[u8]>) -> Result<Option<Vec<u8>>>
{match fun_name{……"foo2" =>{let a1 = de::from_pack(args.pop().unwrap())?;  //反序列化获得参数1let a2 = de::from_pack(args.pop().unwrap())?;  //反序列化获得参数2let a3 = de::from_pack(args.pop().unwrap())?;  //反序列化获得参数3
 let ret = api::foo2(a1, a2, a3);    //调用函数foo2,得到返回值let pack = ser::to_pack(&ret)?;     //序列化返回值
            Ok(Some(pack))}……}
}

在上面的代码中,通过匹配字符串”foo2″定位到函数api::foo2(),传入三个反序列化得到的参数,并将函数返回值序列化后返回。

Qt端:

Rust rust("foo2");  //声明要调用的Rust函数foo2//参数 1
QList<qint32> a1 = {100};
QByteArray ba1 = QRust_Ser::pack_list_i32(&a1);  //序列化
//参数 2
QHash<qint32, QString> a2 = {{1, "abcde"}};
QByteArray ba2 = QRust_Ser::pack_hi_str(&a2);  //序列化
//参数 3
QHash<QString, QString> a3 = {{"a", "12345中文"}};
QByteArray ba3 = QRust_Ser::pack_hs_str(&a3);  //序列化
 
rust.call(ba1, ba2, ba3);  //调用函数并传参
 
QHash<QString, QString> ret;  //声明返回值
QRust_De::upack_hs_str(rust.pop(), &ret);  //反序列化获得返回值

在上面的代码中,声明要调用的Rust端函数foo2,序列化并传递三个参数,函数调用后反序列化获得返回值。在示例中,实现了三种复杂数据类型的转换:

Qt端 QList<qint32> QHash<qint32, QString> QHash<QString, QString>
Rust端 Vec<i32> HashMap<i32, String> HashMap<String, String>

QRust能带来什么?

混合语言编程总是一项具有挑战性的任务,在C/C++和Rust语言之间,Rust调用C函数相对容易一些,在Rust的底层中就存在着大量的用unsafe包裹的C函数的调用语句。反过来C调用Rust就相对复杂一些,特别是传递复杂的参数时,比如集合、自定义的struct、堆上存放的数据,这种场景马上会带来指数级的复杂性和恐怖的代码出错率。

在OnTheSSH的早期版本中,采用了另一种简单的技术实现,Qt以TCP/Socket方式调用Rust服务,通过JSON封装数据,这种方式非常容易实现,但也存在以下问题:

  • 凭空多出了TCP服务,不仅占用资源,在一些环境中还会触发安全提示,对于使用者不是很友好。
  • Socket是网络调用,相比进程内调用性能差了很多。
  • 代码中存在大量的JSON相关的序列化和反序列化语句,显得有些啰里啰唆。

因此需要使用更好的技术来解决以上问题,但Qt调用Rust存在两个技术难点:

  • Qt怎样方便的调用Rust函数,以什么形式调用?
  • 种类众多且复杂的数据类型怎样方便的从Qt传递到Rust,然后从Rust传回Qt?

部分编程语言(如Java)具有运行时的反射机制,可以获得内存中对象的类型和值,能动态调用函数,是进行混合编程的利器。但C++和Rust都没有运行时反射机制(由语言哲学决定),很难在C++和Rust中动态获得或解析变量类型。

在Rust的语言规范中,C语言调用Rust函数有一套接口FFI,但这里我不想介绍FFI因为它太复杂,并不是理想的解决方案。

QRust是为解决以上问题的一种折中的技术实现,它的设计思想体现在这几个方面:

  • 降低FFI接口的复杂性,让使用者通过基础的少量的学习,即可掌握Qt对Rust的调用技术。
  • 减少序列化和反序列化的代码量。
  • 推行实用主义,不追求具有反射能力的完全自动化,也不刻意追求复杂数据类型的传递能力,在Qt和Rust语言的有限条件下,最大限度的提供混合编程的能力。
  • 契合Qt和Rust的规范和习惯,比如在序列化和反序列化技术上,Rust选用标准的serde框架,Qt选用QMetaObject技术来实现struct的遍历和读写。

下载QRust源码

QRust Source Code – onthessh.com

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

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

相关文章

服务器漏洞修复:TLS 1.0 已启用、HSTS、CSP

1、TLS 1.0 已启用 描述: 此 Web 服务器支持通过 TLS 1.0 加密。TLS 1.0 不被认为是“强密码术”。根据 PCI 数据安全标准 3.2(.1) 的定义和要求,在保护从网站往返的敏感信息时,TLS 1.0 并不被认为是 "强加密"。根据 PCI,"2018 年 6 月 30 日是禁用 SSL/早前…

一款 C# 编写的神经网络计算图框架

前言 深度学习技术的不断发展,神经网络在各个领域得到了广泛应用。为了满足 .NET 开发的需求,推荐一款使用 C# 编写的神经网络计算图框架。 框架的使用方法接近 PyTorch,提供了丰富的示例和详细的文档,帮助大家快速上手。 框架介绍 项目完全使用 C# 编写,提供了一个透明的…

安全通道异常识别系统

安全通道异常识别系统通过安装在消防通道附近的监控摄像头,安全通道异常识别系统对安全通道进行24小时不间断的监控。当系统检测到防火门被异常开启或安全通道被堵塞时,会立即启动警告机制,通过声音、灯光等方式提醒相关人员进行处理。同时,系统还会将异常信息实时传输到监…

creator2.4.5 astc问题排除

最近将creator2.4.5 发布web版本, 需要将所有的图片转astc, 但是不能无脑转, 需求去除预乘alpha的图片。 也就是 { "__type__": "cc.Texture2D", "content": "0,9729,9729,33071,33071,1,0,1" }这个content.split(",")[5…

工地施工机械设备识别检测系统

工地施工机械设备识别检测系统基于AI人工智能机器视觉分析识别技术,工地施工机械设备识别检测系统利用现场安装的监控摄像头,通过深度学习和图像识别技术,实现对工地上重型机械车辆的自动识别。这些重型机械车辆包括但不限于挖掘机、推土机、吊车等。一旦系统识别到这些车辆…

山体滑坡泥石流预警监测系统

山体滑坡泥石流预警监测系统基于AI人工智能机器视觉分析识别技术,山体滑坡泥石流预警监测系统通过利用现场监控摄像头,实现了对高危路段山体的实时监测。这种技术不仅取代了传统的人工巡查,提高了工作效率,守护人们的生命安全。山体滑坡泥石流预警监测系统的核心在于其强大…

数据库设计心得-实习空间

数据库设计心得——实习空间 前言 在软件工程导论以及数据库实验课程中,我们学习了如何通过分析业务需求来构建数据库实体对象以及PowerDesigner的使用。最终通过PowerDesigner完成了本项目的数据库概念模型、物理模型的设计。以下是我们团队的数据库设计过程以及一些心得体会…

智启新篇 | 您的专属AI大模型解决方案!

随着汽车智能化程度的不断提升,智能座舱作为汽车的重要组成部分,其功能和复杂度也在不断增加。从多屏交互、增强现实(AR)技术到个性化设置和语音交互,智能座舱为驾驶者提供了前所未有的驾驶体验。然而,这些新技术的引入也使得智能座舱的测试变得更加复杂和困难。在这样的…

团队作业4——项目冲刺-1

团队作业4——项目冲刺信息项 内容课程名称 广工计院计科34班软工作业要求位置 作业要求作业目标 小飞棍团队对需求改进和系统设计进行讨论GitHub链接 GitHub一、团队简介队名:小飞棍队团队成员:姓名 学号罗振烘(组长) 3122004748庄崇立 3122004633李响 3121002802何昌洲 3…

# 学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第8周学习总结

学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第8周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个…

XXL-JOB docker 初始化

一、因为xxl-job 使用的是mysq 数据库,所有在 yaml 文件中,需要优先启动 mysql version: 3 services:mysql:image: mysql:8.0container_name: mysql8restart: alwaysenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: xxl_jobports:- "3307:3306"xxl-job:im…

深度解读AI在数字档案馆中的创新应用:高效识别与智能档案管理

一、项目背景介绍 在信息化浪潮推动下,基于OCR技术的纸质档案电子化方案成为解决档案管理难题的有效途径。该方案通过先进的OCR技术,能够统一采集各类档案数据,无论是手写文件、打印文件、复古文档还是照片或扫描的历史资料,都能实现高效识别。利用文档智能分析技术,我们对…