博客 阅读时间 5 分钟

通往第五代 C++ 之路

分享本文
The Road to the Fifth Generation of C++

自诞生以来,C++ 持续演进,走过了许多重要的里程碑,从"带类的 C"到新标准的崛起。C++ 演进的下一步会是什么?让我们先看看 C++ 这些年是如何演进的:

第一代 C++:带类的 C(C with Classes)

在 1998 年首次标准化之前,C++ 自 1979 年起就由 Bjarne Stroustrup 在贝尔实验室开发,作为 C 语言的扩展,因为他想要一门既高效灵活、又具有 C 式性能的语言。

1983 年,"带类的 C"更名为"C++",新增特性包括虚函数、函数名和运算符重载、引用、常量、类型安全的自由存储内存分配(new/delete)以及改进的类型检查。

以下是第一代 C++ 的一段代码片段:

WriteFraction(n) long n;
{
   unsigned short i, low, digit; unsigned long k;
   putchar(n < 0 ? '-' : ' '); n = abs(n);
   putchar((n>>fractionBits) + '0'); putchar('.');
   low = k = n << (longBits-fractionBits); /* align octal point at left */
   k >>= 4; /* shift to make room for a decimal digit */
   for (i=1; i<=8; ++i)
   {
      digit = (k *= 10L) >> (longBits-4);
      low = (low & 0xf) * 10;
      k += ((unsigned long) (low>>4)) - ((unsigned long) digit <<   (longBits-4));
      putchar(digit+'0');
   }
}

以下是最近发布到计算机历史博物馆的"Microsoft Word 1.1"的另一段代码片段。

c1

第二代 C++:OOP 革命

1989 年,C++ 2.0 发布,随后是 1991 年更新的第二版《C++ 程序设计语言》。2.0 的新特性包括多重继承、抽象类、静态成员函数、const 成员函数和受保护成员。1990 年,《带注释的 C++ 参考手册》出版,这部著作成为未来标准的基础。在 20 世纪 90 年代,OOP 变得非常流行,许多开发者采用了这一范式。Herb Sutter 在他的文章中将 OOP 的采用描述为一场革命:

请记住,人们至少从 20 世纪 60 年代末 Simula 的时代起就在做面向对象编程了。但 OO 直到 90 年代才成为一场革命并在主流中占据主导地位。为什么是现在?这场革命之所以发生,主要是因为我们的行业被这样的需求驱动:编写越来越大的系统,解决越来越大的问题,利用可用性越来越高的 CPU 和存储资源。OOP 在抽象和依赖管理方面的优势,使其成为实现经济、可靠、可重复的大规模软件开发的必需品。

第三代 C++:泛型与元编程

模板于 1991 年引入,当时只有少数 C++ 专家对泛型编程范式感兴趣,也很少有出版物讨论它。

Alexander Stepanov 是一位开创性的 C++ 专家,他探索了泛型编程的可能性,为开发 C++ 项目提供了一种现代方法。

这里是一份有趣的文档,题为《面向算法的泛型库》,由 Alexander A. Stepanov 和 David R. Summer 于 1993 年发表。

以下是作者在这份文档中阐述的动机:

We outline an approach to construction of software libraries in which generic algorithms (algorithmic abstractions) play a more central role than in conventional software library technology or in the object-oriented programming paradigm. Our approach is to consider algorithms first, decide what types and access operations they need for efficient execution, and regard the types and operations as formal parameters that can be instantiated in many different ways, as long as the actual parameters satisfy the assumptions on which the correctness and efficiency of the algorithms are based. The means by which instantiation is carried out is language dependent; in the C + + examples in this paper, we instantiate generic algorithms by constructing classes that define the needed types and access operations. By use of such compile-time techniques and careful attention to algorithmic issues, it is possible to construct software components of broad utility with no sacrifice of efficiency.

得益于 Alexander Stepanov、David Musser、Meng Lee 以及 C++ 标准化委员会的努力和出色工作,STL 的第一个版本于 1994 年问世。

STL 为 C++ 开发者带来了一股清新的空气;它提供了许多用于现代化 C++ 代码的实用特性,使 C++ 算法的实现与其 C 语言的对应物显著不同。

1998 年,一份关于 C++ 库仓库网站的提案由 Beman G. Dawes 发布,以开发 Boost。

Boost 是 C++ 编程语言的一组库,为线性代数、伪随机数生成、多线程、图像处理、正则表达式和单元测试等任务和结构提供支持。它包含八十多个独立的库。

第四代 C++:新标准

从 1991 年到 2011 年,这门语言演进缓慢,演进的动力来自 STL 和 Boost 这样的库。从 2011 年起,许多特性被加入到标准中:C++11、C++14、C++17 以及即将到来的 C++20。

以下是 Folly 库的一段代码片段,该库大量使用了新标准的特性。

c0

第五代 C++:与遗留 C++ 决裂

C++ 目前正在非常快速地演进。许多有趣的新特性正在被加入,另一些则被弃用。也许现在是时候移除一些语言特性了,即使这样做会破坏现有代码。

到目前为止,标准化委员会一直选择不对以往的 C++ 特性做破坏性变更。然而,这种做法在不久的将来可能会改变——事实上,这份最近更新的提案讨论了语言的稳定性,并试图回答以下问题:

  • C++ 是一门以激动人心的新特性著称的语言吗?
  • C++ 是一门以长期高度稳定著称的语言吗?
  • 我们是否认为升级到新的语言版本应该毫不费力?
  • 如果是这样,我们如何将这些毫不费力的升级与语言演进的实际需求相协调?
  • 如果我们转而将稳定性置于一切之上,我们是否注定要缓慢前行——只有当我们确信某个变更是正确的且永远不需要未来修复时才进行变更?

从这份提案中,我们得到这样的建议:

委员会应当愿意考虑提案的设计/质量,即使它们可能导致现有代码的行为变化或编译失败。

也许第五代将是对遗留 C++ 的一次决裂,移除一些从 C 继承下来的遗留特性。

分享本文