软件工程师,是时候了解下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,就得到下面的结果: 此时就激活了虚拟环境&…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
