您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Rust

为什么要学一学 Rust?

时间:2023-12-29 14:41:52  来源:  作者:泡芙玩编程

为什么要学一学 Rust?

来源 | 泡芙玩编程(ID:gh_23284b66d001)

前言

Rust 可能有点难学,但我还是建议去学一学,起码要了解一下它的理念,它是如何做到它所吹的那些特性的,为什么别的语言做不到它做到了,通过学习 Rust 也有可能会改变你之前的一些也许不那么正确的编程方式。哎,也许你会说我平时业务都做不完了,还学这么个破玩意干嘛,工作归工作,生活归生活嘛,但是作为一个有点追求的程序员,起码要学习一门底层系统语言吧,可以开拓自己的视野,跳出自己的一亩三分地也不错啊,啥,你说你不想学这些?那你写代码就是为了混口饭吃,那没事,了解了解也总行吧,不然以后也不知道为什么别人天天在那说这个东西。

社区状况

由 Mozilla 开发的 Rust 在过去几年中已经获得了主流使用。根据 StackOverflow 的 2023 年开发者调查,Rust 连续第 8 年被评为最受开发者喜爱的语言和开发者最想学习的语言,作为一种注重安全、速度和并发的系统编程语言,Rust 可以和 C++媲美性能,但具有现代语言(如 Python/ target=_blank class=infotextkey>Python 或 JAVA)的人体工程学。目前在许多大公司内部都有使用,比如国内字节、华为、VIVO、国外微软、谷歌、亚马逊、DropBox、Cloudflare 等,之前的文章也提到过这些。

废话不多说了,直接说下 Rust 的相关特性吧。

特性

官方鼓吹的它有以下的一些优点:

  • 高性能 API 服务器、分布式系统、高性能机器学习模型、数据科学应用

  • 跨平台桌面应用程序和命令行工具

  • 零成本抽象,Rust 提供不牺牲性能的高水平人体工程学(说人话就是优雅)

  • 保证内存安全,Rust 的严格编译器在编译时可以防止空指针异常,数据竞争等等

  • 无畏并发,Rust 的类型系统和所有权模式可以保证线程安全

  • 健壮的生态系统,Rust 有一个在蓬勃发展的社区

速度与激情

Rust 是高性能的语言,拥有和 C/C++相当的性能。那么它是通过什么来实现这一点的呢?

零成本抽象

Rust 在不牺牲性能的情况下提供抽象。比如,Rust 有可以编译成 for 循环的迭代器并且没有性能损失。这意味着可以在不牺牲速度的情况下编写干净的代码,比如下面这段代码,比你自己手写一个 for 循环并相加要简洁得多:

letv = vec![1, 2, 3];

letsum = v.iter.sum; // 这会编译为 for 循环

口号就是 "高级语句别怕慢,编译之后都一样"

移动语义

Rust 具有移动语义,这意味着值的所有权会在作用域之间进行移动,这可以避免开销比较高的数据复制,比如:

letx = vec![1, 2, 3];

lety = x; // `x` 在这里被移动,并且不能再使用

这里,向量数组被移动到 y 中,而不是复制。注意复制是指数据从一个地方的内存到另一个地方的内存,而移动指的是数据内存没发生改变,只是指向变了。

没垃圾回收

Rust 通过所有权和借用规则提供内存安全,而不是垃圾收集器。这避免了运行时进行垃圾回收的性能损失,可以避免在 JS/Java/Go 等语言里"Stop the world"的情况发生。代码可以在编译时静态保证没有使用后释放错误、悬空指针或数据竞争。

"Stop the world" 意味着在进行垃圾回收时,程序的执行会被短暂暂停以进行内存回收

非常小的运行时

Rust 的运行时非常小,不需要运行时类型信息、虚拟机或垃圾收集器,这就能打包出开销很小的二进制文件,不过有一些场景也是需要用到运行时的,比如动态分发(现在不需要了解,用于在运行时根据传入类型确定调用方法的一种手段)。

安全可靠

Rust 是主打安全的语言,在编译时可以防止一些内存上的错误,这是通过 Rust 严格的借用和所有权规则来实现的。所有权和借用是 Rust 最特殊和最有用的两个概念。所有权意味着 Rust 中的每个值都有一个拥有它的变量,值的所有者负责释放与之关联的资源,当所有者超出范围时,拥有的值将被删除。

