What is Rust? Why Rust?

news2024/10/7 2:20:57

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 的原因

Below are some of the reasons that Rust will be able to help you become a better programmer - and not just because “Rust is fast and has fearless concurrency”. While that’s still true, we’d like to dig into some of the deeper details.
以下是 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.coloradmin.cn/o/1411934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

<网络安全>《2 国内主要企业网络安全公司概览(二)》

4 北京天融信科技有限公司(简称天融信) 信息内容LOGO成立日期创始于1995年总部北京市海淀区上地东路1号院3号楼北侧301室背景民营企业是否上市天融信[002212]A股市值99亿主要产品网络安全大数据云服务员工规模6000多人简介天融信科技集团(证券代码:0022…

A JSONArray text must start with at 1

A JSONArray text must start with at 1 [character 2 line 1] 起因:String数组转 JSON 后端调用出错 JSONUtil.toList(xx.getTags(), String.class) 数据库对象entity转包装类 方法 ,其中数据库字段tags是String类型,在包装类中想转换为 J…

【idea】idea中编译内存不足(java: java.lang.0ut0fMemoryError: Java heap space)的解决方法

问题 在编译一个较大的idea项目时候,有时候会显示内存不足,导致项目编译失败 原因 编译项目时实际也是启动了jvm进行的,所以需要分配对应的内存大小。 这个大小在idea中有一个默认的配置,大小是700M。 对于一个大型的项目这个大…

大数据Doris(五十九):SQL函数之字符串函数(三)

文章目录 SQL函数之字符串函数(三) 一、​​​​​​​NULL_OR_EMPTY (VARCHAR str)

Redis 高可用之集群

1、简介 在之前的文章里,通过主从复制和哨兵机制实现Redis 高可用架构,但是由于架构比较复杂,难以维护,引入集群架构模式,一个集群可以有多个 master ,一个master 可以有多个slave,集群支持故障…

Unity制作右键菜单(自适应分辨率)

一、需求 右键触发打开菜单,左键在内部可选择选项,左键单击菜单范围外关闭。难点在于屏幕坐标系,鼠标位置,UI位置之间的关系。 二、理论 前置知识: unity中,用RectTransform对象的position.x和position.y表…

nginx详细资料

nginx简介 1、nginx产生 Nginx同Apache一样都是Web服务器。基于REST架构风格,以统一资源描述符(Uniform Resources Identifier ) URI或者统一资源定位符(Uniform Resources Locator)URL作为沟通一句,通过HTTP协议提供各种网络服务…

Vue自定义成功弹窗H5实现类似于小程序的效果

效果图: <div class="father"><div class="success-box" v-if="isSuccess"><img src="../../assets/insure/success-logo.png" alt=""><span>{{ successTitle }}</span></div> </d…

单片机之keil软件环境搭建

简介 Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案&#xff0c;通过一个集成开发环境&#xff08;μVision&#xff09;将这些部分组合在一起。     目前软件对中文的支持不友好&#xff0c;不建议安装网上的一些汉化包…

14.java集合

文章目录 概念Collection 接口概念示例 Iterator 迭代器基本操作&#xff1a;并发修改异常增强循环遍历数组&#xff1a;遍历集合&#xff1a;遍历字符串&#xff1a;限制 list接口ListIteratorArrayList创建 ArrayList&#xff1a;添加元素&#xff1a;获取元素&#xff1a;修…

瑞丽杂志引领潮流,VOSS眼镜概念店开启奢华新纪元

近日&#xff0c;由《瑞丽》杂志社举办的2023第4届瑞丽轻奢品牌大赛&#xff0c;以“轻奢•悦藏”为主题的大赛已圆满结束&#xff0c;VOSS眼镜荣获&#xff1a;2023瑞丽轻奢品牌大赛「轻奢时尚风格奖」&#xff0c;作为眼镜行业唯一获此奖项的品牌&#xff0c;VOSS眼镜对此表示…

仓储管理系统——软件工程报告(详细设计)④

详细设计 一、系统功能模块的划分 根据系统的功能性需求&#xff0c;本文将部队仓库管理系统分为以下六大模块&#xff1a;系统管理模 块、基础数据模块、出入库管理模块、库存管理模块、仓库信息管理模块、作业管理模 块&#xff0c;每个模块内部又分为很多小功能模块&#…

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

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

力扣 | 141. 环形链表

快慢指针的使用&#xff01; import java.util.HashSet; import java.util.Set;public class _141_linked_list_cycle {// 哈希查找// 时间复杂度&#xff1a;O(n)// 空间复杂度&#xff1a;O(n)public boolean hasCycle1(ListNode head) {Set<ListNode> set new HashSe…

2-SAT问题相关理论和算法

前言 SAT 问题简介 SAT是可满足性、适定性(Satisfiability)问题的简称。一般形式为k-适定性问题或k-可满足性问题&#xff0c;简称 k-SAT。 何为布尔可满足性问题&#xff1f;给定一条真值表达式&#xff0c;包含逻辑变量、逻辑与、逻辑或以及非运算符&#xff0c;如&#x…

uniapp app更新

uniapp app更新 这个版本要随之增加&#xff0c;不然刚更新时直接用app, 新包增加的那些页面跳转会有问题&#xff0c;不能跳新的页面 //app更新检测 updataApp(){const that this;uni.showLoading({title:加载中...})plus.runtime.getProperty(plus.runtime.appid, functio…

JS进阶-高阶技巧

深浅拷贝 首先浅拷贝和深拷贝只针对引用类型 • 浅拷贝 开发中我们经常需要复制一个对象。如果直接用赋值会有下面问题&#xff1a; 这好比有同学来pink老师这里拷视频&#xff0c;竟然用的是剪切…气人不 浅拷贝&#xff1a;拷贝的是地址 1. 拷贝对象&#xff1a;Object…

塑料透光率测定仪评估塑料质量

塑料透光率是指光线通过塑料材料的能力&#xff0c;是评估塑料质量的重要指标之一。透光率越高&#xff0c;塑料的质量通常越好。为了确保生产出的塑料制品具有良好的透光性&#xff0c;对塑料透光率的检测非常重要。 一、塑料透光率检测方法 塑料透光率检测通常采用两种方法…

苹果Find My市场需求火爆,伦茨科技ST17H6x芯片助力客户量产

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…

攻防世界WEB新手训练区

view_source 此题我愿称之为网安领域的hello world 查看网页源代码的方式一般有—— 右键->查看网页源代码F12->源代码/来源Ctrlu 随后可以再代码第17行处找到flag&#xff0c;至此迈入网安第一步。可喜可贺&#xff0c;可喜可贺... get_post 考察http的两种请求方式&…