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

00-Rust前言

        问:为什么要近期想学习Rust?

        答: Rust出来也是有一段时间了,从Microsoft吵着要重构他们的C++"祖传代码"开始,Rust就披着“高效,安全”的头衔。而自己决定要学习Rust,是因为近期发现:涉及工作的部分开源代码也在悄然的发现变化。

        例如:Google在java端用Kotlin改写原有java代码,这个没有什么意外,毕竟Kotlin是Google的亲儿子。但是,最近发现Google也在修改native层的C/C++代码了.....

源码对比: Android 12 VS Android 14

        一图胜千言! Google已经在着手用Rust来替代C/C++的相关实现。同时,听说Linux内核也在用Rust来替代C/C++相关实现...…所以,Rust要学起来!


        Rust 编程语言从根本上讲是一种增强能力的语言:无论你现在正在编写哪种代码,Rust 都能让你走得更远,在比以前更广泛的领域中自信地编程。

        例如,"系统级 "工作涉及内存管理、数据表示和并发的底层细节。传统上,这一编程领域被视为神秘莫测,只有少数经过多年学习才能避开其恶名昭彰的陷阱的人才能涉足。即使是那些实践者,也要小心谨慎,以防他们的代码被利用、崩溃或损坏。

        Rust 打破了这些障碍,消除了旧有的陷阱,并提供了一套友好、完善的工具,帮助你一路前行。需要 "深入 "底层控制的程序员可以使用 Rust 实现这一目标,而不必承担崩溃或安全漏洞的传统风险,也不必学习善变工具链的细节。更妙的是,Rust 语言的设计会引导你自然而然地编写出可靠的代码,并提高速度和内存使用效率。

        已经在使用底层代码的程序员可以使用 Rust 来提升他们的雄心壮志。例如,在 Rust 中引入并行性是一种风险相对较低的操作:编译器会帮你抓住经典错误。你可以在代码中进行更激进的优化。它的表现力和人体工程学足以让 CLI 应用程序、Web 服务器和许多其他类型的代码编写得非常愉快:你将在本书后面的章节中找到这两方面的简单示例。

        使用 Rust 可以培养从一个领域转移到另一个领域的技能:你可以通过编写网络应用程序来学习 Rust,然后将这些技能用于 Raspberry Pi。

        事实证明,Rust 是一种高效的工具,可用于由具备不同系统编程知识水平的开发人员组成的大型团队之间的协作。底层代码容易出现各种微妙的错误,而在大多数其他语言中,只有经验丰富的开发人员通过大量的测试和仔细的代码审查才能发现这些错误。在 Rust 中,编译器扮演着看门人的角色,拒绝编译存在这些难以捉摸的错误(包括并发错误)的代码。通过与编译器并肩作战,团队可以将时间集中在程序逻辑上,而不是追逐错误。

        Rust 是专为那些渴望语言的速度和稳定性的人设计的。所谓速度,既指 Rust 代码的运行速度,也指 Rust 让你编写程序的速度。Rust 编译器的检查通过功能添加和重构来确保稳定性。与之形成鲜明对比的是,在没有这些检查的语言中,遗留代码非常脆弱,开发人员往往不敢修改。通过努力实现零成本抽象,即:高层特性编译成低层代码的速度与手动编写的代码一样快,Rust 致力于让安全代码也成为快速代码

        Rust 还为系统编程领域带来了现代开发人员工具:

  1. Cargo 是随附的依赖关系管理器和构建工具,它能让添加、编译和管理依赖关系变得简单,并在整个 Rust 生态系统中保持一致。
  2. Rustfmt 格式化工具可确保不同开发人员的编码风格保持一致。
  3. Rust 语言服务器支持集成开发环境 (IDE) 集成,可实现代码自动补全和内联错误信息。

附: 公司和 C++ 开发人员如何向 Rust 过渡

        随着软件开发的不断发展,人们开始寻求更安全、更高效的编程语言,这促使许多人开始考虑成熟的 C++ 之外的其他编程语言。Rust 注重内存安全、零成本抽象和并发性,已成为一种引人注目的选择。无论您是 C++ 开发人员,还是正在寻找更安全编程语言的公司,Rust 编程语言都能让您的技术达到新的高度。

        在本指南中,我们将深入探讨 C++ 和 Rust 为何成为业界流行的主流,并比较它们的特点和优势。然后,我们将探讨希望学习 Rust 的 C++ 开发人员的最佳实践,并探讨希望转用 Rust 的公司应遵循的关键提示。

