2.3 C++ 的 2006
2006 年,我和 ISO C++ 委员会的大多数其他成员都对功能丰富的 C++0x 标准寄予厚望。计划在 2007 进行特性冻结,所以我们有一个合理的预期,C++0x 将是 C++08 或 C++09。事实上 C++0x 变成了 C++11,引出了关于十六进制 C++0xB 的笑话。
在我 2006 年的 HOPL 论文 [Stroustrup 2007] 中,我列出了 39 个提案,并预测前 21 个会进入 C++0x。有趣的是,我列表上的前 25 个建议中,有 24 个进入了 C++11。我把提案 22–25 列为正在制定中,目标是在 2007 年 7 月进行投票
。令我惊喜的是,它们全都成功了。而提案 26–39 则连 C++17 都没有进入。这中间就留下了第 10 号提案概念
,它有一个自己的长长的悲伤故事,不过最终还是以进入 C++20 而快乐收尾。
我和其他许多人对 C++0x 的延迟感到沮丧,并担心在面对来自更现代、资金更充足的替代品的竞争时,一个未经改进的 C++ 可能无法作为一种活的语言生存下去。在 2006 年,Java 的使用仍在增加,微软的 C# 也有大量的支持和营销。我在 2006 年的估计是 C++ 的使用在过去 4 年中首次略有下降。获取真实的数字很难,我的最佳估计(下降 7%)完全在误差范围内,但确实有理由去担心。类似 Java 和 C# 这样的语言会作出这样一种假设——并常常大声宣扬——C++ 没有生态位:
低级编程
可以由少量的 C 或汇编代码处理。高级编程
则可以使用一种带有巨大的运行时支持系统的更安全、更小并使用垃圾收集的语言来做,这样可以更好、更便宜、更高效地完成。- 像 Java 和 C# 这样的托管语言使用垃圾收集和一致的运行期范围检查,使得不太专业的程序员能更有生产力,这样可以减少对高技能的开发人员的需求。
- 编程语言与平台的深度集成,并使用集成工具来进行支持,这对生产力和大型系统的构建至关重要。
显然,我和许多其他人并不同意。但这些在过去和现在都是严肃的争辩,它们如果正确的话应该导致 C++ 被放弃使用。C++ 基于传统的编程语言模型,与底层操作系统分离,并由众多独立的工具供应者提供支持。托管语言往往是专有的;只有一个庞大而富有的组织才能开发所需的庞大基 础设施和库。我和 C++ 社区中的其他许多人更喜欢不受公司控制的语言;这是我参加 ISO 标准工作的一个原因。
回想起来,2006 年可能是 C++ 的最低谷,但重要的技术事件也恰好在此时发生了:大约在 2005 年,历史上第一次单个处理器(单核)的性能停止提高,能效(每瓦特的性能
)成为一个关键指标(尤其是对于服务器集群和手持设备)。计算经济学转而青睐更好的软件。硬件的进步再也不能完全掩盖语言或编程技术的低效。这样,执掌利器
的高手跟差点的程序员或受工具链开销束缚的程序员相比,能赢得高一个数量级的经济优势,而这种优势十多年之后还依然存在。即使在今天,这些事实还没有被所有的教育和管理体制充分领会,但是现在有许多重要的任务,为它们花时间精心打造高性能的代码会获得巨大的回报。
另一个转折点来自供应商,他们试图通过定义标准接口(比如图形用户界面)将自己喜欢的语言强加给所有用户,而这只能通过使用他们喜欢的、通常是专有 的语言来实现。比如谷歌对安卓系统使用 Java,苹果对 iOS 使用 Objective-C,微软对 Windows 使用 C#。应用程序供应商可以尝试通过使用一些编程方言来避开锁定,例如 Objective C++ [Objective C++ Wikipedia 2020] 或 C++/CLI [ECMA International 2005],但是这样写出的代码仍然不可移植。许多组织,比如 Adobe、谷歌和微软,他们的响应方式是使用 C++ 编写他们要求苛刻的应用程序的主要部分,然后为各种平台(如 Android、iOS 和 Windows)使用薄接口层。2006 年时这一趋势几乎不引人注目。
在便携式设备(尤其是智能手机)上,对能效和平台独立性的需求是彼此融合的。一个影响是,据我在 2018 年的最佳估计,自 2006 年以来 C++ 程序员的数量增长了约 50%,达到约 450 万名开发人员 [Kazakova 2015]。也就是说开发者每年增长 15 万人,十年来每年大约增长 4%。
2006 年,很少有人注意到硬件趋势对 C++ 固有优势的滋养。而社区和标准委员会正在关注新的语言特性和库,以增加 C++ 的实用性并提高对它的热情。包括我在内的一些委员感到迫切需要重大改进。其他人更关注于稳定语言和改进它的实现。一个标准委员会需要这两个群体,但创新和 整顿之间不断的拉锯战是紧张的来源。就像在任何大型组织中一样,维护现状和服务当前用户的人有组织上优势。在《C++ 程序设计语言(第三版)》[Stroustrup 1997] 中,我引用了尼科洛·马基雅维利(Niccolò Machiavelli)的话:
没有什么比开创一种新秩序更难于推行、更让人怀疑能否成功、处理起来更加危险。因为改革者会与所有从旧秩序中获利的人为敌,而所有从新秩序中获利的人却只是冷淡的捍卫者。
我的观点是 C++ 需要显著的改进来更好地服务于它的用户群体。C++ 应用程序被大规模部署,但是新项目通常选择更流行的语言,一些成功的 C++ 项目被改写成这样的语言。举例来说,谷歌的许多大规模应用,如搜索,一直是基于他们的 map-reduce 框架 [Dean and Ghemawat 2004, 2008]。它就是 C++ 程序。然而,由于它因为商业原因是专有的,人们复制了它,而开源的 map-reduce 框架(Hadoop)出于各种原因是用 Java 实现的。这对于 C++ 社区来说是一件憾事。
开发转向其他语言的另一个重要原因是,模板提供的接口的灵活性使得使用所有 C++ 特性并提供稳定的 ABI 变得极其困难:可以灵活,也可以提供稳定的二进制接口,但大多数组织都做不到两者兼顾。我认为人们之所以需要 C++ 编写的程序提供 C、Java、C# 之类的接口,这是个促成因素。C++ 的 ABI 稳定性是一个真正的技术难题,尤其是因为 C++ 标准必须独立于平台。
更让 C++ 社区的问题雪上加霜的是,到了 2006 年,随着纸质出版的衰退,以及记者们关注更流行的技术和广告收入,大多数报道 C++ 的专业软件杂志已经消亡。Dr. Dobbs 期刊还支撑了几年(2009 年 2 月停刊)。C++ 会议被吸收到面向对象
或一般软件开发会议中,剥夺了 C++ 社区展示新发展的场所。书籍仍在编写中,但程序员阅读的书籍越来越少(或至少购买的书越来越少,因为盗版变得越来越容易,因此统计数据变得越来越不可靠),在线资源变得越来越受欢迎。
一个更严重的问题是 C++ 在教育中的作用正在急剧下降。C++ 不再是新的、有趣的
,而 Java 正作为一种更简单、更强大的语言被直接推向大学。美国高中计算机科学考试突然从 C++ 变成了 Java。在大学里,Java 作为入门语言的使用急剧增加。C++ 的教学质量也在下降,大多数课程优先选择 C 语言,或者认为严重依赖类层次结构的面向对象编程是唯一正确的方法。这两种方法都弱化了 C++ 的优势,并且需要大量使用宏。标准库(依靠泛型编程;(§2.2))和 RAII(依赖构造函数/析构函数对(§2.2.1))经常被完全排除在基础课程之外,或者被放在一个所谓的高级特性
部 分,大多数学生要么从未接触过,要么认为它很可怕。教科书经常陷入晦涩难懂的细节。当然也有例外,但平均来说,呈现给学生的 C++ 远不是最佳的工程实践。在 2005 年,我接受了挑战,给大学一年级的学生教编程。我调查了大约二十本最流行的 C++ 编程教材,最后大声抱怨:
如果那就是 C++,我也会不喜欢它!
在用一本著名的教科书教了一年书后,我开始只用自己的教案,并且在 2008 年出版了《C++ 程序设计:原理与实践》(Programming: Principles and Practice Using C++)[Stroustrup 2008a],但直到今天,许多 C++ 教学仍带有 1980 年代的特色。
尽管如此,C++ 的使用又开始增加了。我认为这是因为根本的技术趋势再次青睐 C++,并且在二十一世纪的第一个十年结束的时候,C++11 的出现也有所帮助。
Boost 库和 Boost 组织非常重要 [Boost 1998–2020]。1998 年,经验丰富的开发者及 WG21 的有影响力的成员 Beman Dawes 建立了一个C++ 代码库网站
[Dawes 1998],其明确目标是开发 C++ 库以确立现有实践,使得未来的标准化可以据此进行。在此之前,C++ 甚至从来没有一个公共的代码库。Boost 慢慢成长为一个活跃的组织,有新库的同行评审和一年一度的会议。Boost 库被广泛使用,最流行的被吸收到标准中(例如,regex
(§4.6)、thread
(§4.1.2)、shared_ptr
(§4.6)、variant
(§8.3)和文件系统(§8.6))。对于 C++ 社区来说重要的是,Boost 库比它们的 ISO 标准版本早十多年,但仍被当作某种预备标准
来信任。有许多委员会成员都参与了 Boost,特别是 Dave Abrahams、Doug Gregor、Jaakko Järvi、Andrew Sutton,当然还有 Beman Dawes。
到 2006 年,C++ 在业界已经不再是新鲜刺激的东西,但它遍布很多行业。在 C++ 诞生的电信行业,它一直被大量使用。从电信领域出发,它已经扩展到游戏(如 Unreal、PlayStation、Xbox 和 Douglas Adams 的《宇宙飞船泰坦》)、金融(如摩根士丹利和 Renaissance Technologies)、微电子(如英特尔和 Mentor Graphics)、电影(如皮克斯和 Maya)、航空航天(如洛克希德·马丁和美国国家航空航天局)和许多其他行业。
就我个人而言,我特别喜欢 C++ 在科学和工程中的广泛使用,比如高能物理(例如 CERN 欧洲核子研究中心、SLAC 国家加速器实验室、费米实验室)、生物学(例如人类基因组项目)、空间探索(例如火星漫游车和深空通信网络)、医学和生物学(例如断层扫描、常规成像、人 类基因组项目和监控设备)等等。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论