当对一个值有不可变或可变的引用时,就会发生借用。对于不可变引用,原始所有者仍然拥有该值,但是借方可以读取它。使用可变引用,借方可以改变值。但是,可变和不可变借用不能共存,并且借用必须在所有者超出作用域范围之前结束。

上面这里有点绕,但是只要记住:"可变不共享,共享不可变,结束前要还" 这句就行了。下面看 2 个例子:

可变不共享,共享不可变

fnmAIn{

letmutx = 5;

lety = &x; // y 从 x 借用一个不可变引用

letz = &mutx; // y 从 x 借用一个可变借用。报错,不能在一个作用域内同时出现可变借用和不可变借用

}

结束前要还

fnmain{

letmutx = 5; // x 是可变的,拥有值 5

lety = &mutx; // y 从 x 借用到一个可变引用

*y += 1; // 通过 y 来增加 x 的值,因为 y 是对 x 的可变引用

println!("x is {}", x); // 打印出了 6

} // y 超出了作用域,结束对 x 的引用

无畏并发

Rust 为并发代码提供了内置支持,这允许 Rust 程序充分利用多核。由于 Rust 的所有权和类型系统,在 Rust 中不可能在编译时出现数据竞争,这就是所谓的“无畏并发”。

多线程usestd::thread;

fnmain{

thread::spawn(|| {

println!("Hello new thread!");

});

}

这会从新的线程里打印“Hello new thread!”,它是和主线程并行的。

线程通信

通道可以让消息在线程之间进行传递

usestd::thread;

usecrossbeam::channel;

fnmain{

let(tx, rx) = channel::unbounded;

thread::spawn(move|| {

tx.send("Hello from thread!").unwrap;

});

letmsg = rx.recv.unwrap;

println!("Got message: {}", msg); // Got message: Hello from thread!

}

这里我们创建了一个不限制大小的通道并生成一个新的线程,该线程在通道上发送消息,在主线程中接收消息并打印它。

共享状态

虽然通道对于消息传递很有用,但有时线程需要访问共享的状态。这可以通过互斥锁来锁定对临界区的访问,这个程序生成 10 个线程,每个线程增加一个共享计数器。通过使用互斥锁,可以确保一次只有一个线程可以访问计数器增加的临界区。

usestd::{

sync::{Arc, Mutex},

thread,

};

fnmain{

letcounter = Arc::new(Mutex::new(0));

letcounters = vec![counter.clone; 10];

forcounter in&counters {

letcounter = counter.clone;

thread::spawn(move|| {

letmutnum = counter.lock.unwrap;

*num += 1;

});

}

forcounter in&counters {

letnum = counter.lock.unwrap;

println!("{}", *num);

}

}

在 C/C++ 中实现并发可要小心翼翼,一不小心就出内存问题了。

完善的工具链

Rust 有一套很好用的工具生态,比 C/C++ 的都要完善,比如:

  • Cargo:类似于 NPM 的 Rust 包管理器和构建工具

  • Rustup:有点类似于 nvm,用来管理 Rust 版本(稳定版,测试版,夜间版)。

  • Rustfmt:类似于 Prettier,代码风格格式化

  • Clippy:类似于 ESLint,Rust 的静态代码分析工具

总结

Rust 是一种现代编程语言,它提供了速度、安全性和并发性。Rust 通过零成本抽象、移动语义、保证内存安全以及最小的运行时实现了与 C 和 C++相当的性能。Rust 编译器严格执行关于所有权、借用和生命周期的规则,可以防止各种错误如悬空指针、使用后释放错误和数据竞争等问题。此外,Rust 还对并发性和并行性有很好的支持,编译器会在编译时防止数据竞争,这可以让你写并发代码时更加从心。

我是一个搞前端的,也在学 Rust。不管怎样,通过学 Rust 还是能够获得比前端这个领域里更多的东西,学一学总没错,实在不行你来了解一下也行嘛。

  1. Rust中的New Type解答了我十多年前的一个疑问

  2. Rust 与 C++:一场现代编程语言的较量

  3. 2024年,Rust和Go学哪个更好?

  4. vivo发布自研操作系统蓝河 (BlueOS),系统框架采用Rust编写

  5. 这些年来 Rust 在前端都干了些啥?



