从 Rust 迁移到 C++


多年来,我一直参与 Rust 和 Rust 社区。我的大部分工作都与创建用于在 Rust 中构建 GUI 工具包的基础设施有关。然而,我发现我对这种语言越来越失望,并且渴望 C++ 提供的稳定、成熟的基础。

构建系统的选择
Rust 生态系统的局限性之一是 Cargo 构建系统和包管理器的近乎单一文化。虽然在某种程度上使用了其他构建系统(包括集成到更大的多语言项目时的Bazel),但它们并没有得到工具的很好支持。

相比之下,在 C++ 中,构建系统有很多选择,允许每个开发人员选择最适合他们需要的一个。一个非常常见的选择是 CMake,但也有 Meson、Blaze 及其变体,当然也总是可以求助于 Autotools 并进行制作。如果我们要编译 AIX 和 DEC OSF/1 AXP 等 Unix 系统,后者尤其有用。如果这些都不够,还有很多其他选择,包括 SCons,毫无疑问,我们会定期创建新的选择。

我们还没有为 Linebender 项目确定构建系统,但很可能是 CMake,并计划评估其他系统和迁移,也许是 Meson。

安全
这一变化最具争议的方面可能是放弃了 Rust 语言的安全保证。但是,出于三个原因,我认为这在实践中不会成为大问题。

首先,我认为自己是一个足够优秀的程序员,我可以避免编写有安全问题的代码。当然,我曾负责过一些 CVE(包括Android 中的字体解析代码),但我从那次经历中吸取了教训,并且有信心在未来避免此类错误。

其次,我认为内存安全问题的危险被夸大了。Linebender 项目主要关注 2D 图形,部分是游戏,部分是用于创建 GUI 应用程序的组件。如果 GUI 程序崩溃,也没什么大不了的。如果错误是由于我们用作依赖项的库引起的,我们的客户会明白这不是我们的错。内存安全错误与逻辑错误和其他错误没有根本区别,我们只会在它们出现时修复它们。

第三,C++ 语言正在向更安全的方向发展。我们可以使用现代 C++ 技术来避免原始指针的许多危险。C++ 核心指南很有用,即使它们在违规中受到尊重。而且,正如下一节所讨论的,语言本身有望得到改进。

语言演化
C++ 的一个显着特征是新功能的快速采用,现在每 3 年有一个新版本。C++20 为我们带来了模块,这是一项创新的新功能,我期待着很快就能真正实现这一功能。展望未来,C++26 可能会拥有堆栈协程、嵌入二进制文件内容以初始化数组的能力、安全的基于范围的 for 循环,以及许多其他好东西。

相比之下,Rust 的创新步伐变得更加稳健。它曾经非常快速,并且异步一直是一项重大努力,但最近登陆的特性(例如通用关联类型)更像是使现有特性的组合按预期工作,而不是带来任何根本性的新功能;即将推出的“type alias impl trait”与之类似。在这里,很明显,Rust 因承诺不破坏现有代码(由版本机制制定)而受阻,而 C++ 可以自由地在每个新版本中实现向后兼容性破坏性更改。

C++ 有更令人兴奋的变化值得期待,包括 Herb Sutter cppfront提出的潜在新语法,甚至是新的 C++ 兼容 Carbon 语言。

幸运的是,我们在 C++ 社区中拥有出色的领导能力。Stroustrup关于安全的论文是一份非常明智和敏锐的文档,显示了对 C++ 面临的问题的深刻理解,并提出了一个引人注目的未来路线图。

结论
Rust 是一个很好的实验,有些方面我会深情地回顾,但现在是时候将 Linebender 项目变成一种成熟的、生产就绪的语言了。我期待与 C++ 社区中的其他人进行富有成效的协作。

网友评论:
非常有趣,我曾经在一个团队工作,我们必须创建一个服务来处理来自传感器的大量图像,大部分代码是 java,但我们使用一些 c++ 库来进行图像处理以提高速度。由于部署系统的原因,目标正常运行时间为 4 个月……最后,我们不得不将所有图像处理转移到 Java,因为仅运行几个小时后,C++ 库中的内存泄漏就会严重恶化。

Rust 有许多吸引我的特性,但另一方面,围绕它建立了令人厌恶的邪教社区。

今天是愚人节