C++ 的未来——第 1 部分

Blog
Author:
Amir KirshAmir Kirsh
Published On:
8月 30, 2022
Estimated reading time:
1 minute

CPP North大会上宣布 Carbon编程语言以来的几周里,围绕C++的未来有一些讨论。当然,有一个问题值得商榷,即一门仍处于初级阶段的语言怎么会引起如此大的反响呢。还存在一个问题,即如何把它和类似Rust语言的竞争对手相比较。

在谈到 C++ 的未来时,我们需要记住,预测是很困难的,尤其是对未来的预测(我们已经在另一篇讨论 C++ 发展的博客文章中引用过这句话)。让我们冒着风险,试着预测一些趋势。

中年危机中的语言

在 CPP North的闭幕主题演讲中,Sean Parent讨论了 C++ 面临的挑战。这个演讲被恰如其分地命令为“C++的悲剧,Acts One & Two”,探讨了使 C++ 成功的因素,以及为什么这些因素可能会导致它的失败。演讲结束后,为了进一步阐述演讲的标题,Sean 在他的网站上发布了以下内容

“是什么让悲剧成为了悲剧?它要求主角要获得成功,或者故事是单纯的不幸而不是悲剧。C++ 是成功的。在 Act One 中,我们探讨了 C++ 成功引入我们角色的原因。在Act Two中,我们看到了 C++ 的一些优势是如何具有破坏性的。”

那么,这些优势转化为劣势的到底是什么呢?Sean 从标准开始介绍,这是 C++ 成功的一个重要因素,为编译器供应商和开发人员提供了非常清晰和稳定的定义。但是这些年来,标准变得越来越长、越来越复杂(从 C++98 中的 757页到 C++20 中的 1807 页)。Timur Doumler 已经 CppCon 上关于 C++20的演讲中讨论了这个问题。

然后,他继续讨论语言本身的复杂性,并用 std::pair演示了从 C++98(SGI) 中的62行增长到 C++11 中的372行,以及 C++20 中的502行。你会说一个需要502行代码来表达一对的语言是有效的吗?是的,这是有充分理由的——这是一段通用的编程代码。但是,在 C++ 中有太多低代码密度的例子,以及用太多行代码试图表达一件小事(用其他语言表达可能更好)。我能想到的一个很好的例子是 C++ lambdas。缩写lambda 的提议被否决了,也许是有正当理由的,但结果是相比其他语言,C++ lambda 代码更为麻烦。另一个例子是变量包扩展,使用 std::integer_sequence 或其他卷积技术,而不是简单的索引语法(在 Circle 中实现)。

C++提供的一组复杂特性使它成为唯一一种可以解决真正开发问题的软件语言,就像StackOverflow中的这个问题,其标题是“C++20是否可能让一个constexpr函数返回一数组类型,这些类型具有通过宏传递的值的静态constexpr数组?”。另一方面,并不是每个人都认为 C++ 很复杂。比如这篇 Reddit上的帖子:开始大量学习 C++14后,我觉得自己被一些苛刻的评论误导了,比如说“C++ 是一种可怕的语言是的,它是比许多其他语言更复杂,但这有那么糟糕吗?

Sean的演讲讨论的另一个方面是 C++ 提供的低级工具,这些工具最终可能会损害性能。当你以一种高级声明方式描述你想要实现的目标时,与看起来更有效的低级代码相比,编译器或环境可能能够更好地优化你的用例。C++使你能够使用低级工具,但Sean认为,在许多用例中,这些工具会伤害你,例如,通过创建太多的线程,消除SIMD矢量化或其他优化的选项。此外,对GPGPU(通用GPU)计算的需求也在不断增长,最好不需要外部库。正如Sean 所说:

若没有解决矢量化、GPGPU和可扩展并行性问题,标准C++只是一个脚本系统,通过其他语言和库访问机器的其他99%空间。我们需要这么复杂的脚本系统吗?”

虽然Sean说他看不到任何解决C++问题的捷径,但这并不是说我们可以放弃我们的C++代码库。

因此,C++ 面临的挑战是显而易见的。随着时间,它并没有变得更容易,因为它需要承担其遗留的负担。(是的,你可以专注于语法的子集,忽略旧的做事方式。但仍不等同于一种全新的、干净、简洁的语言)。规格越来越大,就越来越复杂。而且它没有解决我们期望它解决的一些问题,例如多线程、矢量化和GPGPU的更好的声明式高级编程。

有些人认为C++的ISO委员会流程是变革的障碍。对于一种语言来说,民主和开放的过程可能是一件坏事——有太多的观点,很难达成共识来推动事情向前发展,并且鼓励妥协,而不是明确单一的概念完整性。这可能会成为新语言的催化剂,这些新语言无需遵循这样的过程,或者可以创建自身过程(例如不需要达成共识的开放过程或更集中的过程)。

最后,尽管C++仍然非常受欢迎,而且远未退役,在世界各地都有会议提及,有数百篇博客文章和一个热情的开发人员社区。软件语言并非永远存在。如果出现更好的项目,随着新项目转向更好的替代方案,这些语言就会失去自己的位置。十年后,C++的使用和受欢迎程度可能会降低。

资料来源:推特

在第二部分,我们将讨论C++的替代方案,这些方案是用来解决什么,以及一些关于C++未来的更具体的想法。