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.rhkb.cn/news/247399.html

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

相关文章

laravel框架项目对接小程序实战经验回顾

一.对接小程序总结 1.状态转换带来的问题,如下 问题原因:由于status 传参赋值层级较多,导致后续查询是数组但是传参是字符串, 解决方案:互斥的地方赋值为空数组,有状态冲突的地方unset掉不需要的参数 2参…

【数字电子技术课程设计】多功能数字电子钟的设计

目录 摘要 1 设计任务要求 2 设计方案及论证 2.1 任务分析 2.1.1 晶体振荡器电路 2.1.2 分频器电路 2.1.3 时间计数器电路 2.1.4 译码驱动电路 2.1.5 校时电路 2.1.6 整点报时/闹钟电路 2.2 方案比较 2.3 系统结构设计 2.4 具体电路设计 3 电路仿真测试及结…

华为产业链之车载激光雷达

一、智能汽车 NOA 加快普及,L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 (ADAS, Advanced driver-assistance system)分“感知层、决策层、执行层”三个层级,其中感知层是最重要的一环…

初探二分法

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 文章目录 推荐阅读题目解法一解法二 题目 题目:给定一个 n 个元素有序的&#xff0…

Windows 和 Anolis 通过 Docker 安装 Milvus 2.3.4

Windows 10 通过 Docker 安装 Milvus 2.3.4 一.Windows 安装 Docker二.Milvus 下载1.下载2.安装1.Windows 下安装(指定好Docker文件目录)2.Anolis下安装 三.数据库访问1.ATTU 客户端下载 一.Windows 安装 Docker Docker 下载 双击安装即可,安…

面经基础版案例(路由,请求渲染,传参,组件缓存)

文章目录 1.案例效果分析2.配置一级路由(首页,详情)3.配置二级路由4.导航高亮效果5.首页的请求渲染6.传参(查询参数 $ 动态路由)7.详情页渲染8.组件缓存kepp-alive9.总结 1.案例效果分析 2.配置一级路由(首…

IDEA开发使用 thymeleaf 模板$表达式报红波浪线解决方案

系列文章目录 文章目录 系列文章目录后端存值前端取值thymeleaf 后端存值 RequestMapping("/testModelAndView")//使用ModelAndView时返回的方法类型必须是ModelAndViewpublic ModelAndView testModelAndView() {//创建ModelAndView对象ModelAndView mav new Model…

借用GitHub将typora图片文件快速上传CSDN

前情概要 众所周知,程序员大佬们喜欢用typora软件写代码笔记,写了很多笔记想要放到CSDN上给其他大佬分享,但是在往csdn上搬运的时候,图片总是上传出错,一张一张搞有很麻烦,咋如何搞? 废话不多…

java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 解题思路 这道题可以理解为,只能保证块内有序的情况下&#xf…

ArcgisForJs快速入门

文章目录 0.引言1.前端代码编辑工具2.使用ArcgisForJs创建一个简单应用3.切片地图服务图层4.动态地图服务图层5.地图事件 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调用ArcGIS Server的REST API&#xff0c…

探索Viper-适用于GoLang的完整配置解决方案

前言 对于现代应用程序,尤其大中型的项目来说,在程序启动和运行时,往往需要传入许多参数来控制程序的行为,我们可以通过命令行参数,环境变量,配置文件等方式来将参数传递给程序。而Viper库为Golang语言开发…

Flink问题解决及性能调优-【Flink不同并行度引起sink2es报错问题】

最近需求,仅想提高sink2es的qps,所以仅调节了sink2es的并行度,但在调节不同算子并行度时遇到一些问题,找出问题的根本原因解决问题,并分析整理。 实例代码 --SET table.exec.state.ttl86400s; --24 hour,默认: 0 ms …

centos 7安装MySQl

本文参考借鉴:https://cloud.tencent.com/developer/article/2353312,非常赞! 为了避免权限不足的问题,建议切换至root用户进行安装 1.MySQL的清理与安装 查看是否存在MySQL服务 安装mysql之前,需要先看看要安装系…

基于springboot宠物领养系统

摘要 随着社会的不断发展和人们生活水平的提高,宠物在家庭中的地位逐渐上升,宠物领养成为一种流行的社会现象。为了更好地管理和促进宠物领养的过程,本文基于Spring Boot框架设计和实现了一套宠物领养系统。该系统以用户友好的界面为特点&…

选择合适的CRM管理系统,需要满足以下条件

随着数据时代的发展和企业业务的不断扩大,数据的比例开始增加,传统的数据计算方法不再适合现代企业。客户管理已成为企业最重要的组成部分之一,越来越多的企业开始关注客户管理。在crm管理系统上,企业希望通过crm管理系统&#xf…

第一节课,用户管理--后端初始化,项目调通。二次翻工

一、代码下载 网址: 用户管理第一节课,阿里生成代码包-CSDN博客 二、项目步骤,参考从 网址: 一、第一节课,用户管理--后端初始化,项目调通-CSDN博客 从这里开始跟随 (一)、跟随…

爬虫基础-前端基础

Html是骨骼、css是皮肤、js是肌肉,三者之间的关系可以简单理解为m(html)-v(css)-c(js) 浏览器的加载过程 构建dom树 子资源加载-加载外部的css、图片、js等外部资源 样式渲染-css执行 DOM树 ajax、json、xml AJAX 是一种在无需重新加载整个网页的情况下&#xf…

简述云原生基础定义及关键技术

云原生是什么 云原生是面向“云”而设计的应用,因此技术部分依赖于传统云计算的 3 层概念,基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。 例如,敏捷的不可变基础设施交付类似于 IaaS,用来提供计算网络存储等基础资源,这些资源是可编程且不可变的,直…

【Java与网络6】实现一个自己的HTTP浏览器

前面我们讨论了HTTP协议的基本结构和Socket编程的基本原理,本文我们来整个大活:自己实现一个简单的浏览器。 目录 1.主线程循环体 2.readHostAndPort()方法的实现 3.readHttpRequest()方法的实现 4.sendHttpRequest()方法的实现 5.readHttpRespons…

前端性能优化——图片压缩和懒加载

图片压缩 使用第三方工具手动压缩图片使用Webpack工具在打包时自动压缩图片 这里主要介绍第二种方法。 (1)将小于某个大小的图片转化成 data URI 形式(Base64 格式),减少请求数量,但是体积变得更大 modu…