天天看点

基于 Rust 的未来已来!

作者:高级前端进阶

大家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

基于 Rust 的未来已来!

高级前端‬进阶

1.Rust 的现状

在 Stack overflow 2020 调查中,Rust 被选为最受欢迎的编程语言第一名,这要归功于 86% 的开发人员表示他们会继续使用它。 对于语言创造者来说,这并不是什么新鲜事——自 2016 年以来,Rust 一直在调查中获胜。在 Tiobe 指数上,Rust 的受欢迎程度也在上升——9 月份在最受欢迎的语言中排名第 18 位。 它在自己的基于情绪分析的函数式编程语言排名中也没有失败,在最积极的情绪类别中获得第一名。

基于 Rust 的未来已来!

Rust 由前 Mozilla 开发人员 Graydon Hoare 于 2006 年创建,作为 C++ 语言的替代品,Rust 正在开发人员的世界中慢慢地为自己正名。 它现在用于创建网络软件、嵌入式计算机和分布式服务或命令行。 这种受欢迎程度的适当证明使全球巨头微软正在慢慢地从 C++ 语言(由于越来越多的安全问题)转向 Rust。

当程序员有这么多其他语言可以使用时,是什么让 Rust 在程序员中如此受欢迎? 主要原因之一是 Rust 解决了许多在不同语言中可见的问题——以至于一些开发人员说 Rust 的创建者必须考虑到 C++ 中可见的所有潜在问题。 究竟是什么让 Rust 如此独特,值得学习 Rust? 以下是我们认为 Rust 是未来的五个原因。

2.Rust 与其他语言对比

Rust 相对于目前为开发人员所熟知的许多语言都有其优势,让我们一起对比下这些语言。

2.1 Rust 与 C++优势

与 C++ 相比,Rust 会更安全。 Rust 保护它自己的抽象和开发人员所做的抽象,而 C++ 缺乏这两种选择。 C++ 中的特定错误可能导致任意行为,而 Rust 可帮助您专注于真正重要的事情。

C/C++ 仍然被认为是最流行的编程语言之一,但它经常会导致一些问题。 Rust 更容易上手,学习曲线不是很陡峭,Rust 没有像 C++ 中那样的技术负担,具有更容易的并发性,并且性能具有可比性。Rust 允许程序员编写不安全代码,但默认为安全代码(如果您选择加入,您可以使用 unsafe 关键字在 Rust 中编写不安全代码——它默认带有 C++)。

2.2 Rust vs Java

2.3.1 安全

近年来,针对 Java 的安全问题持续升温,安全是平台产品的基础。而 Rust 的语言特质使得其对安全有着与生俱来的优势。当然 Java 也有其解决方案,比如对于漏洞最多的反射问题,可通过 GraalVM 可以生成 Native 代码规避,但该方案尚不成熟

2.3.2 性能

Java 生态可以写出非常高性能的代码,但前提是必须用 NIO 模型。由于 Java 缺乏 Continuations/Fibers 支持,几乎不能实现现代语言都支持的 async/await 的同步化异步编程。因此不可避免会导致代码的组织及可读性降级。Project Loom 项目有希望解决这一问题,但没有具体时间。相较而言,Rust 有着媲美 C++的性能,对异步编程的支持也十分友好

2.3.3 成本

Java 程序对系统资源的占用比较高,即便是使用 JDK9 的 Module 也只能降低一些内存资源的消耗。典型的一个微服务实例(基于 Spring Boot)一般至少需要 200MB 的体积及 500MB 的内存。这对 SaaS 化部署而言还能接受,但如果要本地化部署,一个本产品假定包含 20 多个原子化的微服务,不包含依赖的三方中间件,生产部署至少需要 20G 的内存,这会劝退大量潜在的客户。而 Rust 作为系统级的语言,有着很小的运行时开销,在同等性能下资源的占用会是 Java 的 1/4 左右,并且由于 Rust 的 Cargo 包很好的解决了“dependency hell"问题,所以不同的原子化微服务可以聚合成一个服务,这对 PoC 非常友好

2.3.4 产权保护

