为什么我们应该切换到Rust
What is RUST? 什么是Rust?
Rust is a programming language focused on safety, particularly safe concurrency, supporting functional and imperative-procedural paradigms. Rust is syntactically similar to C++, but it provides memory safety without using garbage collection.
Rust是一种专注于安全性的编程语言,特别是安全并发,支持函数式和强制过程式范式。Rust在语法上类似于C++,但它提供了内存安全,而不使用垃圾收集。
It achieves this through a system of ownership with a set of rules that the compiler checks at compile time. Though it does not prevent all possible bugs, it guarantees memory safety by ensuring that certain kinds of bugs, like buffer overflows or access to uninitialized memory, are caught during compilation
它通过一个所有权系统和一组编译器在编译时检查的规则来实现这一点。虽然它不能防止所有可能的错误,但它通过确保在编译期间捕获某些类型的错误(如缓冲区溢出或对未初始化内存的访问)来保证内存安全
Rust is safe Rust安全
When we talk about program safety, there are three distinct aspects to consider:
当我们谈论程序安全时,有三个不同的方面需要考虑:
type safety, memory safety, and thread safety.
类型安全、内存安全和线程安全。
Regarding type safety, Rust is a statically typed language. Type checking, which verifies and enforces type constraints, happens at compile time, so the types of variables have to be determined at compile time.
关于类型安全,Rust是一种静态类型语言。类型检查,即验证和强制类型约束,发生在编译时,因此必须在编译时确定变量的类型。
If you do not specify a type for a variable, the compiler will try to infer it. If it is unable to do so, or if it sees conflicts, it will let you know and prevent you from proceeding.
如果你没有为变量指定类型,编译器会尝试推断它。如果它不能这样做,或者如果它看到冲突,它会让你知道并阻止你继续。
In this context, Rust is similar to Java, Scala, C, and C++. Type safety in Rust is very strongly enforced by the compiler, but with helpful error messages. This helps to eliminate an entire class of run-time errors.
在这种情况下,Rust类似于Java,Scala,C和C++。Rust中的类型安全是由编译器强制执行的,但有有用的错误消息。这有助于消除整个一类运行时错误。
Memory safety is, arguably, one of the most unique aspects of the Rust programming language. To do justice to this topic, let’s look at this in detail.
可以说,内存安全是Rust编程语言最独特的方面之一。为了公正地对待这个主题,让我们详细地看看这个。
Mainstream programming languages can be classified into two groups based on how they provide memory management.
主流编程语言可以根据它们提供内存管理的方式分为两组。
The first group 第一组
Comprises languages with manual memory management, such as C and C++.
包括具有手动内存管理的语言,如C和C++。
The second group 第二组
Includes languages with a garbage collector, such as Java, C#, Python, Ruby, and Go.
包括具有垃圾收集器的语言,例如Java、C#、Python、Ruby和Go。
Rust is the first popular language to propose an alternative — automatic memory management and memory safety without garbage collection.
Rust是第一个提出替代方案的流行语言-自动内存管理和内存安全,而无需垃圾收集。
As you are probably aware, it achieves this through a unique ownership model. Rust enables developers to control the memory layout of their data structures and makes ownership explicit. Rust’s ownership model of resource management is modeled around RAII (Resource Acquisition is Initialization) — a C++ programming concept — and smart pointers that enable safe memory usage.
正如你可能知道的,它通过一个独特的所有权模式来实现这一点。Rust使开发人员能够控制其数据结构的内存布局,并使所有权显式。Rust的资源管理的所有权模型是围绕RAII(资源获取是一个C++编程概念)和智能指针来建模的,智能指针支持安全的内存使用。
Rust can also grant temporary access to a value, another variable, or a function. This is called borrowing.
Rust还可以授予对值、另一个变量或函数的临时访问权限。这就叫做借贷。
The Rust compiler (specifically, the borrow checker) ensures that a reference to a value does not outlive the value being borrowed. To borrow a value, the &operator is used (called a reference).
Rust编译器(特别是借用检查器)确保对值的引用不会超过被借用的值。要借用一个值,需要使用&运算符(称为引用)。
References are of two types:
引用有两种类型:
immutable references, &T,
不可变引用,&T,
These references allow sharing but not mutation.
这些引用允许共享,但不允许改变。
mutable references, &mut T
可变引用(&mut T)
These allow mutation but not sharing.
它们允许突变,但不允许共享。
Rust ensures that whenever there is a mutable borrow of an object, there are no other borrows of that object (either mutable or immutable). All this is enforced at compile time, leading to the elimination of entire classes of errors involving invalid memory access.
Rust确保只要有一个对象的可变借用,就没有该对象的其他借用(无论是可变的还是不可变的)。所有这些都是在编译时强制执行的,从而消除了涉及无效内存访问的整个错误类。
To summarize, We can program in Rust without fear of invalid memory access and without a garbage collector. Rust provides compile-time guarantees to prevent the following categories of memory-safety errors:
总之,我们可以在Rust中编程,而不必担心无效的内存访问,也无需垃圾收集器。Rust提供编译时保证,以防止以下类别的内存安全错误:
- Null pointer dereferences, where a program crashes because a pointer being dereferenced is null.
指针解引用,在这种情况下,由于被解引用的指针为空而导致程序崩溃。 - Segmentation faults, where programs attempt to access a restricted area of memory.
分段错误,程序试图访问内存的受限区域。 - Dangling pointers, where a value associated with a pointer no longer exists.
悬挂指针,其中与指针相关联的值不再存在。 - Buffer overflows, due to programs accessing elements before the start or beyond the end of an array. Rust iterators don’t run out of bounds.
缓冲区溢出,由于程序访问数组开始之前或结束之后的元素。Rust迭代器不会越界。 - All variables in Rust are immutable by default, and explicit declaration is required before mutating any variable. This forces developers to think through how and where data gets modified and what the lifetime of each object is.
Rust中的所有变量在默认情况下都是不可变的,在改变任何变量之前都需要显式声明。这迫使开发人员考虑如何以及在何处修改数据,以及每个对象的生命周期是什么。 - Rust’s ownership model handles not just memory management but the management of variables owning other resources, such as network sockets, database and file handles, and device descriptors.
Rust的所有权模型不仅处理内存管理,还管理拥有其他资源的变量,例如网络套接字,数据库和文件句柄以及设备描述符。
The lack of a garbage collector prevents nondeterministic behavior.
缺少垃圾收集器可以防止不确定性行为。
- Match clauses (which are equivalent to Switch statements in other languages) are exhaustive, which means that the compiler forces the developer to handle every possible variant in the match statement. This prevents developers from inadvertently missing out on handling certain code flow paths that might result in unexpected run-time behavior.
Match子句(相当于其他语言中的Switch语句)是穷举的,这意味着编译器强制开发人员处理match语句中的每一个可能的变体。这可以防止开发人员无意中错过处理某些可能导致意外运行时行为的代码流路径。 - The presence of algebraic data types makes it easier to represent the data model in a concise and verifiable manner.
代数数据类型的存在使得以简洁和可验证的方式表示数据模型变得更加容易。
There are many benefits of using Rust for example the type safety and low latency and concurrency however the learning curve for Rust is very steep and there is no custodian support for Rust like Golang has Google.
使用Rust有很多好处,例如类型安全,低延迟和并发性,但是Rust的学习曲线非常陡峭,并且没有像Golang那样的托管人支持Rust。
However it is still a great option to explore when writing Web applications and Rest Services.
但是,在编写Web应用程序和Rest Services时,它仍然是一个很好的选择。
相关文章:
为什么我们应该切换到Rust
What is RUST? 什么是Rust? Rust is a programming language focused on safety, particularly safe concurrency, supporting functional and imperative-procedural paradigms. Rust is syntactically similar to C, but it provides memory safety without usi…...
基于Linux定时任务实现的MySQL周期性备份
1、创建备份目录 sudo mkdir -p /var/backups/mysql/database_name2、创建备份脚本 sudo touch /var/backups/mysql/mysqldump.sh# 用VIM编辑脚本文件,写入备份命令 sudo vim /var/backups/mysql/mysqldump.sh# 内如如下 #!/bin/bash mysqldump -uroot --single-…...
【Altium Designer 20 笔记】隐藏PCB上的信号线(连接线)
使用网络类隐藏特定类型的信号线 如果你想要隐藏特定类型的信号线(例如电源类),你可以首先创建一个网络类。使用快捷键DC调出对象类浏览器,在Net Classes中右击添加类,并重命名(例如为“Power”࿰…...
【Git教程】(九)版本标签 —— 创建、查看标签,标签的散列值,将标签添加到日志输出中,判断标签是否包含特定的提交 ~
Git教程 版本标签(tag) 1️⃣ 创建标签2️⃣ 查看存在的标签3️⃣ 标签的散列值4️⃣ 将标签添加到日志输出中5️⃣ 判断tag是否包含特定的提交🌾 总结 大多数项目都是用 1.7.3.2和 “ gingerbread” 这样的数字或名称来标识软件版本的。在 …...
MemberPress配置和使用会员登录页面
目录 隐藏 创建会员登录页面 编辑登录页面 设计您的登录页面 链接到您的登录页面 创建会员登录页面 要创建MemberPress会员登录页面,您需要做的就是导航到 MemberPress > 设置 > 页面选项卡,然后在页面顶部附近的“MemberPress 登录页面”…...
分享一个预测模型web APP的功能模块和界面的设计
一个临床预测模型web APP功能模块与界面设计 随着医疗技术的不断进步,web APP是临床预测模型在医学领域的应用的重要形式。这里分享一个web APP的设计,手里有医学预测模型的可以尝试将其构建成webAPP,进而在临床实践中体验预测模型带来的便利…...
智慧公厕是智慧城市建设中不可或缺的一部分
智慧城市的数字化转型正在取得显著成效,各项基础设施的建设也在迅速发展,其中智慧公厕成为了智慧城市体系中不可或缺的一部分。作为社会生活中必要的设施,公共厕所的信息化、数字化、智慧化升级转型能够实现全区域公共厕所管理的横向打通和纵…...
leetcode热题100.爬楼梯(从二进制到快速幂)
Problem: 70. 爬楼梯 文章目录 题目思路Code复杂度 题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方…...
使用Docker定时备份数据
文章目录 一、Docker镜像制作二、MySQL数据备份三、Minio数据备份四、数据跨服务器传输五、Nginx日志分割六、Docker启动七、Docker备份日志 一、Docker镜像制作 镜像制作目录 mc下载地址 - rsyncd.conf # https://download.samba.org/pub/rsync/rsyncd.conf.5port 873 uid …...
conda搭建与管理python环境
conda搭建与管理python环境.md Anaconda下载地址Miniconda下载地址Linux下安装1.执行安装2.查看可安装的python版本3.创建环境4.激活环境5.安装python的工具包5.退出环境6.删除指定的环境7.设置默认的环境 Window下安装1.执行安装2.配置环境变量3.检查是否安装成功4.通过conda配…...
获取当前的年、月、日、时、分、秒,并将这些信息用作保存 Excel 文件的前缀
要获取当前的年、月、日、时、分、秒,并将这些信息用作保存 Excel 文件的前缀,你可以使用 Python 的 datetime 模块来获取当前时间,并格式化时间字符串,然后使用 pandas 库将数据保存为 Excel 文件。示例代码: from d…...
Gitlab全量迁移
Gitlab全量迁移 一、背景1.前提条件 一、背景 公司研发使用的Gitlab由于服务器下架需要迁移到新的Gitlab服务器上。Gitlab官方推荐了先备份然后再恢复的方法。个人采用官方的另外一种方法,就写这篇文章给需要的小伙伴参考。 源Gitlab: http://old.mygitlab.com #地…...
Golang ProtoBuf 初学者完整教程:语法
一、编码规范推荐 1、文件名使用小写下划线的命名风格,例如 lower_snake_case.proto 2、使用 2 个空格缩进 3、包名应该和目录结构对应 4、消息名使用首字母大写驼峰风格(CamelCase),例如message StudentRequest { ... } 5、字段名使用小写下划线的风格…...
使用.cc域名的优势
域名注册越来越难了,很多人选择结尾加123、56、365等等数字,总感觉怪怪的。那么能不能选择其他后缀的域名呢?我感觉可以,大部分用户都不会去看域名,只有做技术的会去关注。 使用.cc域名的优势 很多好域名,…...
存储器管理单元MMU概述
在ARM系统中,存储器管理单元MMU主要完成以下工作: ● 虚拟存储空间到物理存储空间的映射。在ARM中采用了页式虚拟存储管理。它把虚拟地址空间分成一个个固定大小的块,每一块称为一页,把物理内存的地址空间也分成同样大小的页。页…...
了解监控易(25):网络拓扑管理,可视化监控网络,快速定位问题
在复杂的网络环境中,快速准确地定位问题、确保网络的稳定运行是至关重要的。监控易的网络拓扑管理功能,正是为了解决这一问题而设计的。该功能通过可视化监控网络,帮助用户迅速把握网络整体状况,快速定位并解决问题。 监控易的网络…...
C#学习笔记10:winform上位机与西门子PLC网口通信_中篇_winform的窗口操作设计、日志的添加使用
今日继续我的C#winform上位机学习之路 这系列笔记的目标是尝试编写一个能够与西门子PLC进行以太网口通信的上位机软件。 文章提供完整代码解释、设计点解释、测试效果图、完整工程下载 本章主要学习:Winform多个窗体的一些操作 、无边框窗体的创建、Combox组件插…...
第14章 大数据与数据科学知识点梳理
第14章 大数据与数据科学知识点梳理(附带页码) ◼ 原则:组织应仔细管理与大数据源相关的元数据,以便对数据文件及其来源和价值进行准确的清单管理。P386 ◼ 大数据:数据量大(Volume)、数据更新…...
FHE全同态加密简介
1. 何为FHE? FHE (Fully homomorphic encryption): 是一种隐私技术,支持直接对密文进行计算,而无需对密文先解密再计算。即,任何第三方或云厂商,都可对敏感信息的密文进行处理,而无需访问密文内…...
【vue】跨组件通信--依赖注入
import { provide,inject } from vue provide:将父组件的数据传递给所有子组件(子孙都有)inject:接收provide 项目文件结构 App.vue是Header.vue的父组件,Header.vue是Nav.vue的父组件 传值过程 App.vue <tem…...
Aritest+python+Jenkins解放双手iOS/Android自动化
ARITest、Python 和 Jenkins 可以结合在一起创建一个自动化测试解决方案,实现持续集成和持续测试的目标。以下是三者如何协同工作的基本概念: 1. **ARITest**: ARITest 是一款功能全面的自动化测试工具,提供 UI 自动化、接口自…...
Problem #7 [Medium]
This problem was asked by Facebook. Given the mapping a = 1, b = 2, … z = 26, and an encoded message, count the number of ways it can be decoded. For example, the message ‘111’ would give 3, since it could be decoded as ‘aaa’, ‘ka’, and ‘ak’. Y…...
MySQ数据库: MySQL数据库的安装配置 ,图文步骤详细,一篇即可完成安装完成! MySQL数据库如何与客户端连接
LiuJinTao: 2024年4月14日 文章目录 MySQL的安装配置1. 下载2. 安装 三、 MySQL 启动与停止1. 第一种 方式:2. 第二种方式: 四、MySQL 客户端连接2. 方式二: MySQL的安装配置 1. 下载 官方下载网址:https://www.mysq…...
vue3+vant自动导入+pina+vite+js+pnpm搭建项目框架
vue3vant自动导入pinavitejspnpm搭建项目框架 文章目录 vue3vant自动导入pinavitejspnpm搭建项目框架1. 安装pnpm(如果还没有安装):2. 创建项目目录并进入该目录:3. 初始化项目:4. 安装Vite作为构建工具:5.…...
使用 Axios 处理 AxiosError 的三种常见方法
在使用 Axios 时处理 AxiosError 有几种常见的方法: 使用 try-catch 语句捕获异常: try {const response await axios.get(/api/data);// 处理响应数据 } catch (error) {if (error.response) {// 请求成功但状态码不在 2xx 范围console.log(error.response.data);console.l…...
linux上安装Tomcat
安装Tomcat 安装JDK https://www.oracle.com/java/technologies/downloads/#license-lightbox mkdir -p /usr/java tar xf jdk-11.0.22_linux-x64_bin.tar.gz ln -sv /usr/java/jdk /usr/java/jdk-11.0.22配置环境变量: cat > /etc/profile.d/java.sh <&…...
Ubuntu20.04安装ROS过程记录以及常见报错处理
官网安装步骤如下: http://wiki.ros.org/cn/noetic/Installation/Ubuntu#A.2BXwBZy1uJiMU- 第一个:添加ROS软件源 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-la…...
PaddleOCR 图片日期识别
目录 一 . 获取图片信息种对应坐标区域日期信息 (类型为1:http链接 类型为 2本地图片路径) 二 . ocr图片识别日期信息获取,调用获取图片区域相应位置方法 三 . 如有所需获取rtsp流回放格式 四 . 完整代码如下 (…...
HTML5学习记录
简介 超文本标记语言(HyperText Markup Language,简称HTML),是一种用于创建网页的标准标记语言。 编辑器 下载传送门https://code.visualstudio.com/ 下载编辑器插件 标题 标题通过 <h1> - <h6> 标签进行定义。 …...
提升法律文书起草效率:AlphaGPT 助力律师快速生成诉讼和仲裁文件
法律文书起草对于法律专业人士而言是一项基础而关键的任务。无论是民事、刑事还是行政诉讼,以及仲裁案件,精确的法律文书撰写对于案件的成功至关重要。然而,这一过程往往既耗时又复杂,尤其是在处理复杂的案情和面对当事人难以理解…...
网上购物网站开发的目的/网站优化网站
《完整版MM1排队系统仿真matlab实验报告》由会员分享,可在线阅读,更多相关《完整版MM1排队系统仿真matlab实验报告(9页珍藏版)》请在人人文库网上搜索。1、M/M/1排队系统实验报告一、实验目的本次实验要求实现M/M/1单窗口无限排队系统的系统仿真…...
动态网站开发常用技术/seo网站外包公司
直接上代码,希望大家仔细阅读。方法一:讲sql查询进行分页进行,需要调用几个函数,具体见脚本:1.pager.class.php_conn false || !is_resource($this->_conn)) {warningLog(__METHOD__ . : query sql with no connec…...
网站建设有生意吗/搜索引擎优化排名品牌
Kubernetes 是 Google 基于 Borg 开源的容器编排调度,用于管理容器集群自动化部署、扩容以及运维的开源平台。作为云原生计算基金会 CNCF(Cloud Native Computing Foundation)最重要的组件之一(CNCF 另一个毕业项目 Prometheus &a…...
建公司网站步骤/天津网络推广公司
往期精彩回顾前言 基于上一期的理论知识,我们本期跟大家分享一下如何通过Python和R语言完成Logistic回归分类器的构建。大家都知道,Logistic模型主要是用来解决二元分类问题,通过构建分类器,计算每一个样本为目标分类的概率&#…...
window7 iis建立网站/学电脑培训班
ice internal compiler error...
设计素材网站版权/营销策略是什么意思
torch.cuda.amp.autocast() 是PyTorch中一种混合精度的技术,可在保持数值精度的情况下提高训练速度和减少显存占用。 混合精度是指将不同精度的数值计算混合使用来加速训练和减少显存占用。通常,深度学习中使用的精度为32位(单精度ÿ…...