What is Rust? Why Rust?

why Rust?

在这里插入图片描述

目前,Rust 变得越来越流行。然而,仍然有很多人(和公司!)误解了 Rust 的主张价值是什么,甚至误解了它是什么。在本文中,我们将讨论 Rust 是什么以及为什么它是一种可以增强您的技能的良好编程语言。

What is Rust?

简而言之,Rust 是一种多范式、通用目的语言。因此,它目前正在许多领域中使用和试验。来自 Rust 网站:

A language empowering everyone to build reliable and efficient software.
这种语言使每个人都能够构建可靠且高效的软件。

借用检查器(borrow checker) 和所有权(ownership model)模型使其能够保持较低的内存使用量。类型系统与 Rust 的 traits 相结合,提供了某些通常在其他语言中不可能实现的安全保证(例如内存安全)。 Rust 的 crate 管理器 Cargo 也是一个 formatter、linter 和 test runner。 Rust 有一个小型标准库,为您自己的工具提供构建块。这消除了将内容添加到标准库的官僚主义。

Rust 迄今为止历史的简短总结

2006 年,Rust 最初是由当时 Mozilla 的软件开发人员 Graydon Hoare 创建的一个小型业余项目。 2009 年,Mozilla 正式赞助该项目,并于 2015 年 5 月实现稳定版本。此后,微软、亚马逊和 Cloudflare 等许多公司都采用了 Rust。 2022 年 12 月,Linux 内核也开始使用 Rust。该语言在社交媒体上也非常受欢迎,许多 Rust 开发人员在他们的名字中使用了螃蟹表情符号。随着时间的推移,主要开源 Rust 生态系统的增长变得越来越快。该社区非常强大,许多贡献者现在在他们的工作中使用 Rust。

使用 Rust 的原因

以下是 Rust 能够帮助您成为更好的程序员的一些原因 - 不仅仅是因为“Rust 速度快并且无畏并发”。虽然这仍然是事实,但我们想深入研究一些更深入的细节。

Rust 无需尝试即可为您省钱

由于内存占用较低,几乎可以肯定你会通过使用 Rust 来省钱。一个普通的 Java Spring 或 Python Django 应用程序可以在大型应用程序中使用许多 GB 的内存。如果您尚未优化您的应用程序,或者您在某处遇到随机内存泄漏,则尤其如此。使用 Rust,您很可能已经在内存消耗方面领先,无需任何花哨的技巧 - 但如果您需要它们,它们就在那里!不要只相信我们的话。一家公司从 Ruby 切换到 Rust,节省了 87% 的计算成本。您可以在这里找到有关他们如何做到这一点的更多信息。

即使您不打算在生产中直接使用 Rust,您仍然可以在应用程序中使用它。您可以通过使用 Rust 模块然后使用外部函数接口 (FFI) 来完成此操作。虽然这需要您付出一些努力(特别是如果您不熟悉使用 FFI),但它还可以让您处理得更快,从而节省资金。这也允许更加逐步地采用 Rust,这可能更符合您的喜好。当然,您也可以使用 wasm-bindgen 将 Rust 转换为 WASM,这对于任何基于 JavaScript 的应用程序来说都是完美的。

Rust 中的错误处理非常棒

Rust 是一种强制您预先处理错误的语言。大多数 Rust 开发人员都知道,您应该在生产中尽可能避免使用 .unwrap() 。然而,很高兴知道当您准备好时,您可以随时返回并改进错误处理。以下面的语句为例:

thing.use_function_that_can_fail().unwrap();

您可以将其转换为使用模式匹配:

let result = thing.use_function_that_can_fail();

match result {
    Ok(result) => result,
    Err(error) => println!("{error}");
}

这可用于匹配单个错误。同时,您还可以使用 ?号来传播错误:

thing.use_function_that_can_fail()?;

这尝试将错误转换为函数返回的错误类型。这意味着您可以避免展开和模式匹配!有许多软件包可以帮助您改进错误处理,例如 eyreanyhow 。您可以在此处找到有关错误处理的更多信息。

Rust 语法很丑陋

是的,语法很丑陋。然而,习惯new types的语法(无论它们是否丑陋!)通常是一件好事,因为它可以帮助您获得新的视角。这有点类似于学习一门新口语后获得新的视角,因为单词可以起源于何处。文化观念可以影响口语的形成方式。

特别是,模式匹配导致了诸如 let-elseif-let 之类的事情。这是您在其他主流编程语言中看不到的两个语法示例。让我们快速浏览一下这两个操作:

// using let-else
let Ok(some_result) = function_that_can_fail() else {
    return Err("The function failed!");
}

// using if-let
if let Ok(result) = function_that_can_fail() {
    println!("The function succeeded!");
}

如您所见,相当简单。它还避免了我们必须直接使用模式匹配,而是允许我们“匹配” 分支,因为 Rust 是一种面向表达式的语言。

这是因为 Rust 是一种具有高度表现力的语言。通过让自己接触新想法,我们可以学习新的方法来做事,使我们的代码更具可读性或性能更好。许多开发人员甚至从 Rust(或一般的函数式编程)中汲取灵感,并用其他语言实现它们:例如 Result 枚举类型。

