V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wangwen41097468
V2EX  ›  推广

为什么 Rust 编程语言如此流行?如何 3 天快速入门 Rust?建议收藏

  •  
  •   wangwen41097468 · 2021-09-14 22:20:04 +08:00 · 2016 次点击
    这是一个创建于 948 天前的主题,其中的信息可能已经有所发展或是发生改变。

    img

    简介

    Rust 的创建着眼于确保高性能,可与 C 和 C++ 提供的性能相媲美,同时强调代码的安全性,这是其他两种语言的致命弱点。它的效果非常好,以至于 Rust 编程语言现在被包括 Firefox 、Dropbox 和 Cloudflare 在内的知名软件巨头所使用,而且从初创公司到大公司,许多公司都在生产中使用这种技术。

    Rust 越来越受欢迎

    根据对近 65,000 名开发人员进行的 Stack Overflow 开发人员调查 2020,Rust 是最受欢迎的编程语言。它连续第五年获得冠军。

    同样在 2020 年,Linux 内核开发人员提议用 Rust 编写新的 Linux 内核代码。需要明确的是,他们不想重写最初用 C 编写的整个内核,而是想在 Rust 中添加可与现有基础架构一起使用的新代码。不亚于开源操作系统 Linux 之父 Linus Thorvalds 的人物对这个想法表示欢迎,并渴望看到该项目的结果。

    此外,谷歌还计划在将系统编程语言 Rust 支持到 Android 之后,在 Linux 内核中使用 Rust 。整个操作旨在减少安全漏洞。与此同时,微软已经转向 Rust 以减少 Windows 组件中与内存相关的错误。

    Facebook 还与 Rust 建立了更密切的联系,加入了 Rust 基金会,该组织成立于 2021 年,旨在推动 Rust 的发展,使其成为“系统编程及其他领域的主流语言选择”。Facebook 与亚马逊网络服务、谷歌、华为、微软和 Mozilla 一起在某些方面使用 Rust 。

    所有这些都清楚地表明 Rust 在过去几年中一直受到关注。但它是否只是另一种承诺很多但很快就会消失的炒作技术?

    Rust 语言有什么特别之处?

    Rust 是一种静态类型的编程语言,专为性能和安全而设计,尤其是安全并发和内存管理。它的语法类似于 C++ 的语法。它是一个最初由 Mozilla Research 开发的开源项目。2021 年,Rust 基金会已接过火炬,正在推动该语言的发展。

    Rust 解决了 C/C++ 开发人员长期以来一直在努力解决的问题:内存错误和并发编程。这被视为其主要好处。

    当然,有人可能会争辩说现代 C++ 更加强调内存安全(例如通过实现智能指针),但许多问题仍未解决。其中之一是“释放错误后使用”,当程序在指针被释放后继续使用指针时会发生这种情况,例如在释放其引用捕获对象后调用 lambda 函数。

    另一方面,在 Rust 中,你有借用检查器——编译器的一部分,确保引用不会超过它们所引用的数据。此功能可帮助您消除内存违规错误。此类问题是在编译时检测到的,不需要垃圾回收。

    此外,在 Rust 中,每个引用都有一个生命周期,您可以在其中设置该引用有效的范围。这个特性解决了引用不再有效的问题,也将 Rust 与 C 和 C++ 区分开来。

    当您意识到在过去 12 年中 Microsoft 产品中大约 70% 的所有安全漏洞都是内存安全问题时,正确内存管理的重要性就变得显而易见了。Google Chrome 也报告了相同的数字。

    在 Rust 中有两种编写代码的模式:安全 Rust 和不安全 Rust 。Safe Rust 对程序员施加了额外的限制(例如对象所有权管理),从而确保代码正常工作。不安全的 Rust 给了程序员更多的自主权(例如,它可以操作原始的类似 C 的指针),但代码可能会崩溃。

    不安全的 Rust 模式解锁了更多选项,但您需要格外小心以确保您的代码真正安全。为此,您可以将其包装在更高级别的抽象中,以保证抽象的所有使用都是安全的。与其他编程语言一样,应谨慎使用不安全的代码,以避免未定义的行为,并将因内存不安全导致的段错误和漏洞风险降至最低。

    Rust 的双模式模型是其最大的优势之一。另一方面,在 C++ 中,您永远不会知道您编写了不安全的代码,直到您的软件崩溃或安全漏洞出现。

    并发编程更容易

    Rust 还通过在编译时防止数据竞争使编写并发程序变得更容易。当来自不同线程的至少两条不同的指令试图同时访问同一内存位置时,就会发生数据竞争,而其中至少有一条正在尝试写入内容,并且没有同步可以在各种访问之间设置任何特定顺序。未定义对没有同步的内存的访问。

    在 Rust 中,检测到数据竞争。如果给定的对象访问不支持许多线程(即没有用适当的特征标记),则需要通过互斥锁进行同步,该互斥锁将为其他线程锁定对该特定对象的访问。为了确保对对象执行的操作不会破坏它,只有一个线程可以访问它。

    从其他线程的角度来看,对该对象的操作是原子的,这意味着观察到的对象状态始终是正确的,您无法观察到其他线程对该对象执行的操作产生的任何中间状态。Rust 可以检查我们是否对这些对象执行了任何不正确的操作,并在编译时通知我们。

    其他语言采用同步方法,但它们与它们所引用的对象无关。在使用对象之前需要注意锁定对象的是开发人员。例如,在 C 中,编译器允许开发人员编写有缺陷的代码。结果,当程序已经在生产中时会检测到错误 - 或者更糟的是,当有人试图破解它时。

    在 Rust lang 中,许多与并发编程相关的问题(尽管不是全部)都得到了解决,因为它们在编译时立即被发现。

    在 Rust 中编程时需要克服的一些障碍

    当然,并不是所有的玫瑰。Rust 是一项相对较新的技术,因此某些所需的库可能尚不可用。尽管如此,Rust 包库 crates.io 自 2016 年以来一直在快速增长,充满活力的 Rust 开发人员社区是进一步发展的好兆头。

    此外,对于不习惯使用在编译时检测到代码中的错误的语言的开发人员来说,收到许多错误消息可能会很烦人。因此,开发代码的速度不如 Python 等更流行的语言。然而,Rust 的开发人员正在尽最大努力使这些错误消息尽可能地具有信息性和可操作性。

    即使在编码时收到如此多的错误消息可能有点令人恼火,但仍要专注于更大的图景。当您的软件已经投入生产时,在编译时强制执行的内存安全可以防止错误和安全漏洞的发生。在这个阶段纠正它们肯定会花费你的神经和金钱。

    最后但并非最不重要的是,编写 Rust 代码需要更多的努力,因为入门门槛相当高。你需要花一些时间来掌握这门语言。还需要对 C++ 或任何其他面向对象的编程语言有很好的了解。学习曲线绝对不是平坦的。

    但是如果你克服了所有这些障碍,使用 Rust 的好处将是对你努力的最好回报。

    Rust 有什么用

    Rust 已经是一种成熟的技术,用于生产。作为一种系统编程语言,它允许您保持对低级细节的控制。您可以选择是将数据存储在堆栈上(用于静态内存分配)还是在堆上(用于动态内存分配)。这里有必要提一下 RAII ( Resource Acquisition Is Initialization ),这是一个主要与 C++ 相关的代码习惯用法,但也存在于 Rust 中:每次对象超出范围时,都会调用其析构函数并释放其拥有的资源. 您不必手动执行此操作,并且可以防止资源泄漏错误。

    这最终允许更有效地使用内存。Tilde 在他们的 Skylight 产品中使用了 Rust,特别是重写了某些 Java HTTP 端点。这使他们能够将内存使用量从 5GiB 减少到 50MiB 。

    由于 Rust 没有持续运行的垃圾收集器,它的项目可以通过外部函数接口被其他编程语言用作库。对于在保持内存安全的同时确保高性能至关重要的现有项目,这是一个理想的场景。在此类项目中,Rust 代码可以替换软件的某些部分,其中性能起着至关重要的作用,而无需重写整个产品。

    Rust 是一种可以直接访问硬件和内存的低级编程语言,这使其成为嵌入式和裸机开发的绝佳解决方案。您可以使用 Rust 编写操作系统或微控制器应用程序。事实上,有一些写在锈像操作系统:Redox,intermezzOS,QuiltOS,RUX 。正如我在上面提到的,有计划在 Rust 中为 Linux 内核编写新的补充。最初设计该语言的 Mozilla 在其浏览器引擎中使用它。

    高性能和安全性是使 Rust 对开始使用它进行大量数据分析的科学家如此有吸引力的特性。Rust 速度极快,使其成为计算生物学和机器学习的理想选择,在这些领域您需要非常快速地处理大量数据。

    在 CodiLime,我们也在尝试确定 Rust 是否可以在需要高数据吞吐量的网络场景中替代 C 。在我们的 PoC 中,我们使用 DPDK 库(用 C 编写)在 Rust 中构建了一个应用程序,以确保性能同时保持内存安全。

    为什么要使用 Rust

    总而言之,在您的下一个软件项目中采用 Rust 的主要原因包括:

    • 高性能的同时确保内存安全
    • 支持并发编程
    • crates.io 存储库中越来越多的 Rust 包
    • 一个充满活力的社区推动语言的发展
    • 确保向后兼容性和稳定性( Rust 是为未来 40 年设计的)

    3 天快速入门 Rust

    第一天

    阅读官方文档:

    4EArJH.md.png

    环境搭建:

    安装及工具: https://www.rust-lang.org/zh-CN/learn/get-started

    收罗网上各种干货:

    4EAsWd.md.png

    第二天

    推荐电子书籍:

    • 《深入浅出 Rust 》
    • 《 Rust 权威指南》
    • 《 Rust 程序设计语言》
    • 《精通 Rust(第 2 版)》

    第三天

    实战语法学习:( PDF 档下载)

    4EADFe.png

    总结:

    Jay Oster, PubNub 架构师 :

    “除了安全和性能,我们还有:

    • 泛型;
    • 特征;
    • 代数类型;
    • 函数式和命令式范式;
    • 可能是世界上最好的依赖管理和构建工具,实际上解决了‘依赖地狱’问题;
    • 对内嵌文档、测试和性能评测的美妙支持;
    • 一个大的且正在生长的库、抽象、工具生态;
    • 过程宏;
    • 与已有代码的 FFI 交互性;
    • 支持一打平台(更多的在路上!);
    • 对开发者体验是正向的、毋庸置疑的满足。

    Rust 是唯一一个下面所有框框都打勾的语言:

    • 内存安全
    • 类型安全
    • 消除数据竞争
    • 使用前编译
    • 建立(并且鼓励)在零抽象之上
    • 最小的运行时(无停止世界的垃圾搜集器,无 JIT 编译器,无 VM )
    • 低内存占用(程序可以运行在资源受限的环境,比如小的微控制器)
    • 裸金属目标(比如,写一个 OS 内核或者设备驱动,把 Rust 当一个 ‘高层’汇编器使用)”

    Peter Varo:

    “Rust 有一个很香的地方:它像 C 和 C++ 那样底层,因此也具有底层的这些优势(比如,控制、大小、速度等)。同时呢,它又像 Haskell 那样高层,自带令人吃惊的大量功能传承。它还是命令式的,所以容易被大多数人上手。然后它又像 Python 一样灵活,比如,' 鸭子类型( duck-typing )' 的概念出现在编译时(比如,特征限定),然后它又没有陈旧的面向对象模型以及由这个模型导致的各种出名的问题。

    最后但很重要的是,还有一连串的东西被包含进来:精简短小的语法,语言提供的数目不多的特性,标准库及其一致性,高质量的文档的集成,包括对初学者和高级用户都适用的学习材料,这些都是促成因素。”

    这是我自己入门学习 Rust 的经历,我将以上所有涉及的内容存放在我的 Github 项目上了,地址如下:

    [最安全的编程语言] Rust 工程师枕边资料,大牛文章,开源框架,官方文档,视频,推荐书籍,学习干货,大牛语录

    图标

    有需要快速入门 Rust 的小伙伴们,可以我的 github 里下载相关内容。

    4 条回复    2021-12-09 12:51:40 +08:00
    danbai
        1
    danbai  
       2021-09-15 13:27:40 +08:00 via Android
    第二天能看那么多书吗
    Jwyt
        2
    Jwyt  
       2021-09-15 13:30:21 +08:00
    rust 3 天快速入门。。
    xansy
        3
    xansy  
       2021-09-15 20:08:10 +08:00 via Android
    查查是不是量子波动速读的广告😅
    MrBrother
        4
    MrBrother  
       2021-12-09 12:51:40 +08:00 via iPhone
    > 不亚于开源操作系统 Linux 之父 Linus Thorvalds 的人物对这个想法表示欢迎

    .. 这个“人物”的名字也不提一下吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1134 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:42 · PVG 07:42 · LAX 16:42 · JFK 19:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.