C++ 与 Rust:功能比较

        C++ 和 Rust 是使用最广泛的两种编程语言,虽然新兴的 Rust 正在软件开发领域掀起波澜,但 C++ 绝对经受住了时间的考验。

        分析公司 SlashData 的研究显示,Rust 是目前增长最快的语言,开发人员和公司必须考虑以下问题:为什么 Rust 如此受欢迎?C++ 开发人员如何适应这种不断变化的形势?

        让我们深入探讨一下 C++ 和 Rust 之间的比较,以便更清楚地了解 Rust 为什么会成为许多人的首选:

① 内存安全

        Rust 最根本的优势之一在于其内置的内存安全。由于 Rust 能够执行严格的所有权和借用规则,该语言成功地消除了常见的内存相关故障。Rust 以不易出现内存错误而著称,这也是许多人选择使用 Rust 的重要原因。另一方面,C++ 采用手动内存管理,因此更容易出现缓冲区溢出和空指针引用等与内存相关的错误。

② 语法

        Rust 拥有简洁而现代的语法,并拥有多种现代语言特性,包括模式匹配和类型推断。该语言拥有一个富有表现力的类型系统,能够在编译时识别错误。相比之下,C++ 以其复杂的语法而闻名,这也是一些人不愿意学习它的原因。不过,C++ 拥有大量可以生成简洁代码的语言特性,如:模板和操作符重载

③ 生态系统

        鉴于 C++ 的历史比 Rust 长得多,它拥有更大的生态系统也就不足为奇了。C++ 语言拥有种类繁多的库和框架,所有这些库和框架都得到了 C++ 开发人员庞大社区的精心维护和定期测试。虽然 Rust 生态系统目前还没有 C++ 那么庞大,但它正在迅速发展,可供 Rust 开发人员使用的库和工具数量也在不断增加。

④ 性能

        Rust 和 C++ 都能提供高性能的代码,它们的速度也广受赞誉。C++ 的速度可以超越 Python 和 Java 等其他语言,因为用 C++ 编写的程序可以直接编译成机器代码,在运行时无需任何翻译时间。虽然 C++ 的速度很快,但熟练的 Rust 开发人员通常能比 C++ 开发人员更快地编写代码,这主要归功于该语言的错误预防系统

⑤ 并发性

        Rust 的并发功能采用所有权模型,可防止数据竞争和引用空指针等并发错误,因此既安全又易于使用。C++ 拥有令人印象深刻的并发功能,可以说比 Rust 的并发功能更强大、用途更广泛,但它更容易出现并发错误,而且调试起来也很困难。归根结底,如果您更喜欢使用简单、安全的并发系统,那么 Rust 是更有利的选择。

C++ 开发人员学习 Rust 的最佳实践

        您是一名 C++ 开发人员,现在决定过渡到 Rust :当然,您并不孤单。事实上,根据 2021 年的 Rust 调查,81% 的受访者声称每周都使用 Rust,而上一年调查的这一比例仅为 72%。这些数据表明,Rust 的使用率正在不断增长,而且鉴于这种语言预计在未来会变得更加流行,现在正是开发人员通过学习这种令人兴奋且前景广阔的语言来更新自己技能的大好时机。

        然而,要熟练掌握 Rust 绝非易事,尤其是对于尚未熟悉 Rust 独特功能的 C++ 开发人员来说。以下是 C++ 开发人员在初次学习 Rust 时可能遇到的一些挑战:

        Ⅰ. 陡峭的学习曲线;尽管 Rust 具有一系列有益的特性,但它也以学习曲线陡峭而著称。习惯了 C++ 自由性的开发人员可能会发现很难适应 Rust 的函数式编程概念

        Ⅱ. 没有那么多的库和框架;鉴于 Rust 是一种相对较新的语言,它没有像更传统的语言那样拥有那么多的库和框架,这是可以理解的。不过,习惯于利用各种资源的 C++ 开发人员可能会认为 Rust 的生态系统有限是一个痛点。

        Ⅲ. 所有权和借用;Rust 拥有多种与众不同的特性,其中之一就是它的所有权和借用模型。由于 C++ 开发人员习惯于手动管理内存而不是依赖内存安全,他们可能会发现很难掌握 Rust 的所有权系统。

        然这些常见的挑战一开始可能看起来难以驾驭,但如果你愿意投入时间和精力,学习 Rust 可能会是一次有趣而丰富的经历。学习者遇到磨合期的问题是很正常的,但只要记住 Rust 提供的各种优势,他们就会有信心,过渡到 Rust 的决定将使他们的开发事业受益匪浅并焕发新的活力

        让我们来探讨 C++ 开发人员应遵循的关键最佳实践,以增强他们的 Rust 学习体验:

