首页 > 其他分享 >QRust(一) 简介

QRust(一) 简介

时间:2024-11-11 13:45:45浏览次数:1  
标签:QRust 调用 Qt 简介 序列化 Rust pack

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())?;  //反序列化获得参数1
            let a2 = de::from_pack(args.pop().unwrap())?;  //反序列化获得参数2
            let 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

标签:QRust,调用,Qt,简介,序列化,Rust,pack
From: https://www.cnblogs.com/dyf029/p/18539531

相关文章

  • 地应力分析平台简介
    一、平台介绍地应力分析平台是由专业团队开发的云平台软件,专为地应力数据的计算、统计、绘图、管理和综合分析而设计。该平台包含多个分析模块,并以插件形式集成了多个适用于地应力数据分析的工具集,极大地提高了地应力数据的处理效率和分析准确性(一站式地应力数据管理与分析)。......
  • 五子棋软件简介及其用法
    本文按照五子棋对弈平台、五子棋单机版软件、五子棋界面+引擎三种模式的顺序介绍。五子棋对弈平台人机对弈 http://wap.lltskb.com/shfw/game/wzq/index.html?eqid=a0cd9efb0000c3ca00000006645b4932 天天象棋里的欢乐五子棋   五子棋单机版软件gomocalc网页......
  • HarmonyOS Device Certificate Kit简介:鸿蒙设备证书的核心功能与应用
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在当今数字化时代,设备安全成为了至关重......
  • 指针简介:欲送你花,先找你家
    从本质上来说,指针(pointer)是一个值为内存地址的变量。它指出指针的两个核心:①指针是一个变量。它具有和其他变量一样的属性:有名、有值、有地址(隶属“三友”集团)。②指针的值是内存地址。这指出了指针区别于其他变量的特殊性,它的值是内存地址。一、指针的命名常用以下两个名......
  • SNI简介
    ServerNameIndication(SNI)是TLS(传输层安全协议)中的一个扩展,允许客户端在建立安全连接时,告诉服务器它要访问的具体主机名(域名)。这个信息通常在SSL/TLS握手过程中被传递,特别是在客户端和服务器之间交换加密信息之前。SNI解决了一个关键的问题:多个域名共享同一个IP......
  • 人工智能--自然语言处理简介
    上一篇:《人工智能模型训练中的数据之美——探索TFRecord》序言:自然语言处理(NLP)是人工智能中的一种技术,专注于理解基于人类语言的内容。它包含了编程技术,用于创建可以理解语言、分类内容,甚至生成和创作人类语言的新作品的模型。在接下来的几章中,我们将会探讨这些技术。此外,现在有......
  • CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro
    说明此文章为转发的,方便日后查看。系统演示环境http://www.cc-admin.top/#/home简介CC-ADMIN前端简介现在市面的上后台管理系统很多,不差你这一个,为啥又来个轮子?答:材料不一样。本轮子的选材是在考察过antv、element之后选择了quasar,前两个很优秀,尤其是antv的外观我特......
  • STM32学习之SPI的简介与使用
    SPI(SerialPeripheralInterface)是一种常用的同步串行通信协议,它被广泛应用于多种电子设备和组件之间的通信。以下是一些SPI常用于连接的设备类型:存储设备:NORFlash:用于存储固件或数据的非易失性存储器。NANDFlash:用于大容量数据存储的非易失性存储器。传感器:加速度......
  • ITM定时器简介(1)
    一、定义ITM定时器是对输入的时钟进行计数,并在计数达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等......
  • 街面环卫算法视频分析服务器流动商贩实时视频流分析边缘计算技术简介
    在当今数字化时代,实时视频流分析已成为推动智能监控、智慧城市和自动驾驶等前沿领域发展的关键技术。它通过深度挖掘视频内容,提供了前所未有的洞察力和即时反应能力。然而,这一技术面临着计算负载高、带宽需求大和对延迟的严格要求等挑战,这些挑战限制了其在传统云计算架构中的应用......