2.4 其他语言
人们常常会寻找其他编程语言对 C++ 的直接技术影响。其实非常之少。典型情况是,影响涌现自共同的前代语言和共同思想(而非特定的现有语言)。扩展 C++ 的决定性理由往往与 C++ 社区中已经发现的问题有关。直接从流行语言中借鉴的情况并不常见,而且比人们想象的要困难得多。大多数标准委员会成员都掌握多种语言,并密切留意(其他语 言中)有用的功能、库和技巧。
下面是其他语言在二十一世纪对 C++ 的某些真实或假想的影响:
auto
——从初始化器推断类型的能力。它在现代语言中很流行,但也已由来已久。我不知它的最早起源,但我在 1983 年实现这个功能的时候,也并不认为它很新颖(§4.2.1)。tuple
——许多语言,特别是源自函数式编程传统的语言,都有元组,它通常是一个内置类型。C++ 标准库tuple
及其许多用法都从中受到启发。std::tuple
派生自boost::tuple
[Boost 1998–2020](§4.3.4)。regex
——加入 C++11 的标准库regex
是(经由 Boost;已致谢)从 Unix 和 JavaScript 的功能中拷贝来的(§4.6)。- 函数式编程——函数式编程特性和 C++ 构件之间有许多明显的相似之处。大多数不是简单的语言特性,而是编程技巧。STL 受到函数式编程的启发,并首先在 Scheme [Stepanov 1986] 和 Ada [Musser and Stepanov 1987] 中进行了尝试(未成功)。
future
和promise
——源自 Multilisp,经由其他 Lisp 方言(§4.1.3)。- 范围
for
——许多语言中都有对应物,但直接启发来自 STL 序列(§4.2.2)。 variant
、any
和optional
——显然受到多种语言的启发(§8.3)。- lambda 表达式——显然,部分灵感来自于函数式语言中 lambda 表达式的应用。但是,在 C++ 中,lambda 表达式的根源还可以上溯到 BCPL 语言中用作表达式的代码块、局部函数(多次被 C 和 C++ 拒绝,因其容易出错且增加了复杂性)和(最重要的)函数对象(§4.3.1)。
final
和override
——用于更明确地管理类层次结构,并且在许多面向对象的语言中都可以使用。在早期的 C++ 中已经考虑过它们了,但当时被认为是不必要的。- 三路比较运算符
<=>
,受 C 的strcmp
及 PERL、PHP、Python 和 Ruby 语言的运算符的启发(§9.3.4)。 await
——C++ 里最早的协程(§1.1)受 Simula 启发,但是作为库提供,而不是作为语言特性,这是为了给其他替代的并发技术留出空间。C++20 中的无栈协程的思想主要来自 F#(§9.3.2)。
即使以非常直接的方式从另一种语言借用了某个特性,该特性也会发生变化。通常,为了适合 C++ 语法会发生很大变化。当从支持垃圾收集的语言借鉴时,生命周期问题必须得到解决。而 C++ 区分对象和对象的引用,这通常使得 C++ 需要以和原语言不同的方式来解决。在翻译
成 C++ 的过程中,经常会发现全新的用法。在把 lambda 引入 C++ 的过程中,出现了大量此类现象的例子(§4.3.1)。
在很多人的想象中,我(和其他参与 C++ 的人)整日无所事事,满脑子想的是在流行语言中如何占据主导地位,为这个复杂的语言战争制定战略。实际上,我并没有在那上面花时间。大多数日子里,我不会 去思考其他的语言,除非我碰巧出于一般的技术兴趣去学习一门其他语言或要使用它来完成一些工作。我要做的是与软件开发人员交谈,考虑人们在使用 C++ 时遇到的问题,还要考虑潮水般涌入标准委员会的改进建议。当然,我也编写代码来体验问题并测试改进思路。问题在于要能抽出时间冷静地考虑,什么是根本的, 什么只是一时流行,以及什么会造成危害。
同样,C++ 对其他语言的贡献也难以估量。通常,类似的特性是平行演化的,或有着共同的根源。例如:
- Java 和 C# 中的泛型——他们采用了其他语言的泛型模式,但采用了 C++ 语法,并且是在 C++ 大规模展示了泛型编程的用途之后,才添加泛型。
- Java、Python 等的资源弃置惯用法(dispose idiom)——这大致是在垃圾收集语言中最能接近析构函数的做法了。
- D 编程语言进行编译期求值——我向 Walter Bright 解释了早期的 constexpr 设计。
- C++ 基于构造函数和析构函数的对象生存期模型是 Rust 灵感的一部分。好笑的是,最近 C++ 经常被指责从 Rust 那里借用了这种想法。
- C 采用了 C++11 的内存模型、函数声明和定义语法、以声明为语句、
const
、//
注释、inline
以及for
循环中的初始化表达式。
C++ 与其他语言之间的许多差异源于 C++ 对析构函数的使用。这使得垃圾收集的语言很难直接从 C++ 借用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论