Tags:Rust   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
在Rust中使用Serde的详细指南
在处理HTTP请求时,我们总是需要在一种数据结构(可以是enum、struct等)和一种可以存储或传输并稍后重建的格式(例如JSON)之间来回转换。Serde是一个库(crate),用于高效、通用地...【详细内容】
2024-03-26  Search: Rust  点击:(13)  评论:(0)  加入收藏
Rust 写脚手架,Clap你应该知道的二三事
有感而发最近,在和前端小伙伴聊天发现,在2024年,她们都有打算入局Rust学习的行列。毕竟前端现在太卷了,框架算是走到「穷途末路」了,无非就是在原有基础上修修补补。所有他们想在...【详细内容】
2024-03-11  Search: Rust  点击:(20)  评论:(0)  加入收藏
前端开始“锈化”?Vue团队开源JS打包工具:基于Rust、速度极快、尤雨溪主导
Vue 团队已正式开源Rolldown —— 基于 Rust 的 JavaScrip 打包工具。Rolldown 是使用 Rust 开发的 Rollup 替代品,它提供与 Rollup 兼容的应用程序接口和插件接口...【详细内容】
2024-03-09  Search: Rust  点击:(11)  评论:(0)  加入收藏
Rust中的数据可视化指南
可视化是数据分析和解释的一个关键方面。虽然Rust主要以其性能和安全特性而闻名,但它也为数据可视化提供了强大的工具。在这个全面的指南中,我们将深入研究Rust中的数据可视化...【详细内容】
2024-03-07  Search: Rust  点击:(29)  评论:(0)  加入收藏
如何在Rust中操作JSON,你学会了吗?
sonic-rs ​还具有一些额外的方法来进行惰性评估和提高速度。例如,如果我们想要一个 JSON​ 字符串文字,我们可以在反序列化时使用 LazyValue​ 类型将其转换为一个仍然带有斜...【详细内容】
2024-02-27  Search: Rust  点击:(47)  评论:(0)  加入收藏
记一次Rust内存泄漏排查之旅
在某次持续压测过程中,我们发现 GreptimeDB 的 Frontend 节点内存即使在请求量平稳的阶段也在持续上涨,直至被 OOM kill。我们判断 Frontend 应该是有内存泄漏了,于是开启了排...【详细内容】
2024-02-27  Search: Rust  点击:(12)  评论:(0)  加入收藏
Rust 最受欢迎的这些库
今天分享主题是,关于一些值得注意的 Rust 库,这些库可以根据它们的功能和在编码中的受欢迎程度进行选择。什么是 Rust 库?在 Rust 中,常被称为 “crate” 的库,是一个打包的单元...【详细内容】
2024-02-19  Search: Rust  点击:(50)  评论:(0)  加入收藏
异步Rust:构建实时消息代理服务器
在本文中,我们将深入研究使用Rust构建实时消息代理服务器,展示其强大的并发特性。我们将使用Warp作为web服务器,并使用Tokio来管理异步任务。此外,我们将创建一个WebSocket客户...【详细内容】
2024-02-01  Search: Rust  点击:(57)  评论:(0)  加入收藏
在 Rust 编程中使用泛型
本文的内容将涉及泛型定义函数、结构体、枚举和方法, 还将讨论泛型如何影响代码性能。1.摘要Rust中的泛型可以让我们为像函数签名或结构体这样的项创建定义, 这样它们就可以...【详细内容】
2024-01-09  Search: Rust  点击:(89)  评论:(0)  加入收藏
什么是Rust语言 ,特点是什么,跟其它语言对比有什么优势
什么是RustRust是一种系统编程语言,旨在提供高性能和安全性。它是由Mozilla和其开发社区创建的开源语言,设计目标是在C++的应用场景中提供一种现代、可靠和高效的选择。Rust的...【详细内容】
2024-01-09  Search: Rust  点击:(203)  评论:(0)  加入收藏
▌简易百科推荐
在Rust中使用Serde的详细指南
在处理HTTP请求时,我们总是需要在一种数据结构(可以是enum、struct等)和一种可以存储或传输并稍后重建的格式(例如JSON)之间来回转换。Serde是一个库(crate),用于高效、通用地...【详细内容】
2024-03-26  coding到灯火阑珊  微信公众号  Tags:Rust   点击:(13)  评论:(0)  加入收藏
Rust 写脚手架,Clap你应该知道的二三事
有感而发最近,在和前端小伙伴聊天发现,在2024年,她们都有打算入局Rust学习的行列。毕竟前端现在太卷了,框架算是走到「穷途末路」了,无非就是在原有基础上修修补补。所有他们想在...【详细内容】
2024-03-11  前端柒八九  微信公众号  Tags:Rust   点击:(20)  评论:(0)  加入收藏
Rust中的数据可视化指南
可视化是数据分析和解释的一个关键方面。虽然Rust主要以其性能和安全特性而闻名,但它也为数据可视化提供了强大的工具。在这个全面的指南中,我们将深入研究Rust中的数据可视化...【详细内容】
2024-03-07  coding到灯火阑珊  微信公众号  Tags:Rust   点击:(29)  评论:(0)  加入收藏
如何在Rust中操作JSON,你学会了吗?
sonic-rs ​还具有一些额外的方法来进行惰性评估和提高速度。例如,如果我们想要一个 JSON​ 字符串文字,我们可以在反序列化时使用 LazyValue​ 类型将其转换为一个仍然带有斜...【详细内容】
2024-02-27  前端柒八九  微信公众号  Tags:Rust   点击:(47)  评论:(0)  加入收藏
记一次Rust内存泄漏排查之旅
在某次持续压测过程中,我们发现 GreptimeDB 的 Frontend 节点内存即使在请求量平稳的阶段也在持续上涨,直至被 OOM kill。我们判断 Frontend 应该是有内存泄漏了,于是开启了排...【详细内容】
2024-02-27  OSC开源社区    Tags:Rust   点击:(12)  评论:(0)  加入收藏
Rust 最受欢迎的这些库
今天分享主题是,关于一些值得注意的 Rust 库,这些库可以根据它们的功能和在编码中的受欢迎程度进行选择。什么是 Rust 库?在 Rust 中,常被称为 “crate” 的库,是一个打包的单元...【详细内容】
2024-02-19  码农渔夫  微信公众号  Tags:Rust   点击:(50)  评论:(0)  加入收藏
异步Rust:构建实时消息代理服务器
在本文中,我们将深入研究使用Rust构建实时消息代理服务器,展示其强大的并发特性。我们将使用Warp作为web服务器,并使用Tokio来管理异步任务。此外,我们将创建一个WebSocket客户...【详细内容】
2024-02-01      Tags:Rust   点击:(57)  评论:(0)  加入收藏
在 Rust 编程中使用泛型
本文的内容将涉及泛型定义函数、结构体、枚举和方法, 还将讨论泛型如何影响代码性能。1.摘要Rust中的泛型可以让我们为像函数签名或结构体这样的项创建定义, 这样它们就可以...【详细内容】
2024-01-09  二进制空间安全  微信公众号  Tags:Rust   点击:(89)  评论:(0)  加入收藏
什么是Rust语言 ,特点是什么,跟其它语言对比有什么优势
什么是RustRust是一种系统编程语言,旨在提供高性能和安全性。它是由Mozilla和其开发社区创建的开源语言,设计目标是在C++的应用场景中提供一种现代、可靠和高效的选择。Rust的...【详细内容】
2024-01-09    简易百科  Tags:Rust语言   点击:(203)  评论:(0)  加入收藏
在 Rust 编程中使用多线程
编程语言有一些不同的方法来实现线程,而且很多操作系统提供了创建新线程的 API。Rust 标准库使用 1:1 线程实现,这代表程序的每一个语言级线程使用一个系统线程。1. Rust线程...【详细内容】
2024-01-07  二进制空间安全  微信公众号  Tags:Rust 编程   点击:(77)  评论:(0)  加入收藏
站内最新
站内热门
站内头条