Rust 与 C++:哪个更适合企业使用?

Blog
Author:
Amir KirshAmir Kirsh
Published On:
8月 12, 2024
Estimated reading time:
1 minutes

目录

Rust C++ 都是系统编程语言,可以用于开发软件和软件平台。它们都能够与低级组件进行交互,例如操作系统或微控制器上的固件,也可以用于应用开发的高级别操作。

本博客的读者大概已经非常熟悉 C++,因此无需赘述。然而,深入了解 Rust 可能会很有趣。根据 StackOverflow 的调查Rust 在过去五年中一直是最受欢迎的编程语言。的确,Rust 目前是一个热门话题!

为什么我们要比较 C++ Rust

此时,比较 C++ Rust 有意义吗?Rust 是要取代 C++ 吗?还是它只是让低级编程更容易的工具?随着生态系统和社区的发展,以及更安全代码的吸引力,比较 Rust C++ 确实是值得的。

一个显而易见的问题是,这两种语言哪个更适合企业?这是一个不容易回答的问题,因为企业级软件在多个方面都需要表现良好,包括解决方案在行业中的接受度和支持度。

为什么选择 Rust 语言?

Rust 常被吹捧为 C++ 的竞争语言,在编译时提供内存安全功能,但不像 Java Go 等其他语言那样使用垃圾回收器,从而实现了 C++ 所拥有的运行时确定性、低延迟和高吞吐量。C++ 中的手动内存管理长期以来一直被视为开发者面临的最大挑战之一,但由于只有汇编语言更接近硬件,C++ 的速度极快。Rust 提供了类似的低级操作和高性能,但具有安全模式,可在编译时帮助消除内存错误,防止它们在生产中成为实际问题。

Rust 不仅可以防止内存分段错误或泄漏,还使并发编程变得更容易,因为数据竞争(多个线程同时尝试访问相同内存)可以通过相同的编译时保护来避免。

那么,如果 Rust 如此优秀,为什么我们没有看到大量从 C++ Rust 的转移呢?有什么问题吗?这是一个容易引发激烈讨论的问题。C++ 爱好者和 Rust 推广者之间关于“哪种语言更好”的讨论可能会演变成激烈的争论。而在这样的讨论中,自然没有一个正确的答案。了解两种语言的区别及其受欢迎的原因,有助于从全局角度看问题并做出明智的决定。