Java 的反编译手段很多,目前并没有非常出色的加密/混淆工具,而 Rust 直接编译成可执行代码。通过将核心代码用 Rust 封装可以很好的保护代码安全。

2.3.5 统一

低代码构建时 Webassembly 技术会有比较大的用武之地,而 Rust 是该技术最成熟的开发语言。在前后端统一架构设计上 Rust 也有比较明显的优势

当谈到 Java 时,事实证明这种编程语言比 Rust 慢得多,特别是考虑到在许多场景都与 C 保持同步。 此外,Rust 具有更快的启动时间和更小的内存占用。 Java 使用垃圾回收机制进行内存管理,这会降低性能(尽管值得注意的是它使编程更容易)。

2.3 Rust vs Python

2.3.1 性能

Rust 超越 Python 的一个主要原因是性能。因为 Rust 是直接编译成机器代码的,所以在你的代码和计算机之间没有虚拟机或解释器。

与 Python 相比,另一个关键优势是Rust 的线程和内存管理。虽然 Rust 不像 Python 那样有垃圾回收功能,但 Rust 中的编译器会强制检查无效的内存引用泄漏和其他危险或不规则行为。

2.3.2 内存管理

Python 和大多数现代编程语言一样,被设计成内存安全的。然而 Rust 在内存安全方面却让 Python 望尘莫及,即使没有垃圾回收。

Rust 采用了一种独特的方式来确保内存安全,其中涉及所有权系统和借用检查器(borrow checker)。Rust 的借用检查器确保引用和指针不会超过它们所指向的数据。

2.3.3 错误检查与诊断

与大多数编译语言相比,Rust 因其速度快、内存安全有保证、超强的可靠性、一致性和用户友好性而备受青睐。在编程中,我们已经到了速度开始变得毫不费力的地步。

随着技术的发展,它变得越来越快,试图在更短的时间内做更多的事情,而不需要那么多的权衡。Rust 帮助实现了这一点,同时又不妨碍开发者的工作。当技术试图推动可以实现的边界时,它也会考虑系统的安全性和可靠性,这是 Rust 背后的主要思想。

2.3.4 并行运算

除了速度外,Python 在并行计算方面也有局限性。Python 使用全局解释器锁(GIL),它鼓励只有一个线程同时执行,以提高单线程的性能。这个过程是一个阻碍,因为它意味着你不能使用多个 CPU 核进行密集计算。

2.4 Rust vs Go

Golang 和 rust 的主要区别在于:

  • 性能
  • 并发
  • 内存安全
  • 发展速度
  • 开发者经验

2.4.1 Rust 编译慢但执行快?

谷歌推出了 Go,作为 C++的替代品,它的代码和学习都很简单。Go 提供并允许你利用 Goroutines,通过它,人们可以通过简单地包含 Go 语法来运行函数。

尽管有这些实用的功能和多核 CPU 的支持,Rust 还是占了上风,并且超过了 Go。

因此,Go vs Rust:性能是 Rust 与 Golang 相比得到更多分数的一个特点。这些编程语言都是为了与 C++和 C 语言等效而创建的。然而,在 Rust 与 Go 的比较中,Golang 的开发速度比 Rust 的性能高一些。

虽然 Rust 的输出显示对 Go 有优势,但 Rust 在编译速度上却落后于 Go,因为 Go 在这方面击败了 Rust。

然而,人们并不太在意编译时间,所以总体来说 Rust 是这里的赢家。

2.4.2 并发设计方式 Rust 更简洁?

Golang 支持并发,在这个因素上比 Rust 更有优势。Go 的并发模型允许开发者在不同的 CPU 核心上安装工作负载,从而使 Go 成为一种连贯的语言。

因此,在你运行一个处理 API 请求网站的情况下,Golang goroutines 会要求你把每个请求作为一个子进程来运行。这个过程提高了效率,因为它减少了所有 CPU 核心的任务。

而 Rust 只有一个本地的 await 或 sync 语法。因此,程序员们更喜欢用 Go 的方式来处理并发问题。