Rust 最终也可能成为通向其他功能性编程(“FP”)语言(如 OCaml)的门户。尽管不是最近,Rust 的第一个编译器迭代实际上是用 OCaml 编写的。尽管这两种语言没有正式相互关联,但这两种语言之间有很多相似之处,特别是 Rust 对求和类型(“枚举”)和一般代数数据类型的使用。

Rust 被用在哪?

当然,如果没有使用 Rust 的公司列表,本文就不完整。这里有一些例子。

Cloudflare

Cloudflare 使用 Rust 并不是什么大秘密。 Google 搜索“cloudflare rust”会返回 Oxy,他们的新代理框架。他们还用 Rust 编写了自己的内部代理,称为 Pingora。查看他们的博客还会返回许多与 Rust 相关的文章的搜索结果。最早讨论使用 Rust 进行 Cloudflare 开发的文章是在 2019 年。

1Password

1Password 并不是在向世界大喊他们使用 Rust。然而,一看他们的 GitHub 组织页面就知道他们非常频繁地使用它。他们还通过发布 crates 为 Rust 生态系统做出了贡献。其中之一是 passkey-rs,它是实现 Webauthn Level 3 和 CTAP2 标准的库的集合。

Daimler (Mercedes-Benz)

大约 4 年前,Mercedez-Benz集团的一些内部源代码被泄露。尽管大部分代码都是 C++,但值得注意的是还包含了一些 Rust。此外,该组织的第一个开源贡献是 Rust。大致可以推断,他们很可能一直在使用它。这对于汽车行业的 Rust 来说是一个很好的迹象——即使它不是代码的大部分。

Shuttle

我们的平台也主要是用 Rust 编写的!我们通过使用宏的 Rust 箱来配置运行时和基础设施资源。我们的平台还允许您编写自己的资源宏。虽然我们目前主要支持 HTTP 服务,但我们目前正在考虑升级我们的内部系统,以允许使用原始 TCP、指定 Rust 工具链等功能。

可以在此处找到使用 Rust 的更详尽的公司列表。

不使用 Rust 的原因

尽管 Rust 具有所有优点,但如果您打算采用 Rust,仍然存在一些明显的优势。以下是使用 Rust 时可能导致问题的一小部分内容。

学习曲线陡峭

一旦你真正学会了 Rust,一切都会很顺利。然而,在此之前,请做好应对一些非常不舒服的颠簸的准备。特别是,借用检查器(borrow checker)(尤其是在没有适当关注范围的情况下)可能是一个大问题。您可以使用以下一些快速提示来改善您的 Rust 初始学习体验:

  • 尽可能使用引用。函数还可以将引用作为参数。
  • 当涉及到迭代器时, .iter() 迭代元素引用的向量。如果您想迭代owned元素,您需要使用 .into_iter()
  • 当谈到错误处理时, anyhow 是你的朋友。您还可以使用 thiserror 轻松扩展您自己的错误类型的行为。

生态系统小

Rust 的许多领域都相当强大,特别是在异步和 WebAssembly 方面。然而,由于 Rust 尚未获得普遍的主流采用,一些公司并不积极支持 Rust。此外,许多crate都受到开源劳动力的支配。这并不是说它们维护不善。但由于开源工作之外的义务,有时crate可能需要很长时间才能更新。这是您在采用 Rust 时需要考虑的事情;如果它还不存在,您可能需要自己编写。

部署 Rust

与其他语言相比,部署 Rust Web 服务并不是特别容易。这主要是由于 Rust 缺乏普遍采用。通常,您需要通过 Dockerfile 部署 Rust 程序,设置您自己的 Nginx 代理并添加 SSL 证书(除其他外)。很多,特别是如果这是你第一次这样做。 Shuttle 旨在通过允许单命令部署并让您在代码中声明基础架构来解决这一问题。


原文地址:What is Rust and Why Should You Use It?


更多阅读:

  • 为什么我说Rust是靠谱的编程语言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/356589.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytest单元测试框架

第一章、pytest概述 Pytest is a framework that makes building simple and scalable tests easy. Tests are expressive and readable—no boilerplate code required. Get started in minutes with a small unit test or complex functional test for your application or l…

Linux提权:Docker组挂载 Rsync未授权 Sudo-CVE Polkit-CVE

目录 Rsync未授权访问 docker组挂载 Sudo-CVE漏洞 Polkit-CVE漏洞 这里的提权手法是需要有一个普通用户的权限,一般情况下取得的webshell权限可能不够 Rsync未授权访问 Rsync是linux下一款数据备份工具,默认开启873端口 https://vulhub.org/#/envir…

第九节HarmonyOS 常用基础组件17-ScrollBar

1、描述 滚动条组件ScrollBar,用于配合可滚动组件使用,如List、Grid、Scroll。 2、接口 可包含子组件 ScrollBar(value:{scroller:Scroller, direction?: ScrollBarDirection, state?: BarState}) 3、参数 参数名 参数类型 必填 描述 scrolle…

148基于matlab的带有gui的轮轨接触几何计算程序

