软件工程师,是时候了解下Rust编程语言了
背景
2024年年初,美国政府发布了一份网络安全报告,呼吁软件开发人员停止使用容易出现内存安全漏洞的编程语言,比如:C和C++,转而使用内存安全的编程语言。这份报告由美国网络空间总监办公室 (ONCD) 发布,旨在落实美国总统拜登的网络安全战略,目标是“保护网络空间的基石”。
内存安全指的是程序在访问内存时,能够避免出现错误和漏洞,比如:缓冲区溢出、野指针等。Java由于其运行时错误检测机制,被认为是一种内存安全的语言。然而,C和C++允许直接操作内存地址,并且缺乏边界检查,容易出现内存安全问题。
内存安全的语言
内存安全的语言包括:Rust、Go、C#、Java等。这些语言在设计和实现上都注重内存安全,以预防常见的内存相关错误,比如:缓冲区溢出、空指针引用等。
Rust:Rust是一种系统级编程语言,旨在提供内存安全和并发性保证。它使用所有权系统和生命周期规则来确保内存安全,同时保持高性能。Rust特别适用于构建底层系统组件,比如:操作系统、嵌入式系统或网络服务等。
Go:Go是由Google开发的一种静态类型、编译型语言。它内置了内存安全和并发性支持,通过垃圾回收和goroutines(轻量级线程)简化了并发编程。Go语言适用于构建网络服务、分布式系统和云基础设施等。
C#:C#是微软开发的一种面向对象的编程语言,具有内存管理和类型安全的特性。它运行在.NET框架上,通过垃圾回收机制自动管理内存,减少了内存泄漏和空指针引用等问题的风险。C#常用于Windows桌面应用、Web应用和游戏开发等。
Java:Java是一种广泛使用的编程语言,具有跨平台性、内存管理和类型安全的特性。Java通过虚拟机(JVM)和垃圾回收机制来管理内存,使得开发者无需关心内存分配和释放的细节。Java在企业级应用开发、Android应用开发以及大数据处理等领域有着广泛的应用。
这些内存安全的语言通过不同的机制和技术来确保内存的正确使用,从而减少了因内存错误导致的程序崩溃、数据损坏或安全漏洞等问题。然而,每种语言都有其适用的场景和优缺点,开发者在选择时应根据具体需求和项目特点进行权衡。
Rust的优势
相较于C#、Java、Go等其他内存安全的语言,Rust具备多个显著的优势,这些优势使其在软件开发领域脱颖而出。
内存安全:Rust语言的核心设计目标是确保内存安全,它通过所有权系统和借用检查等机制来避免常见的内存错误,比如:空指针和野指针等问题。这种设计使得Rust在编写高性能、安全的并发代码时更加容易。
并发性能出色:Rust提供了出色的并发性能。它支持零成本抽象,使得并发编程更加高效。此外,Rust的所有权模型、借用模型和生命周期模型等特性也使得编写并发程序更加容易。所有这些,使得Rust成为构建并发和多线程应用的理想选择。
高性能:Rust能够提供接近C/C++的性能。它能够直接操作底层硬件并消除运行时开销,从而提供出色的执行效率。这使得Rust成为编写高性能应用程序的优选语言,比如:网络服务器、游戏引擎和图形应用程序等。
生态系统活跃:Rust拥有一个非常活跃的生态系统,其中包括大量的第三方库和工具。这些库和工具覆盖了广泛的开发需求,从基本的数学运算到高级的并发框架,都可在Rust的生态系统中找到。这使得开发者能够更高效地构建复杂的应用程序,而不用重复造轮子。
函数式编程和面向对象编程的结合:Rust支持函数式编程和面向对象编程,这使得开发者能够根据需要灵活选择编程范式。函数式编程的特性(比如:不可变性和高阶函数)有助于提高代码的可读性和可维护性,而面向对象编程的特性(比如:封装和继承)则有助于构建复杂的软件结构。
包管理和构建工具完善:Rust提供了良好的包管理和构建工具(比如:Cargo),可以方便地管理项目依赖、进行版本控制和自动化构建。这降低了项目管理的复杂性,大大提高了开发效率。
Rust的所有权系统
Rust的内存安全特性主要体现在其所有权系统和生命周期管理上,这些机制确保了在程序的执行过程中不会发生内存泄漏、空指针引用或数据竞争等问题。在下面的示例代码中,我们展示了Rust的所有权系统和如何自动管理内存。
fn main() {// 创建一个String类型的变量,Rust会为其分配内存let s = String::from("Hello CSDN");// 将s的所有权传递给另一个变量s2let s2 = s;// 此时s已经失去了对内存的所有权,不能再使用s// 如果取消注释下一行,会导致编译错误// println!("{}", s);// 打印s2的值,它现在拥有之前s的内存println!("{}", s2);// 当s2离开作用域时,Rust会自动释放其内存
}
在上面的示例代码中,我们创建了一个String类型的变量s,它包含了一个字符串字面量。然后我们将s的所有权转移给了s2。在Rust中,一旦一个变量的所有权被转移,原来的变量就不能再被使用了。如果尝试使用已经失去所有权的变量(比如:取消注释的那一行代码),编译器会报错。
Rust通过这种方式保证了在任何时候都只有一个所有者可以访问某块内存,从而避免了悬挂指针和双重释放等问题。当s2离开其作用域(main函数的末尾)时,Rust会自动释放s2的内存,不需要程序员显式地调用释放内存的函数。
这种自动内存管理的特性大大减少了由于手动管理内存而引发的错误,是Rust内存安全特性的一个重要体现。当然,Rust还提供了其他机制,比如:借用检查器和生命周期注解等,来进一步确保内存安全。这些机制共同作用,使得Rust能够在提供高性能的同时,也保证了内存安全。
总结
Rust是一种系统级编程语言,专注于提供内存安全和并发性,同时保持高性能。它由Mozilla Research领导开发,并得到了全球开发者的广泛支持和采用。如果你也想系统学习Rust语言,可以订阅专栏《30天拿下Rust》。
相关文章:
软件工程师,是时候了解下Rust编程语言了
背景 2024年年初,美国政府发布了一份网络安全报告,呼吁软件开发人员停止使用容易出现内存安全漏洞的编程语言,比如:C和C,转而使用内存安全的编程语言。这份报告由美国网络空间总监办公室 (ONCD) 发布,旨在落…...