2.4.3 两者内存安全,但 Rust 性能胜出

Rust 使用了一个编译时的策略,用零成本的中断来实现内存安全。如果不是内存安全的程序,Rust 将没有能力清除编译阶段。事实上,Rust 的好处在于它提供了内存安全。

Rust 编译器会调查你引用的每一个内存地址和你使用的每个变量,它可以确保程序员不会出现缓冲区溢出。

相比之下,Go 在运行时完全自动化。因此,在编写代码时,开发人员将不必担心删除内存。因此,Golang 和 Rust 都优先考虑了内存安全特性,但在性能的基础上,Golang 存在着数据竞争的可能性。

2.4.4 Rust 的学习曲线比 Go 要陡峭得多?

由于开发 Go 的主要动机是简单和易于使用,因此大多数程序员认为它是一种 "无聊的语言 "或 "简单的语言"。Go 中有限的功能使它非常容易学习和执行。

相反,Rust 带有很高的内存安全特性,使代码更加复杂,程序员的工作效率降低。所有权的概念使得 Rust 语言对许多人来说是一个不理想的选择。Rust 的学习曲线比 Go 要陡峭得多。

3.为什么 Rust 是未来?

3.1 Rust 提高了内存安全性。

困扰开发人员的最大问题之一是内存管理问题, 而且一个更大的问题是编码错误可能会导致安全漏洞。在当今世界,这太危险了。 在大型和流行的网站或应用程序中,数据安全漏洞案例发生的频率远比我们希望的要高, 而这通常是应用程序漏洞或配置错误。

Rust 被认为是内存安全的。 Rust 代码不能有任何空指针、缓冲区溢出或任何其他类型的内存相关错误。 它允许您定义内存的管理方式以及内存中的值的布局方式,在不损失性能的情况下兼顾控制和安全,这些都是 Rust 的重大特性。

提高内存安全性是 Rust 开发人员的主要目标之一,也是该语言最重要的卖点。 他们的代码编译器非常严格,每一个使用到的变量或者内存地址都会被自动检查。 如果发现任何语法错误、空值、空修饰符或内存安全问题,Rust 将不会编译代码并警告不安全代码,以便快速发现和修复问题。 那么它是如何做到的?

在 Rust 中,每个值都有一个“所有权”。 当一个值被传递或返回时,所有权被赋予一个新的范围——并且一次只有一个。 如果值的“所有者”移出范围,则该值将被删除。 这样,Rust 会跟踪内存并自动释放它,从而防止所有错误进入主代码。 这意味着在运行时不会有任何意外! 该系统将在编译时分析内存管理,帮助更快地识别和修复错误,并使垃圾收集变得不必要。

但内存远不止于此。 构建高级系统通常与计算量大的工作和创建大量临时内存有关。 这种卸载会对任何 Java 虚拟机性能产生负面影响,许多编程语言(包括 Scala)根本无法处理它。

然而,Rust 可以。 它支持编写节省内存的代码,无需管理内存或使用诸如闭包之类的方法,以最小或无运行时开销运行,用于实时或嵌入式项目,并可轻松与其他语言或项目集成。

3.2 Rust 的社区不断壮大。

Rust 的社区和库的数量远不及 C++, 但随着 Rust 语言的日益普及,加入 Rust 语言的开发人员和热情人士的数量也在增加。 社区创建的框架、库和开发工具的数量已经接近 57k,并且每天都在增加。

除了不断增长的工具和框架库之外,Rust 还拥有一个活跃而热情的社区。 无论您是需要帮助解决问题还是寻找使用 Rust 的提示和技巧,您都可以访问几个地方。 除了社区聊天和用户论坛,Rust 还有一个活跃的 subreddit 部分。

看看一些新兴社区项目的例子:

  • redox,一个用 Rust 编写的操作系统;
  • cgmath,一个线性代数和计算机图形库;
  • Iron,一个并发网络框架;

3.3 Rust 快速且灵活。

