《架构师》2020年10月
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

热点 | Hot

C++20 终于来了!

作者 万佳,Liam Tung,王强

近日,国际标准化组织(ISO)C++组,21工作组(WG21)正式通过了最终版本的“C++20”草案。

WG21 C++ISO委员会常任主席Herb Sutter 说:“在9月4日,C++20 的DIS (国际标准草案)投票结束,并获得一致通过。”

“这意味着,C++20现在获得了最终技术许可,并且完成了ISO投票。我们希望在完成最后一轮ISO编辑工作后,C++20能在2020年底正式发布。”

从历史标准来看,2020年的C++版本非常庞大。Herb Sutter表示,“它将是C++自C++11以来最大的发行版”,这意味着它比过去9年来发布的3个发行版都要大。同时,这也是第一个已标准化的版本。

C++是一门速度很快的编程语言,因而备受青睐。近年来,由于它在操纵硬件方面的实用性而日益流行。

在TIOBE公布的9月编程语言排行榜中,C++成为增长最快的编程语言。

回顾历史,C++的巅峰时期是在2003年,当年8月,它在TIOBE的排名峰值为17.53%,并夺得当年的年度编程语言奖。但2005年后,C++式微,在2017年处于历史低谷4.55%。但是,与去年相比,C++如今是榜单中增长最快的编程语言。

TIOBE CEO Paul Jansen认为,新的C++20标准带来了极大的正面影响,其积极趋势赶超其他编程语言。

在C++20中,最重要的两个特性是“模块(Modules)”“协程(Coroutine)”

据悉,模块(Modules)是由谷歌的Richard Smith提出的,它是针对头文件的改进,并在支持更大构建的同时有助于隔离宏的影响。

正如Sutter最近指出的那样,C++20标志着”大约35年来,C++首次添加了新特性,用户可以在其中定义命名的封装边界”。

“到现在为止,我们有了三种这样的语言特性,让程序员可以(a)将一个用户定义的名称(b)给予某个隐藏自身实现的事物,从而创建自己“语言的力量”。它们是:变量(封装了当前值)、函数(封装代码和行为)和类(封装两者以同时提供一堆状态和函数)。”

协程(Coroutine)则表示一个函数的泛化。C++的贡献者在协程的提案中解释说:“常规函数总是在起始处开始,然后在结束处退出,而协程还可以中止执行,之后在中断的位置继续执行。”

在一次邮件采访中,C++之父Bjarne Stroustrup曾表示,“对许多人来说,协程是个新事物。为了从中受益,必须学习一种全新的风格。不过,我认为这样做是值得的,因为这样可以使并发编程更简单、更快速。”并且,他还提到“协程已经是Facebook许多应用程序的基础”。

对于C++20, Bjarne Stroustrup心怀期待。在去年11月,他因公出差来到中国上海,InfoQ记者有幸对Bjarne博士进行了一次独家专访。在采访中,我们谈到了与C++20有关的几个问题。

他说,“我现在很有信心,C++20会非常出色。我经常提到,C++11用起来就像是一种全新的语言。C++20的提升幅度要比C++11更大,它会带来全新的感觉。我可以提一下我认为对整个C++社群而言会有极大帮助的特性,我觉得有两个。”

第一个特性是概念(Concepts),它是对范式编程中接口的精确规范,旨在提升范式编程的易行性与灵活性。因此,我们将看到更多的范式编程,代码呈现形式也将会有所变化。大家会获得更好的错误提示信息,并且可以更少地使用模板元编程。当然,编译速度也会更快。

另一个重要新特性是模块(Modules)。如果使用它整理代码,我们可以将代码编译速度大为提高(比如说快5倍以上),这一点非常重要。如此一来,大家就能够更迅速地完成编译而不需要在编译的间隙去喝咖啡打发时间了。同时,你也将消除更多的程序缺陷,因为你的代码将显得更加规整。

“我觉得再过几年,Concepts与Modules会重要到让大家都觉得不可或缺。”他说。

除此之外,C++20的新特性还包括范围、概念与约束(Constraints and concepts)、指定初始化(designated initializers)、计时、并行算法和对并发编程的一些改进等等。

在邮件采访中,他表示,“如果一个特性改变了我们对代码和软件开发的看法,那么我认为它就是一个主要的特性。”

当谈到对C++20的期望,Bjarne Stroustrup称“C++20将会非常棒!它有我为之奋斗了几十年的特性。我期望很多特性能够快速被采用。从C++98迁移到C++11很难,但是我们(标准委员会和实施者)在兼容性方面做得更好,所以从C++11迁移到C++14和C++17更容易。我希望向C++20的迁移会更容易一些。然而,如果你想从新的主要特性中获益,你确实需要修改代码。”