作者 | Raph Levien
策划 | 言征
51CTO读者成长计划社群招募,咨询小助手(微信号:TTalkxiaozhuli)
多年来,我一直在参与 Rust 和 Rust 社区。我的大部分工作都与创建用于在 Rust 中构建 GUI 工具包的基础设施有关。然而,我发现我对这种语言越来越失望,我现在太渴望 C++ 的稳定与成熟了!
1、构建系统:Rust 生态小家子气
Rust 生态系统的局限性之一是 Cargo 构建系统和包管理器的近乎单一文化。虽然在某种程度上使用了其他构建系统(包括集成到更大的多语言项目时的Bazel),但它们并没有得到工具的很好支持。
相比之下,在 C++ 中,构建系统有很多选择,允许每个开发人员选择最适合他们需要的一个。一个非常常见的选择是 CMake(CMake是一个开源、跨平台的工具系列,旨在构建、测试和打包软件,通常用于使用简单的平台和编译器独立的配置文件控制软件编译过程),但也有 Meson、Blaze 及其变体,当然也总是可以求助于 Autotools 并进行制作。如果我们要编译 AIX 和 DEC OSF/1 AXP 等 Unix 系统,后者尤其有用。如果这些都不够,还有很多其他选择,包括 SCons,毫无疑问,我们会定期创建新的选择。
我们还没有为 Linebender 项目确定构建系统,但很可能是 CMake,并计划评估其他系统和迁移,也许是 Meson。
Linebender:包含许多诸如druid、xilem等许多流行的Rust存储库。
2、安全:三个原因放弃Rust
这一变化最具争议的方面可能是放弃了 Rust 语言的安全保证。但是,出于三个原因,我认为这在实践中不会成为大问题。
首先,我认为自己是一个足够优秀的程序员,我可以避免编写有安全问题的代码。当然,我曾负责过一些 CVE(包括Android 中的字体解析代码),但我从那次经历中吸取了教训,并且有信心在未来避免此类错误。
其次,我认为内存安全问题的危险被夸大了。Linebender 项目主要关注 2D 图形,部分是游戏,部分是用于创建 GUI 应用程序的组件。如果 GUI 程序崩溃,也没什么大不了的。如果错误是由于我们用作依赖项的库引起的,我们的客户会明白这不是我们的错。内存安全错误与逻辑错误和其他错误没有根本区别,我们只会在它们出现时修复它们。
第三,C++ 语言正在向更安全的方向发展。我们可以使用现代 C++ 技术来避免原始指针的许多危险(尽管字符串视图可以比它们的支持字符串更长寿,并且 UI 中使用的闭包可以有非常有趣的生命周期模式)。C++ 核心指南很有用,即使它们在违规中受到尊重。而且,正如下一节所讨论的,语言本身有望得到改进。
3、语言演化:Rust没有根本性的新功能
C++ 的一个显着特征是新功能的快速采用,现在每 3 年有一个新版本。C++20 为我们带来了模块,这是一项创新的新功能,我期待着很快就能真正实现这一功能。展望未来,C++26 可能会拥有堆栈协程、嵌入二进制文件内容以初始化数组的能力、安全的基于范围的 for 循环,以及许多其他好东西。
相比之下,Rust 的创新步伐变得更加稳健。它曾经非常快速,并且异步一直是一项重大努力,但最近登陆的特性(例如通用关联类型)更像是使现有特性的组合按预期工作,而不是带来任何根本性的新功能;即将推出的“type alias impl trait”与之类似。在这里,很明显,Rust 因承诺不破坏现有代码(由版本机制制定)而受阻,而 C++ 可以自由地在每个新版本中实现向后兼容性破坏性更改。
C++ 有更令人兴奋的变化值得期待,包括 Herb Sutter cppfront 提出的潜在新语法,甚至是新的 C++ 兼容 Carbon 语言。
幸运的是,我们在 C++ 社区中拥有出色的领导能力。C++ 之父 Stroustrup 关于安全的论文《A call to action: Think seriously about “safety”; then do something sensible about it 》是一份非常值得一读的文档,显示出对 C++ 面临的问题的深刻理解,并提出了一个引人注目的未来路线图。
C++之父去年12月6日发表有关安全的文章
4、社区:Rust 社区有点专横
我将以关于社区的一些想法作为结束。我尽量不花太多时间在社交媒体上,但我听说 Rust 社区可能非常专横,不断要求用 Rust 重写项目,并诋毁所有其他编程语言。我会很高兴摆脱它,并且相信 C++ 社区会更好、更友好。特别是,C++ subreddit 以其幽默感而闻名。
Rust 社区还以其行为准则和其他促进多样性的政策而闻名。我坚信编程语言应该不受政治影响,严格关注技术本身。在计算机科学领域,我们已经超越了偏见和歧视。我理解某些身份群体可能希望获得更多代表权,但我认为没有必要。
5、结论
Rust 是一个很好的实验,有些方面我会深情地回顾,但现在是时候将 Linebender 项目变成一种成熟的、生产就绪的语言了。我期待与 C++ 社区中的其他人进行富有成效的协作。我们正在寻找帮助 C++ 重写的人。
原文链接:https://raphlinus.github.io/rust/2023/04/01/rust-to-cpp.html