作者丨Herb Sutter
译者丨平川
每到这个时候,WG21 的工作人员总会遇到来自外界的疑问,“为什么 C++ 标准的发布时间这么严格?”。甚至许多新的委员会成员,他们对 WG21 的历史和这样做的原因同样并不了解。众所周知,WG21 有一个严格的时间表,按照这份时间表,机构每三年发布一次标准,从不会推迟。因此,在 7 月 5 日科隆大会之前的行政电话会议上,本文作者 Herb Sutter 在其他委员会主席的鼓励下,回应了采用这一方式的原因及背后的历史,该修订版在科隆大会的会议邮件中发布。本文是是面向感兴趣的公众发布的副本,希望能对你理解 C++ 标准的发布有所启发。
在科隆大会之前,如果标准中有 Bug,WG21 会推迟 C++ 20 吗? 当然不会。我们正在按计划进行,修复 Bug 是最后一年的目标。这也是时间表在“19”(科纳)的早期冻结了 C++“20”的特性,留出一年的时间来修复 Bug 的原因,包括今年夏天开展一轮国际讨论。我们必须在 2020 年初(三个会议:科隆、贝尔法斯特和布拉格)采用评审反馈、任何其他问题的解决方案以及 Bug 修复。
如果还有一两个会议,就可以添加几乎已经准备好的特性,那么 WG21 是否会推迟发布 C++ 20 呢? 当然不会。只能再等几次会议(布拉格大会之后),C++ 23 正式对外开放,可以将该特性作为 C++ 23 工作草案的第一项内容。例如,对于 concept,我们就是这样做的。它还没有完全准备好从 TS 直接进入 C++ 17,所以按照投票,其核心功能会在 C++ 20 的首次会议(多伦多)时加入 C++ 20 草案,留下足够的时间来完善,采用 TS 中余下的有争议的部分,稍微多花些时间准备(非“模板”的语法),并在第二年(圣地亚哥)采用。现在我们拥有了整个特性。
这听起来太严格了。为什么我们每三年发布标准 ? 因为它是发布 C++ 标准仅有的两个项目管理选项之一,经验表明它比另一个选项更好。
我们对(2)有多严肃?如果由一名重要的委员会成员所主导的主要特性“几乎准备好了”……我们会等待,不是吗? A:不会。我们有历史数据:2016 年在杰克逊维尔,在 C++ 特性截止日,Bjarne Stroustrup 在全体会议上呼吁在 C++17 中包含 concept,而人们未能达成共识。因此,有人直接问他是否愿意让 C++ 17 推迟一年,加入 concept。Stroustrup 说“不”,没有任何的犹豫或迟疑,并补充说,没有 concept 的 C++ 17 比有 concept 的 C++ 18 甚或 C++ 19 更重要,尽管 Stroustrup 从事 concept 特性的开发已有 15 年。
真正的选择是:(2)发布没有 concept 的 C++ 17,然后在 C++ 20 包含 concept(我们就是这样做的)。或者(1)把 C++ 17 重命名为 C++ 20,这就等同于(2)跳过 C++ 17,并且不发布已经准备好的 C++ 17。
介于(1)和(2)之间的东西呢,比如,基本上采用(2)的做法,但计划有“一点”灵活性,当我们觉得需要稳定一个特性时,就额外花“少许”时间? 不会,因为那就成(1)了。Fred Brooks 在《人月神话》中解释了“神秘的小偏差(mythical small slip)”,并得出结论:“避免小偏差。”
现在,想象一下,C++ 20 稍微延期了。现实情况是,我们将从(2)切换到(1),无论我们怎么试图否认它,都没有任何实际的好处。如果我们为了完整度而决定推迟 C++ 20,我们至少要将标准延期两年。一旦我们延期至少两年,C++ 20 会变为 C++ 22,甚至 C++ 23……但我们已经准备交付 C++ 23!所以不管是哪个计划,我们仍然是交付 C++ 23。唯一的区别在于,我们在此期间没有交付 C++ 20,完全准备就绪的工作多了许多,而世人则多等了三年。这没有理由,因为延迟不会造福那些未完全准备就绪的特性,大部分或全部都是如此。
所以,这个建议相当于“让我们把 C++ 20 变成 C++ 22 或 C++ 23”。而答案很简单,“是的,我们会有 C++ 23,但是在 C++ 20 之外,而不是取代 C++ 20。“推迟 C++ 20 实际上意味着跳过 C++ 20,而不是发布已经稳定而且准备就绪的工作,这样做没有好处。
特性 X 被破坏了,需要时间修复,而 C++20 中剩余的修复时间不够用了,怎么办? A:没问题!我们去掉它!在这种情况下,有人就需要写文章向 EWG 或 LEWG(酌情)说明问题,并提出从标准草案中去掉它的建议。这些组织就会考虑,如果他们确定该特性被破坏了(全体同意),这很好,该 C++ 特性将推迟到下一个版本。对于 C++ 0x 的 concept,我们已经这样做过。但是,按照计划(1),我们会延期,不仅那个特性,C++ 20 的整个特性集都会被纳入 C++ 23,那就太过分了。
标准从来都不是完美的,难道我们不会把错误发布出去吗? 是的。如果我们看到一个特性还没准备好,我们应该去掉它。如果我们看到一个特性可以更好,但我们知道,修改可以用向后兼容的方式完成,这不是一个现在不发布它的理由,那可以在 C++ 的下一个版本中作为一个扩展。我们会特地发布计划进一步改进的特性,只要我们有足够的信心用向后兼容的方式完成。
你确定现在的质量比采用方案(1)时更好吗? 是的。借助客观的指标,特别是国家机构的评论和问题报告,C++ 14 和 C++ 17 一直是最稳定的版本。对于这些指标,它们每一个都比 C++ 98 或 C++ 11 好三至四倍。原因是我们定期发布,并优先将大特性放入 TS 分支(包括如何与主干标准整合的完整说明),在知道它们准备好之后将它们合并。
事实上,自 2012 年以来的核心标准始终保持“接近交付(near-ship-ready)”的状态(所以,即使是我们的工作草案,其质量也不亚于 C++ 98 和 C++ 11 标准)。在 2012 年之前,这从未发生过,我们常常“将病人公开”,问题列表很长,我们打算很快就安回去的器官散落在周围。如果我们想要,我们现在就可以交付 CD,没有科隆会议也可以,而且仍然比 C++ 98 或 C++ 11 的 CD 质量更高。考虑到 C++ 98 和 C++ 11 的成功,我们认识到,现在的质量比过去任何时候都要高,这意味着我们处于一个非常好的位置。