① 识别 C++ 和 Rust 的相似之处

        找出 C++ 和 Rust 之间的相似之处,可以让学习曲线变得更容易一些。正如我们前面所讨论的,这两种语言之间有很多相似之处,包括语法相似、没有垃圾回收和运行时。从这些方面开始学习,可能会让 C++ 和 Rust 之间的过渡更加顺畅。

② 掌握基础知识

        在深入研究依赖树、借用检查器和生命周期等复杂的 Rust 主题之前,了解该语言的基本功能至关重要。你应该把初始学习的重点放在相对简单的概念上,如 Rust 的语法、数据类型、数字和所有权模型。

        如果你觉得在理解语言基本原理方面需要帮助,请务必在 Rust subreddit 等论坛上联系 Rust 日益壮大的社区成员。

③ 迎接挑战

        虽然学习一门全新的编程语言有时会令人沮丧,但重要的是要接受挑战并享受学习过程。请记住,Rust 越练越简单,一段时间后,你就会开始乐于发现更多有关 Rust 的概念。你还应该感到动力十足,因为学习 Rust 可能会帮助你在开发生涯中取得进步。

④ 充分利用现有资源

        虽然 Rust 缺少像 C++ 那样的大量库和框架,但它仍然拥有大量有用的资源,可以增强你的 Rust 教育。Rust 官方网站上有各种教程和文档,旨在增强你的语言知识,而其活跃的社区论坛则是向经验丰富的 Rust 开发人员寻求帮助的绝佳场所。另一个重要资源是Rust Book,这是一本涵盖初级和高级概念的综合资源,其中的示例和练习可以帮助你进行实践。

⑤ 经常练习编写代码

        坚持练习是学习任何知识的关键,尤其是像 Rust 这样的计算机编程语言。无论是绝对的初学者还是接近流利的程序员,都应该投入大量时间练习编写代码。您可以从简单的小项目开始,然后逐步提高到更复杂的项目。Rust by Practice 是一个测试 Rust 编程技能的好地方,这个平台允许学习者通过练习和项目来锻炼自己的 Rust 能力。


下一篇: 01-开始Rust之旅

相关文章:

00-Rust前言

问:为什么要近期想学习Rust? 答: Rust出来也是有一段时间了,从Microsoft吵着要重构他们的C"祖传代码"开始,Rust就披着“高效,安全”的头衔。而自己决定要学习Rust,是因为近期发现:涉…...

3.conda的使用

anaconda安装 ubuntu 安装conda 系统架构 uname -m打开终端,不启动base conda config --set auto_activate_base falseconda命令使用 1.查看conda版本 conda --version2.查看conda配置环境 conda config --show3.设置镜像 #设置清华镜像 conda config --add…...

IPv6自动隧道---6to4中继

6to4中继 普通IPv6网络需要与6to4网络通过IPv4网络互通,这可以通过6to4中继路由器方式实现。所谓6to4中继,就是通过6to4隧道转发的IPv6报文的目的地址不是6to4地址,但转发的下一跳是6to4地址,该下一跳为路由器我们称之为6to4中继。隧道的IPv4目的地址依然从下一跳的6to4地…...

低代码开发:解锁数字化转型新维度

在信息化浪潮中,企业正面临着前所未有的挑战与机遇。一方面,市场环境瞬息万变,业务需求迭代频繁,对快速应用开发提出了更高要求;另一方面,传统软件开发模式受限于高成本、长周期等瓶颈,难以满足…...

写一个定时备份数据库的脚本,且只保留最近3天

下面是一个备份数据库并只保留最近3天备份的脚本示例,该脚本使用Python编写: import os import datetime import shutil # 更多源码前往获取:www.qqmu.com # 数据库备份目录 backup_dir "/path/to/backupdir"# 数据库名称 databa…...

java常见面试题:请详细解释如何在Java EE应用中添加EJB

在Java EE应用中添加EJB(Enterprise JavaBeans)涉及几个关键步骤。下面是一个详细的解释: 创建EJB项目: 首先,你需要创建一个Java EE项目。这通常通过IDE(如Eclipse、IntelliJ IDEA等)完成&…...

