史蒂夫·克拉布尼克和赫伯·萨特谈论Rust和C++

不存在完美的编程语言

在《软件工程日报》播客中,Steve Klabnik 和 Herb Sutter 讨论了 Rust 和 C++ 的异同。Klabnik 强调,Rust 的独特之处在于它借鉴了一些在近现代编程语言中不流行但在编程语言领域中广为人知的思想。Sutter 则着重强调了“零开销抽象”的概念,即在表达高层次抽象时不会带来额外开销。Klabnik 补充说,Rust 通过类型系统实现“零成本”抽象,类型系统表达得越多,运行时检查的需求就越少。然而,并非所有抽象都是零开销的,Sutter 以 C++ 中的异常处理和运行时类型为例,说明这些特性在编译器中通常可以选择禁用,因为它们可能带来不必要的开销。两人一致认为,语言设计是一门艺术或工艺,受到设计者品味和哲学的影响,因此目前还没有所谓的“完美语言”。

适用领域

Sutter 指出,Rust 和 C++ 的目标领域非常相似,选择哪种语言通常取决于生态系统的成熟度和线程安全保障。Klabnik 提到,Rust 经常被用于构建网络服务,例如 Cloudflare 使用 Rust 作为其后端,处理了 10% 的互联网流量。其他一些公司也通过将 Python 代码重写为 Rust,大幅减少了云计算的成本。Sutter 则强调了 C++ 的优势,包括对时间和空间的控制能力,以及其丰富的工具生态系统,这些工具已经发展了 30 多年。相比之下,Rust 仍然是一门年轻的语言,某些情况下,公司内部工具可能不支持 Rust,导致无法直接发布 Rust 代码。

语言的演进

语言演进的关键在于何时值得为新增功能增加语言的复杂性。Klabnik 赞赏 C++ 在“合理范围内”对向后兼容性的承诺,但他对 Rust 最近的一些提案表示担忧,认为它们可能增加了不必要的复杂性。Sutter 提到,C# 团队曾决定在语言中添加可空性,虽然这是一个很好的特性,但也带来了隐藏的成本,因为这种复杂性不仅影响了用户,还会在未来 20 年中持续存在,并限制语言的演进。Klabnik 还回忆起自己在 Rust 的 await 语法设计中的争论,尽管最初他反对使用后缀语法,但最终发现这种设计在实际编码中更为便利。

语言版本的力量

Rust 通过定义“语言版本”来管理变更,以在添加新功能时保持源代码的兼容性。Sutter 对这种机制表现出兴趣,并探讨它是否可以帮助 C++ 在不引入冲突的情况下支持 async/await。Klabnik 解释说,语言版本是一个强大的机制,可以用于添加新语法,但它也有局限性。例如,可以将 mute 改为 unique 这样的纯语法变更,但不能通过语言版本添加垃圾回收机制,因为这会在更深层次上改变语言的运作方式。此外,Rust 的标准库是一个独特的二进制文件,因此必须确保它包含所有版本中使用的函数。

其他讨论

Klabnik 和 Sutter 还讨论了 C++ 标准化过程的重要性,Rust 社区是否对 ISO 标准感兴趣,Rust 拥有多个编译器而非单一编译器的原因及其影响,以及如何在大学中教授 C++ 或 Rust 等语言的价值。这些内容在播客中有更详细的探讨,感兴趣的听众可以进一步了解。

阅读 34
0 条评论