Rust 被认为是一种执行效率很高的语言, 当使用通用代码时,它可以比 Scala 运行得快得多,尤其是在性能关键型任务中。 在某些领域,它的运行速度很可能比 Scala 或 Java 快三倍。 同时,引入和使用外部包很容易,Rust 的 cargo 构建工具使编码变得更加简单。

下面几个因素使 Rust 执行非常快:

  • 它是静态类型和编译的,使编译器可以优化代码以提高速度
  • 它提供特征的静态分派:类似于 C++ 模板,但更简洁
  • 它明确地跟踪变量的所有权。 Rust 不假设任何具有地址的变量都可以随时更改,因此可以在不对代码产生负面影响的情况下进行优化。
  • 它期望变量在默认情况下是不可变的(因此优化更容易)
  • 它提供代数数据类型,也有利于优化
  • 它存储数据没有任何开销,没有运行时或由于缺乏垃圾收集而突然暂停
  • 它提供零成本抽象

Rust 也可以被认为是一种类似于 Rust 的编程语言,但更易于优化,并且具有更简单的高级编程功能。

3.4 Rust 可以广泛使用

如果有一个项目,除了要考虑性能和底层优化的重要性(还有高级 Rust 函数式编程技术)之外,还需要一个安全稳定的执行环境,推荐使用 Rust。Rust 被认为是一种底层语言,适合系统级研发,以及嵌入式和其他性能关键代码。 据信它也可用于 3D 视频游戏。

那么,为什么 Rust 如此受到全世界开发者的喜爱? 首先,它让您编写的代码很可能永远不会出错,因为编译器会检查所有代码。 在编译时在其他编程语言中检测到的问题不会出现在 Rust 中。 它也有利于编写安全省时的抽象,它的安全性几乎消除了使用不变性的需要。

Rust 也被认为是一种用于新兴的、创新的语言,这些场景关心性能、速度和安全性的组合质量。

Rust 是一种流行的加密货币和区块链编程语言, 这是一个很好的选择,因为它易于理解和学习,并且提供了性能和安全性的独特组合,而后者正是开发人员正在苦苦寻找的东西。 Rust 还为这些开发人员提供工具,以更快地开始交付他们的代码。 选择 Rust,加密货币很可能不会崩溃,而且比使用其他编程语言更安全。 在参考资料中,您可以找到使用 Rust 的加密货币列表。

3.5 那些大公司使用 Rust?

尽管 Rust 是一门相对年轻的语言,但在提高编程的安全性和易用性方面,Rust 已经被开发人员公认为是朝着正确方向迈出的一步。 不仅开发人员对 Rust 感兴趣,公司、尤其是主要公司,也已经或计划转向 Rust。 在 5 月份举行的 AllThingsOpen 虚拟会议上,Ryan Levick(微软云开发人员倡导者)解释说,Rust 作为一种语言是“业界正面解决多个问题的最佳机会”。 虽然微软不打算很快停止使用 C++ 编写代码,但它的许多基础设施正在慢慢转向 Rust。

微软并不是唯一一家意识到切换到 Rust 语言潜在好处的公司——使用 Rust 语言的公司包括 Dropbox、Sentry、Amazon 和 Mozilla。

4.结论

看看 Rust 可以提供的所有好处,该语言的受欢迎程度只会越来越高也就不足为奇了。 Rust 解决了一些在开发人员社区中引起许多令人头疼的问题,同时保持了与其他更知名的编程语言相同的性能水平。 由于开发人员和 IT 领域的主要参与者都认识到 Rust 语言的潜力,可以毫不夸张地说 Rust 有一天将成为现代世界中最常用的编程语言之一。

参考资料

https://medium.com/scalac/5-reasons-why-rust-is-the-future-7ac731085339

https://www.reddit.com/r/rust/comments/a93dv8/cryptocurrencies_written_in_rust/

https://www.yisu.com/zixun/601244.html

https://zhuanlan.zhihu.com/p/539487030

https://medium.com/@knoldus/why-rust-for-embedded-development-9f2b827596f9

https://medium.com/@knoldus/why-rust-for-embedded-development-9f2b827596f9

https://medium.com/knoldus/why-rust-what-is-rust-837b32976a01