视频监控需求记录

记录一下最近要做的需求,我个人任务还是稍微比较复杂的 需求:需要实现一个视频实时监控、视频回放、视频设备管理,以上都是与组织架构有关 大概的界面长这个样子 听着需求好像很简单,但是~我们需要在一个界面上显示两个厂商的视…...

Self-RAG:通过自我反思学习检索、生成和批判

论文地址:https://arxiv.org/abs/2310.11511 项目主页:https://selfrag.github.io/ Self-RAG学习检索、生成和批评,以提高 LM 的输出质量和真实性,在六项任务上优于 ChatGPT 和检索增强的 LLama2 Chat。 问题:万能L…...

C++基于多态的职工管理系统(附代码下载)

🌈个人主页:godspeed_lucip 🔥 系列专栏:C从基础到进阶 本文配套markdown文件、配套完整程序(vs项目,可直接运行)网盘链接请翻阅至文章最底部获取。 职工管理系统🌏1、管理系统需求…...

Java安全 CC链1分析

Java安全之CC链1分析 什么是CC链环境搭建jdk下载idea配置创建项目 前置知识Transformer接口ConstantTransformer类invokerTransformer类ChainedTransformer类 构造CC链1CC链1核心demo1demo1分析 寻找如何触发CC链1核心TransformedMap类AbstractInputCheckedMapDecorator类readO…...

Miracast手机高清投屏到电视(免费)

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Miracast概述 Miracast是一种无线显示标准,它允许支持Miracast的设备之间通过Wi-Fi直接共享音频和视频内容,实现屏幕镜像或扩展显示。这意味着你可以…...

【elementUI】el-select相关问题

官方使用DEMO <template><el-select v-model"value" placeholder"请选择"><el-optionv-for"item in options":key"item.value":label"item.label":value"item.value"></el-option></…...

【蓝桥杯日记】复盘第一篇——顺序结构

&#x1f680;前言 本期是一篇关于顺序结构的题目的复盘,通过复盘基础知识&#xff0c;进而把基础知识学习牢固&#xff01;通过例题而进行复习基础知识。 &#x1f6a9;目录 前言 1.字符三角形 分析&#xff1a; 知识点&#xff1a; 代码如下 2. 字母转换 题目分析: 知…...

使用 MinIO 和 PostgreSQL 简化数据事件

本教程将教您如何使用 Docker 和 Docker Compose 在 MinIO 和 PostgreSQL 之间设置和管理数据事件&#xff0c;也称为存储桶或对象事件。 您可能已经在利用 MinIO 事件与外部服务进行通信&#xff0c;现在您将通过使用 PostgreSQL 自动化和简化数据事件管理来增强数据处理能力…...

苹果电脑(Mac)的node版本安装以及升降级

在开发过程中&#xff0c;对于不同的开发环境或者较老的项目可能需要切换不同的node版本&#xff0c;此过程会涉及到node版本的升级与降级&#xff0c;安装node版本管理模块n&#xff08;sudo命令&#xff09;。 全局安装n模块 sudo npm install n -g//输入后回车&#xff0c…...

WCP知识分享平台的容器化部署

1. 什么是WCP? WCP是一个知识管理、分享平台,支持针对文档(包括pdf,word,excel等)进行实时解析、索引、查询。 通过WCP知识分享平台进行知识信息的收集、维护、分享。 通过知识创建、知识更新、知识检索、知识分享、知识评价、知识统计等功能进行知识生命周期管理。 wcp官…...

乐意购项目前端开发 #4

一、Home页面组件结构 结构拆分 创建组件 在 views/Home 目录下创建component 目录, 然后在该目录下创建5个组件: 左侧分类(HomeCategory.vue)、Banner(HomeBanner.vue)、精选商品(HomeHot.vue)、低价商品(Homecheap.vue)、最新上架(HomeNew.vue) 引用组件 修改 views/Home…...

最安全的飞行器——飞行汽车

飞行汽车采用旋翼机飞行方式&#xff0c;稳定可靠&#xff0c;保证人身安全&#xff0c;可以垂直起降。旋翼机的稳定性在所有航空器中最高的&#xff0c;旋翼机被国际航空界公认为最安全的飞行器&#xff01;增程器采用斯特林发电机。飞行汽车3D。 固定翼飞机在起飞的时候&…...

