为什么要学一学 Rust?


为什么要学一学 Rust?

文章插图
来源 | 泡芙玩编程(ID:gh_23284b66d001)
前言
【为什么要学一学 Rust?】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 中的每个值都有一个拥有它的变量,值的所有者负责释放与之关联的资源,当所有者超出范围时,拥有的值将被删除 。
当对一个值有不可变或可变的引用时 , 就会发生借用 。对于不可变引用 , 原始所有者仍然拥有该值,但是借方可以读取它 。使用可变引用,借方可以改变值 。但是 , 可变和不可变借用不能共存,并且借用必须在所有者超出作用域范围之前结束 。


推荐阅读