最近经常在网上看到,尤其是你在考虑学习 Rust 是否值得时,我认为这可能是写这篇新文章的绝佳机会,讨论两者之间的差异,以及它们常见的共同点。

相似之处

Rust 和 C++ 都是系统编程语言,这意味着它们可用于编写底层代码,如微控制器的内核和固件。但与 C 相比,它们提供了许多抽象,使之也能达到更高的层次,例如,编写游戏和 Web 应用程序。

另一个相似之处是它们都没有使用垃圾收集器来管理内存,这使得代码更可预测、更高效,并且在许多情况下更快。当然,如果你用过 C,你就会知道自己管理内存是很困难的。除了认知开销之外,您还面临导致分段错误和未定义行为的风险。

内存和线程安全

出于这个原因,现代 C++ 引入了像智能指针这样的概念来减轻这些与内存相关的错误,但尽管有了显着的改进,但它们可以提供的保证数量有限。Rust 更进一步,引入了借用检查器,这是一个捆绑在编译器本身中的组件,可确保引用不会超过它们所引用的数据,从而防止整个类别的内存不安全错误。

Rust 的另一个大卖点是其丰富的类型系统,这使得在编译时防止数据竞争成为可能。它通过引入两个特殊特性 Sync 和 Send 来实现,编译器使用它们来确定多线程操作是否安全。虽然在 Rust 中可以在线程之间共享一些内存,但编译器会阻止你构建一个不安全的程序,甚至在程序启动之前防止数据竞争。例如,如果你想从多个线程改变一个变量,编译器会要求你用一个 Mutex 或等价的东西来包装它,因为一般来说,从多个线程改变一个未同步的变量是不安全的,除非同步原语或原子操作用来。

不安全的Rust

到目前为止,我们讨论了所谓的“安全 Rust”的特性,它提供了像内存安全这样的保证,并防止未定义的行为,但还有另一个语言的“版本”,称为不安全 Rust,这基本上是让你以失去所有安全保障为代价获得超能力。

你想知道为什么需要这个吗?嗯,主要有两个原因:如果你想与操作系统或硬件的低级方面进行交互,这些操作本质上是不安全的,所以“安全的 Rust”编译器,它试图给你保证, 不能这样做。因此,如果你仍然想执行它们,你必须明确告诉编译器信任你并放弃那些安全保证,进入 Rust 的“不安全”的一面。

另一个原因是,在分析代码时,编译器非常保守。从保证的角度来看,阻止一个有效的程序比让错误的程序通过编译步骤要好得多。因此,有时我们可能想要绕过这些检查,为此,我们也需要进入“不安全”的一面。

在某种程度上,不安全的 Rust 和 C++ 非常相似。主要区别在于 Rust 程序员通常会尽可能避免“不安全”的一面,除非与操作系统的低级方面进行交互,或者在绝对确定某个操作是正确的情况下,这大大减少了内存问题的出现。

包管理和生态系统

Rust 可以说比 C++ 更好的一个领域是包管理。如果您曾经使用过 Python 或 JavaScript,那么您会感到宾至如归,这是官方的 Rust 包管理器。安装包只是在cargo.toml 文件中添加一行,而在C++ 中使用外部库可能是一个巨大的痛苦,尤其是在针对多个操作系统的情况下。已经有一些尝试将现代包管理引入 C++,例如 Conan 和 vcpkg,但它们远未标准化或易于作为 cargo 使用。

话虽如此,C++ 生态系统是巨大的,比 Rust 生态系统要大得多,因为前者已经存在了几十年。换句话说,C++ 的库比 Rust 的库多得多,后者有时缺乏合适的库。

好消息是 Rust 有一个非常好的外部函数接口,这意味着你可以很容易地从 Rust 与 C 代码交互,因此,也可以通过公开 C API 来与 C++ 库交互。不幸的是,这并不总是可行的,尤其是在复杂的情况下,但是有一些正在进行的尝试使创建绑定更容易。一个例子是 autocxx 库,它正在由Google Chrome 团队开发,以调查浏览器的某些部分是否可以在未来使用 Rust 开发。

两种语言之间另一个有趣的区别是宏系统,它在 Rust 中更加强大和安全。首先,Rust 附带两种宏:声明性和过程性。前一种类型类似于传统的 C/C++ 宏,区别在于宏是hygenic,这意味着它们不能干扰其范围之外的变量,因此不会引起任何不需要的副作用。另一方面,程序宏完全不同,功能更强大,也更复杂。它们基本上可以被认为是编译器插件,它接收程序语法树作为输入,对其进行操作,然后将丰富的语法树作为输出返回。这使得创建注解成为可能,类似于 Java,在编译时丰富代码。

结论

总结一下,这两种语言中哪一种更好?一如既往,这取决于!但这些是最重要的要点:

Rust 很可能是系统编程的未来,证据是许​​多大玩家(微软、苹果、谷歌)正在朝这个方向发展,逐渐将 Rust 与他们的产品集成。当然也不要误会我的意思,C++ 也不会消亡,并且由于用它构建的大量遗留代码不会很快消失,但是越来越多的公司选择 Rust 而不是 C++ 来开发新产品。

我的理论是,在 10 年后,大多数 C++ 工作将专注于维护遗留软件而不是创建新产品。当然,这只是我的意见,我可能是错的:)

相关链接:

Rust 将成为 Linux 的第二个官方语言

 

发表评论