SSL---VPN
文章目录 目录 一.SSL-VPN概述 优点 二.SSL协议的工作原理 三.虚拟网关技术 用户认证方式 本地认证 服务器认证: 证书匿名认证 Web代理 Web-link和Web改写 端口转发 网络扩展(允许UDP协议) 总结 一.SSL-VPN概述 SLL VPN是一种基于HTTPS&am…...
Chrome 跨域问题CORS 分析
先叠个甲,有错误,望沟通指正! 文章目录 1.什么是跨域报错2.为什么postman可以,浏览器访问就不行?根本原因是什么?2.1浏览器是依据什么来报错跨域的? 3.常规解决方案的分析方案1.通过代理解决方案2.被请求的B域的服务端开启Access-Control-Allow-Origin返回头的支持方案3.通…...

GPU性能测试中的张量和矩阵运算
正文共:888 字 7 图,预估阅读时间:1 分钟 前面我们使用PyTorch将Tesla M4跑起来之后(成了!Tesla M4Windows 10AnacondaCUDA 11.8cuDNNPython 3.11),一直有个问题,那就是显存容量的问…...
Linux运维_Bash脚本_编译安装FreeRDP-3.3.0
Linux运维_Bash脚本_编译安装FreeRDP-3.3.0 Bash (Bourne Again Shell) 是一个解释器,负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件,并于 1989 年发布的免费软件,作为 Sh (Bourne Shell) 的替代品。 您可以在 Linux…...
CMake官方教程4--使用表达式生成器
1. 使用表达式生成器产生警告 CMakeList.txt cmake_minimum_required(VERSION 3.15)project(Tutorial VERSION 1.0)add_library(tutorial_compiler_flags INTERFACE) target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)set(gcc_like_cxx "$<COM…...
git for windows
记录,git svn混用,检出代码时出错及解决方案, 执行命令: git svn clone svn_project_url 报错: certificate problem.(R)eject,accept (t)emporarily or accept (p)ermanently 解决: 在弹框中 输入P …...

C++实验 面向对象编程
一、实验目的: 掌握类中静态成员的定义方法,初始化方法,使用方法; 掌握类的友元说明方法,理解友元的使用特点 二、实验内容: 1、编写程序,统计某旅馆住宿客人的总数,要求输入客人…...
VC++ 设置网卡接口MTU大小
在 Windows C/C 之中一共有三种方法可以设置网卡的MTU大小。 方法一: SetIpInterfaceEntry 法 static bool SetInterfaceMtu2(int interface_index, int mtu) noexcept{PIP_ADAPTER_ADDRESSES pAddresses NULL;ULONG ulBufLen 0;GetAdaptersAddresses(AF_UNSPEC…...
dpdk-19.11 对向量指令的使用情况分析
不同向量指令识别关键字 __m128i sse uint64x2_t neon __m256i avx2 __m512i avx512 vector altivec dpdk 向量收发包函数 支持 arm neno 向量收发包函数的 pmd 驱动 bnxt hns3 i40e ixgbe mlx5 virtio 支持 sse 向量收发包函数的 pmd 驱动 axgbe hinic fm10k bnxt i40e …...

使用CIP采集欧姆龙EtherNet/IP从入门到精通
本文将会从以下几个方面介绍 1.CIP是什么 2.EtherNet/IP通信是什么 3.CIP通信报文解析 4.使用CIP常用的方法和功能介绍(UCMM) 5.自己封装了一个类,只要知道标签名称,和数据类型即可读写数据 6.demo展示 1.CIP是什么 CIP通信…...

企业如何高效管理微信里的客户?
对于企业来说,懂得高效管理微信列表的客户是非常重要的一件事,只有把客户管理好了,才能更好地提高客户的满意度和忠诚度,我们的销售业务才能顺利进行。 那么,应该怎样管理才能算是高效管理呢?下面就给大家…...

怎么在windows系统上查看kylinos的md5、sha1、sha256值
背景 当前信创行业正如火如荼进行中,当下载kylinos镜像到windows系统下,如何核对镜像是否有损坏,确保文件不被篡改,需要使用工具计算md5、sha1、sha256、sha512值,并与出库邮件中的md5比对。 QuickHash GUI软件简介 QuickHash GUI是一款开源代码的哈希工具,注意哈希能够…...

Windows中在C#中使用Dapper和Mysql.Data库连接MySQL数据库
Windows中在C#中使用Dapper和Mysql.Data库连接MySQL数据库 在Windows中使用C#连接Mysql数据库比较简单,可以直接使用MySql.Data库,目前最新版本为:8.3.0。 当然也可以结合MySql.Data和Dapper库一起使用,目前Dapper的最新版本为&a…...

大一专科,物联网专业,变态成长偏方!
最近看到一个大一,物联网专业的学生提问: 印象中,物联网专业2011年才有的,正好是我毕业那年。 我大概看过物联网专业要学的内容,总结下来就是,比软件不如计算机,比硬件知识不如电子。 不知道老师…...

MyBatis入门(JDBC规范,MyBatis,连接池,Lombok)【详解】
目录 一、JDBC规范【了解】 1. JDBC介绍 2. JDBC示例 3. JDBC的问题 二、MyBatis入门【重点】 1. Mybatis是什么 2. Mybatis使用步骤 3. Mybatis入门案例 1.创建SpringBoot工程 2.创建Mapper 3.功能测试 三、连接池【了解】 1. 什么是连接池 2. 有哪些数据库连接池…...

Vue3--数据和方法
data 组件的 data 选项是一个函数。Vue 在创建新组件实例的过程中会自动调用此函数。 data选项通常返回一个对象,然后 Vue 会通过响应性系统将其包裹起来,并以 $data 的形式存储在组件实例中。 <!DOCTYPE html> <html lang"en"&g…...

网络编程面试题
一、什么是IP地址 1.IP地址是主机在网路中的唯一标识,,当主机从一个网络切换到另一个网络时,会更改IP地址,同样的IP地址也是路由器进行路由选择的标识 2.IP地址的分类 IPV4:采用4字节无符号整数存储 IPV6ÿ…...
移动端区分点击和长按
为了适配移动端,图片加入touchstart,touchend,并加了 e.preventDefault() 屏蔽默认菜单。 然而突然发现移动端图片的链接无响应了,PC端没问题。 而且功能需要区分点击和长按。 原生js如何判断移动端的tap,dbltap,lo…...

虚拟环境的激活
(此博客仅用于我记录虚拟环境的激活方法) 虚拟环境的激活命令: venv/Scripts/activate 在F:\git repo\Database-Course-Design 这个文件夹中启动命令行 这个文件夹中含有虚拟环境venv 输入命令venv/Scripts/activate,就得到下面的结果: 此时就激活了虚拟环境&…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...