java验证ftp地址是否可用

一.前言 在实际开发中我们的业务是我们将订单发到客户的指定的地方, 我们需要验证用户的ftp地址是否真实且有效, 我们根据java程序来进行验证, 步骤和思路应该是. 步骤描述1导入所需要的 java类库(jar包依赖)2创建ftp客户端对象3设置ftp连接服务端的连接参数4建立与ftp的服务…...

多线程(看这一篇就够了,超详细,满满的干货)

多线程 一.认识线程&#xff08;Thread&#xff09;1. 1) 线程是什么1. 2) 为啥要有线程1.3) 进程和线程的区别标题1.4) Java的线程和操作系统线程的关系 二.创建线程方法1:继承Thread类方法2:实现Runnable接口方法3:匿名内部类创建Thread子类对象标题方法4:匿名内部类创建Runn…...

爬虫进阶之selenium模拟浏览器

爬虫进阶之selenium模拟浏览器 简介环境配置1、建议先安装conda2、创建虚拟环境并安装对应的包3、下载对应的谷歌驱动以及与驱动对应的浏览器 代码setting.py配置scrapy脚本参考中间件middlewares.py 附录&#xff1a;selenium教程 简介 Selenium是一个用于自动化浏览器操作的…...

props传值

文章目录 props用于父组件向子组件传递数据&#xff0c;从而实现组件之间的通信。 以下是使用props的详细步骤&#xff1a; 父组件中定义 props&#xff1a; 在父组件中&#xff0c;通过在子组件的标签上添加属性来定义要传递的数据。这些属性就是props。 <!-- ParentCompon…...

IaC基础设施即代码:Terraform 使用for_each 创建DNS资源副本

目录 一、实验 1.环境 2.Terraform 使用 for_each 创建资源副本 &#xff08;DNS&#xff09; 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机系统软件工具备注jia Windows Terraform 1.6.6VS Code、 PowerShell、 Chocolatey 2.Terraform 使用 for_ea…...

dubbo入门案例!!!

入门案例之前我们先介绍一下&#xff1a;zookeeper。 Zookeeper是Apacahe Hadoop的子项目&#xff0c;可以为分布式应用程序协调服务&#xff0c;适合作为Dubbo服务的注册中心&#xff0c;负责服务地址的注册与查找&#xff0c;相当于目录服务&#xff0c;服务提供者和消费者只…...

sm2和aes加解密

引用maven包 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>1.72</version></dependency>2.对报文进行加密后生成签名 {// oristr报文 SECRET_KEY加密密钥String encrypt…...

cv2.findContours报错解决

问题引入 原代码: binary, contours, hierarchy cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) 发生了报错,这是因为我们这里返回了binary, contours, hierarchy三个值 这是opencv2里面的写法,在最新版opencv中只返回2个值 修改 contours, hierarchy c…...

RHEL - 更新升级软件或系统

《OpenShift / RHEL / DevSecOps 汇总目录》 文章目录 小版本软件更新yum update 和 yum upgrade 的区别升级软件和升级系统检查软件包是否可升级指定升级软件使用的发行版本方法1方法2方法3方法4 查看软件升级类型更新升级指定的 RHSA/RHBA/RHEA更新升级指定的 CVE更新升级指定…...

JNPF低代码开发平台总体架构介绍

目录 一、JNPF介绍 二、团队能力 三、技术选型 1.后端技术栈 2.前端技术栈 3.数据库支持 四、JNPF界面示意图 五、开发环境 一、JNPF介绍 JNPF是一款企业级低代码开发平台。基于Springboot、Vue技术&#xff0c;采用微服务、前后端分离架构&#xff0c;基于可视化数据建…...

axios的传参方式

目录 1、data传参 2、使用 params 传递查询参数&#xff1a; 3、使用路径参数传递数据&#xff1a; 在使用 Axios 发送 HTTP 请求时&#xff0c;有三种常见的传参方式&#xff1a;data、params 和路径参数 1、data传参 this.$axios({method: "post",url: "h…...

受电端协议芯片是如何让Type-C接口设备实现快充?

随着科技的不断进步&#xff0c;USB Type-C接口在电子产品中越来越普及。而在这个接口中&#xff0c;Type-c受电端协议芯片起着至关重要的作用。那么&#xff0c;什么是Type-c受电端协议芯片&#xff1f;它又是如何工作的呢&#xff1f;本文将为您揭开Type-c受电端协议芯片的神…...