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是靠谱的编程语言

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的医院管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

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

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

Kotlin快速入门系列7

Kotlin的数据类、密封类、枚举类 数据类 与Java等语言不同,kotlin创建只包含数据的类时,需要在类名前声明关键字:data。 data class KotlinBean (val brand : String) 在kotlin中,编译器会自动的从主构造函数中根据所有声明的…

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

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

【数据分析】numpy基础第一天

文章目录 前言本文代码:使用jupyter notebook打开本文的代码操作示例步骤1.打开Anaconda Powershell Prompt步骤2.复制代码文件地址步骤3.在Anaconda Powershell Prompt中打开jupyter notebook步骤3.5.解决一个可能的问题步骤4.在浏览器中查看ipynb文件步骤5.运行代…

【STC8A8K64D4开发板】第2-10讲:定时器/计数器

第2-10讲:定时器/计数器 学习目的了解定时器/计数器的概念和区别。掌握STC8A8K64D4定时器/计数器的应用流程及程序设计。 Timer原理 定时器几乎是每个单片机必有的重要外设之一,可用于定时、精确延时、计数等等,在检测、控制领域有广泛应用。…

JAVA多线程并发补充

AQS 是一个抽象父类 全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架。 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁 getSt…

C#学习笔记-反射

前言 反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。 反射的功能很强大,任何复杂抽象的分层架构或者复杂的设计模式均是建立在这些…

前端canvas项目实战——简历制作网站(三)——右侧属性栏(线条宽度样式)

目录 前言一、效果展示二、实现步骤1. 实现线条宽度(strokeWidth)的属性模块2. 实线线条样式(strokeDashArray)的属性模块3. 意料之外的“联动” 三、Show u the code后记 前言 上一篇博文中,我们初步实现了右侧属性栏…

掌握使用 React 和 Ant Design 的个人博客艺术之美

文章目录 前言在React的海洋中起航安装 Create React App安装Ant Design 打造个性化的博客风格通过路由实现多页面美化与样式定制部署与分享总结 前言 在当今数字时代,个人博客成为表达观点、分享经验和展示技能的独特平台。在这个互联网浪潮中,选择使用…

电商API接口接入|电商爬虫实践附代码案例

1.爬虫是什么 首先应该弄明白一件事,就是什么是爬虫,为什么要爬虫,百度了一下,是这样解释的:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追…

二叉搜索树操作题目:二叉搜索树中的插入操作

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:二叉搜索树中的插入操作 出处:701. 二叉搜索树中的插入操作 难度 3 级 题目描述 要求 给定二叉搜索…