基于matlab的带有gui的轮轨接触几何计算程序,根据不同的踏面和轨头,计算不同横移量下面的接触点位置。程序已调通,可直接运行。 148 matlab 轮轨接触 横移量 (xiaohongshu.com)

Android App开发基础(2)—— App的工程结构

本专栏文章 上一篇 Android开发修炼之路——(一)Android App开发基础-1 2 App的工程结构 本节介绍App工程的基本结构及其常用配置,首先描述项目和模块的区别,以及工程内部各目录与配置文件的用途说明;其次阐述两种级别…

【qt】switchBtn

方法1 在qtdesigner中设置按钮图标的三个属性,normal off 、normal on和checkabletrue。 from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5 import uic from switchBtn import Ui_Dialogclass Test(QDialog, Ui_…

如何使用Docker部署火狐浏览器并实现无公网ip远程访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

fastapi报错

初始化报错,非常低级错,扇自己10八张 app FastApi()

Java 集合 02 综合练习+基本数据类型对应的包装类

练习1、 自己写的代码&#xff1a; import java.util.ArrayList; public class practice {public static void main(String[] args) {//定义一个集合ArrayList<String> list new ArrayList<>();list.add("aaa");list.add("bbb");list.add(…

蓝桥杯备战——8.DS1302时钟芯片

1.分析原理图 由上图可以看到&#xff0c;芯片的时钟引脚SCK接到了P17,数据输出输入引脚IO接到P23,复位引脚RST接到P13。 2.查阅DS1302芯片手册 具体细节还需自行翻阅手册&#xff0c;我只截出重点部分 总结&#xff1a;数据在上升沿写出&#xff0c;下降沿读入&#xff0c;…

C# IP v4转地址·地名 高德

需求: IPv4地址转地址 如&#xff1a;输入14.197.150.014&#xff0c;输出河北省石家庄市 SDK: 目前使用SDK为高德地图WebAPI 高德地图开放平台https://lbs.amap.com/ 可个人开发者使用&#xff0c;不过有配额限制。 WebAPI 免费配额调整公告https://lbs.amap.com/news/…

C语言——O / 动态内存管理

一、为什么要有动态内存分配 我们已经掌握的内存开辟⽅式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的⽅式有两个特点&#xff1a; • 空间开辟⼤⼩是固定的。 • 数组在申明的时候&am…

Java - JDBC

Java - JDBC 文章目录 Java - JDBC引言JDBC1 什么是JDBC2 MySQL数据库驱动3 JDBC开发步骤4 具体介绍 引言 思考: 当下我们如何操作数据库&#xff1f; 使用客户端工具访问数据库&#xff0c;手工建立连接&#xff0c;输入用户名和密码登录。编写SQL语句&#xff0c;点击执行…

每日OJ题_算法_前缀和②_牛客DP35 【模板】二维前缀和

目录 二维前缀和原理 ②牛客DP35 【模板】二维前缀和 解析代码 二维前缀和原理 在一维数组前缀和算法的基础上&#xff0c;想到&#xff1a;计算二维数组前缀和&#xff0c;不就和计算一维数组前缀和一样&#xff0c;即计算每一个位置的前缀和就相当于&#xff1a; 此位置的…

微信小程序开发学习笔记《13》WXS脚本

微信小程序开发学习笔记《13》WXS脚本 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读对应官方文档 一、WXS介绍 WXS ( WeiXin Script)是小程序独有的一套脚本语言&#xff0c;结合WXML&#xff0c;可以构建出页面的…

【Java与网络2】:HTTP核心知识与Curl工具

HTTP是当前应用最为广泛的通信协议&#xff0c;我们上网、玩游戏、刷视频、查美食都离不开HTTP协议。当我们做开发的时候&#xff0c; 需要经常和H5、Android、IOS、PC前端等不同团队的同学打交道&#xff0c;大家讨论的核心问题之一就是交互的时候协议怎么定&#xff0c;而这个…

###C语言程序设计-----C语言学习(6)#

前言&#xff1a;感谢老铁的浏览&#xff0c;希望老铁可以一键三连加个关注&#xff0c;您的支持和鼓励是我前进的动力&#xff0c;后续会分享更多学习编程的内容。 一. 主干知识的学习 1. while语句 除了for语句以外&#xff0c;while语句也用于实现循环&#xff0c;而且它…

Android 系统启动流程

依旧是带着问题再去学习 首先&#xff0c;Android是怎么启动的&#xff1f; Android服务是怎么启动的&#xff1f; Android线程是怎么切换的&#xff1f; Android ApplicationThread是怎么创建的&#xff1f; 那么接下来开始分析Android的启动流程 还是一步一图 先画一张流…

day27 回溯算法part3

39. 组合总和 中等 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限…

外汇天眼:Alpha Group International为股票回购计划拨款高达2,000万英镑

Alpha Group International plc&#xff0c;一家为企业和机构提供金融解决方案的公司&#xff0c;宣布计划启动股票回购程序&#xff0c;以购买每股面值为0.2便士的普通股。 该公司已经从其现金储备中拨款高达2,000万英镑用于回购计划。购买的普通股将被保留在公司的资本中。 …