Rust 正在积聚势头(但不出意料地,仍然落后于 C++

尽管 Rust 远未普及,但现在有了 Rust 基金会,并且一些企业级公司已经开始在不同程度上使用它。例如,Facebook 加入了 Rust 基金会,将其用于开发的各个方面,并致力于发展 Rust 生态系统;Google 现在支持使用 Rust 构建 Android 操作系统,其理由是它提供了访问低级系统资源的能力,同时提供了优于 C++ 的内存安全保证。其他 Rust 的支持者还包括 MozillaAWS Cloudflare

大多数正在使用 C++ 的企业,如今考虑 Rust 时,并不会抛弃他们的 C++ 代码库,而是探索 Rust 在哪些领域会成为更好的选择。例如,在微软内部可以看到两种语言背后的不同力量。根据微软的 Rylan Levick 的说法,公司正在因为内存安全问题从 C++ 转向 Rust,并且不再认为 C++ 足够安全用于关键任务的基础设施开发。与此同时,微软首席软件开发工程师 Gabriel Dos Reis 在一集 cppcast 中表示,微软以 C++ 为中心,并将继续如此,微软正在尝试 Rust,但据他所知,目前没有任何正在使用 Rust 开发的产品上线。你可以了解更多关于微软选择 Rust 而非 Go 以及他们 Rust 上的实验

另一个关于 C++ Rust 的著名人物是 Linux 的创建者 Linus Torvalds。那些关注 Linus 的人知道,他是一个 C 语言爱好者,并不喜欢 C++,而且 Linux 内核是纯 C 语言(带有一些内联汇编)。在今年早些时候的一次采访中Linus 表示,正在努力评估使用 Rust 作为开发 Linux 内核的支持语言。至于 C++Linus 认为它是一种“糟糕的语言”,并没有解决 C 的任何问题。当然,这在 Slashdot 上引发了热烈的讨论。关于 Linus Rust 的看法,可以在 ZDNet 上的另一次采访中找到更多信息。

C++ 仍然是王者

尽管 Rust 无可否认地受欢迎并引发了兴趣,但 C++ 仍然占据主导地位。在 2021 8 月的 TIOBE 指数中,C 仍然位居榜首,而 C++ 位列第 4 位,截至最新指数,Rust 已从第 27 位跃升至第 24 位。这当然是一个显著的进步,但并没有真正威胁到 C++ 的地位。

当我们回顾 C++ 的起源和流行时,我们会记得,许多开发者从前身 C 过渡到 C++ 主要是因为 C++ 带来的面向对象特性,以及模板泛型编程的强大功能和标准库容器的丰富性,远超 C 提供的选项。

另一个无法反驳的方面是,C++ 拥有出色的支持基础。C++ 的生态系统非常庞大,而此时的 Rust 由于还很年轻,在这方面无法与之竞争。例如,对游戏编程感兴趣的 Rust 开发者可以在“Are we game yet?”找到有趣的资源。然而,他们不会找到像 C++ Unreal Engine 5 那样成熟的东西。简而言之,如果你在 C++ 中试图解决一个问题,那么肯定有很多人在你之前已经尝试过完全相同的事情,所以你很有可能找到一个现成的库来解决这个问题。而在 Rust 领域,我们还没有达到这种程度。

诚然,Rust 的更广泛采用将会带来更多的使用、新的库和框架,并且 Rust 的趋势可能会向上发展。但与此同时,更多的用户也会带来新的需求、新的功能和语言的变化,随着时间的推移,语言会变得更加复杂。Rust 已经有了一些被宣布弃用的语法选项

Rust 的受欢迎度远远低于C++。  

TIOBE Rust 来源:https://www.tiobe.com/tiobe-index 

Rust C++:比较

如往常一样,大多数比较问题的答案都是“视情况而定”,因为每个语言在不同的问题和实现中各有不同。然而,我们将通过逐点分析两种语言来捕捉某些趋势。 

C++ Rust:编译器与平台支持 

C++ Rust 都支持多个平台,包括 Windows 32 位和 64 位架构、Mac Linux。显然,C++ 的编译器 比 Rust 多得多。然而,由于 Rust 编译器基于 LLVM,它支持任何由 LLVM 支持的环境,这是一份很长的列表,例如支持 Rust 在实时的 VxWorks 环境中运行  Rust 项目定义了三个目标支持层级,其中对于第一级别,Rust 项目本身保证全面认证。C++ 标准委员会并不保证这种支持,它也不负责认证编译器或为编译器提供测试平台。  C++ 编译器供应商通常能够很好地遵守 C++ 标准,但你可能会发现一些小故障,特别是在实现新语言特性时。由于 C++ 被广泛使用,编译器实现中的故障通常会很快被报告和修复,尤其是当它们至关重要时。 

建议很简单:如果你的环境不支持 Rust,就不要使用它,尽管大多数相关环境确实支持。 

C++ Rust:学习曲线与开发速度 

Rust 的语法、所有权模型以及 Rust 实现面向对象编程的方式,对于大多数 Rust 新手来说都相当复杂,无论他们是初级程序员还是其他语言的老手。使用 Rust 时的情形也类似,在一开始,开发人员往往难以适应其语法。  C++ 也不是一种容易的语言。然而,大多数从 CJava C# 转过来的开发者会发现 C++ 的基本语法更容易理解。 

尽管如此,Rust 程序员认为,一旦他们克服了学习曲线并掌握了语法,他们发现 Rust 的内存管理和所有权模型能加快开发速度,通过编译错误来消除本来会在运行时出现的问题。 

另一方面,C++ 程序员认为,语言赋予程序员的自由是一种美德,它允许程序员在不受语言限制的情况下自由表达,从而将更多责任留给程序员。 

此外,C++ 程序员还会认为,对于所有权模型,C++ 提供了unique_ptrshared_ptr,同时保留了程序员手中的大部分权力。 

Rust 开发者认为,C++ 的智能指针只是一个基于库的糟糕解决方案,无法与语言内部支持和所有权强制机制相比。这又回到了严格强制执行的讨论,相比非强制性的语言选项,Rust 可能有更陡峭的学习曲线。Rust 程序员欣赏 Rust 的所有权模型,它被强制执行,帮助避免内存相关的错误,而 C++ 程序员则更喜欢手动控制内存的灵活性和自由。 

另一个争论点是开发速度。Rust 严格的编译器检查通常能在编译期间捕捉许多错误,从而减少生产环境中的错误。C++ 的灵活性通常会带来更快的初步开发速度,但如果不加以仔细管理,可能会导致更多运行时问题。 

C++ Rust:性能 

使用任一语言编写的应用程序在延迟和吞吐量方面都具有良好的表现潜力,因为它们是低级语言并且接近硬件运行。两种语言都不依赖垃圾回收器,这不仅提高了性能,还增强了运行时速度的可预测性。例如,Discord 将其一项服务 Go 迁移到 Rust,原因是由内存问题和垃圾回收引起的延迟峰值。

关于每种语言的性能都有不同的基准测试和讨论。任何处理基准测试的人都知道,基准测试可能具有争议性。但当你看到许多相互矛盾的结果时,这通常意味着两种语言都在性能方面具有竞争力,并且都是良好的选择。

你可以在这里看到一个基准示例,以及基准测试的总结。这个博客文章中比较 C++ Rust 的分析也是一个有趣的阅读,它打破了一些神话并深入探讨了两者之间性能差异的问题。

值得指出的是,当 Rust 代码需要进行一些特定的优化时,这些优化会打破所有权模型,那些对自己代码没有错误百分百自信的专家开发人员可能会使用 Rust 的不安全模式,在这种模式下,内存安全网被切断。这在某些情况下是必要的,因为 Rust 编译器基于静态代码分析,非常保守;在实践中,某些情况下无法实现最高级别的优化。从某种意义上说,Rust C++ 在内存管理的复杂性上走了两个不同的方向:C++ 让你不受限制,但允许你使用像智能指针这样的安全控制;而 Rust 则采用更具约束性的语法,但在需要时允许使用不安全代码。两种语言都有实现高性能代码的潜力,因此很难说在一般情况下哪一种在性能上胜出。答案如预期,这取决于具体的代码。

Rust 与 C++:内存安全 

C++ 在如今常用的智能指针的使用上已经走了很长一段路,尽管如此,当你考虑到 Google 发现 Chrome 70% 的严重安全漏洞与内存安全问题有关时,C++ 在这方面还是落后了不少。相反,Rust 的动机是内存安全。从本质上讲,为了避免内存安全与速度之间的权衡,C++ 将内存安全交给开发人员,而 Rust 则有内置的内存安全边界,这些边界可以通过 `unsafe` 代码解除。如果你认为内存安全是 C++ 中的问题,Rust 的内存安全模型是选择它的一个明确理由。似乎有许多 C++ 开发人员认为内存安全在如今的 C++ 中并不是一个重大挑战,即使它是一个挑战,也不足以证明 Rust 的繁琐语法是合理的,尤其是对于 C++ 爱好者来说。

C++ 与 Rust:指针与地址

Rust C++ 都对指针有广泛支持,并且在这两种情况下,智能指针的使用都是首选。当涉及到使用原始指针时,C++ 开发人员主要依赖手动代码审查和静态代码分析工具来查找错误,而在 Rust 中,原始指针不能在不安全块之外使用。不安全块确实是手动审查的主题,尽管有工具可以帮助你进行审查。

C++ 与 Rust:面向对象编程(OOP

尽管面向对象编程(OOP)很受欢迎且被广泛依赖,Rust 并不支持被认为是自然方式的 OOP。你不能在 Rust 中继承结构体,但可以实现一个特质。你可以通过实现特质和 `dyn` 来在 Rust 中实现多态,`dyn` 作用于整个特质,并影响所有在实现该特质的对象上发送的函数调用,使其具有动态性。Rust 的支持者会认为这是多态的正确模型,数据继承不是一个真正的需求,因为你总是可以依赖组合来重用另一种类型。实际上,Rust 允许你使用多态的方式非常简洁,并且在组合(“拥有一个”)与类型接口(“是一个”)之间有明确的分离。C++ 程序员可能会说,Rust OOP 模型的简洁性和纯洁性几乎令人信服,直到我们看到 Rust 代码使用派生宏来模仿继承。总之,Rust C++ 是不同的语言;你总能在其中一种语言中找到你喜欢的东西,也有讨厌的东西,但这取决于个人品味。重要的是要注意,C++ Rust 都有很多真正喜欢它们的程序员(并且通常讨厌另一种语言),因此你不能说其中任何一种语言是糟糕的。

C++ 与 Rust:并发性 

C++ 中的并发是快速且稳健的,并且有许多库可用于 C++ 多线程编程,包括 C++ 标准库 Boost。然而,在线程安全性方面,Rust 的内存安全特性有助于防止与并发相关的问题,例如数据竞争。数据竞争可以说是最糟糕的并发性错误:容易产生且难以定位。然而,Rust 的模型会让你更难共享数据,同时确保不会产生数据竞争。对自己代码充满信心的 C++ 程序员可能会觉得 Rust 的限制在实现多线程应用程序时过于束缚。Rust 程序员则会认为,正是这些充满自信的程序员才最令人担忧:语言的安全检查对于他们来说是必要的,即使这意味着他们必须改变在线程之间共享数据的方式。

Rust 与 C++:社区支持 

两种语言的发展都经过了非常严格和有管理的过程,C++ C++ ISO 委员会控制,Rust Rust 基金会控制。两者都有非常活跃的社区。尽管如此,与 C++ 相比,Rust 还相当年轻,很难与其庞大的基础进行比较。C++ 有更多的论坛、开源项目和 StackOverflow 贡献者。现实情况是,C++ 已经存在了很长时间,开发人员遇到独特问题的几率微乎其微。

一个社区支持差异的例子可以通过比较两个类似的开源项目得出,一个是用 C++ 编写的,另一个是用 Rust 编写的。Beam 是一个用 C++ 编写的开源加密货币项目,实现了 Mimblewimble 区块链协议。Grin 是用 Rust 实现同一协议的另一个项目。两者都在 2019 年初发布。虽然它们是由不同的团队创建的,但由于它们是开源的,它们的发展和进展依赖于社区的支持。但如图所示,C++ 项目 Beam 获得的支持远远大于 Rust 项目 Grin

Grin – 用 Rust 编写,去年提交的活跃度。 

来源: https://github.com/mimblewimble/grin/graphs/commit-activity 

Beam – 用 C++ 编写,去年提交的活跃度。 

来源: https://github.com/BeamMW/beam/graphs/commit-activity 

Rust 与 C++:外部库 

C++ Rust 都有大量的框架和库可供使用。尽管有年龄差距,Rust 已经拥有了庞大的库选择,帮助进行 web 开发、游戏开发、操作系统开发、区块链等。C++ 当然也有自己庞大的库选择,两者都有活跃的支持者和贡献者,似乎你通常可以找到已经为两者中的任何一个实现的常见功能。

Rust 与 C++:包管理与工具

开发人员喜欢 Rust 的另一个原因是包管理。Cargo 是官方的 Rust 包管理器,它与开发人员在 Python JavaScript 中使用的包管理器类似。虽然 C++ 也有一些不错的包管理器可用,比如 Conan,但开发人员指出,它们并不像 Cargo 那样易于使用。总的来说,作为一个年轻的语言,Rust 附带的工具集令人印象深刻并且具有竞争力。尽管 C++ 在为开发人员提供良好工具集方面有些滞后,但它终于开始缩小支持工具的差距。

Rust 与 C++:谁更适合企业?

此时,哪个更适合企业的问题将取决于开发内容和团队的经验。2020 年的 Rust 调查中有一些有趣且相关的事实,包括 40% 的受访者在工作中使用它。在了解到几家上述企业级公司已经在使用它后,这一语言显然不能被忽视。尽管如此,受访者仍然抱怨学习曲线陡峭,急需更好的培训和文档(令人有些意外,因为 Rust 确实有很好的文档),缺乏所需的库,以及将 Rust 完全过渡所需的时间和精力。

很显然,如果可以雇佣更多的 Rust 程序员,Rust 可能会在更广泛的层面上深入企业。到目前为止,Rust 用户今年最大的变化似乎是学习或使用 Rust 的学生人数增加。如果这确实代表了整个社区,那么我们可以预期未来会有更多 Rust 程序员可供雇佣。同时,我们必须记住,目前与 Rust 相比,C++ 代码的维护量要大得多,C++ 程序员的数量也多得多。

结论

C++ Rust 是具有良好支持者和社区支持的系统编程语言。每种语言都有其优缺点,这使得我们很有可能会看到这两种语言长期共存。问题仍然是:C++ 是否会继续占据主导地位,偶尔使用 Rust,或者 C++ 是否会显著失去市场份额给 Rust

此时,可能还为时过早。2020 年的 Rust 调查指出了过去一年中 Rust 在多个领域的改进和受欢迎程度的提高。然而,随着 C++20 的发布和 C++23 的开发,可以放心,C++ 不会轻易消失。至少目前不会。

企业应该为 Rust 做准备吗?当然,会有一些项目可以从中受益。有必要考虑使用 Rust 替代 C++ 吗?目前似乎不太可能。在这场竞赛中,两者都不会停止改进,如果它们之间的互操作性得以实现,那么未来可能会有一段很长的合作与尊重关系。

拓展阅读

一篇不错的关于 Rust C++ 的比较,侧重于语法差异: 

https://www.apriorit.com/dev-blog/520-rust-vs-c-comparison

Reddit 上关于 Rust C++ 的讨论: 

https://www.reddit.com/r/cpp/comments/611811/have_you_used_rust_do_you_prefer_it_over_modern_c

ycombinator 上类似的讨论: 

https://news.ycombinator.com/item?id=24037045

使用 Rust C++ 的行业: 

https://www.efinancialcareers.co.uk/news/2020/09/rust-vs-c-hedge-fund-jobs

使用 Rust 的公司: 

https://serokell.io/blog/rust-companies

关于 Rust C++ 的常见问题 

Rust 会取代 C++ 吗? 

Rust 是否会取代 C++ 这一问题并不简单。每种语言都有其拥护者和强大的社区,以及对不同使用场景具有价值的优势。

Rust 的最新版本是什么? 

Rust 的最新稳定版本是 1.80.0。最新的 Beta 版本是 1.81.0

我应该从 C++ 转向 Rust 吗? 

除非你有特定原因,否则不应该从 C++ 转向 Rust。尽管 Rust 有一些明显的优势,但 C++ 依然因其良好原因而流行,你的改变不应该只是追随趋势。

2024 年我应该学习 C++ 还是 Rust

是否应该在 2024 年学习 C++ Rust 取决于你打算开发什么。两者都是 2024 年开发的好工具,你应该认真考虑将它们之一作为一个很好的起点。