C++之父公开拒绝语言比较,C++20正式发布并揭秘关键特性

发表时间: 2020-12-22 20:00

12月4日,C++之父Bjarne Stroustrup参加了全球C++及系统软件技术大会。会议上,他发表了“C++20 与C++的持续演化”的主题演讲,详细阐述了C++20的主要特性、未来标准以及C++23的规划。



早在9月份,C++20国际标准草案获得一致通过,C++之父Bjarne Stroustrup就表示:“C++ 20是自C++11以来最大的发行版,它将是C++发展史上的里程碑。”这一发言引起了开发者们对C++20的广泛关注。



从正式版来看,像 Concepts/Ranges/Modules/Coroutines 这些新特性将会对开发者及 C++ 生态产生不小的影响,业界都相信C++ 20必将为系统级软件的开发、构建、设计带来更多的惊喜。


事实上,作为最受欢迎的编程语言之一,C++带给开发者们最大的惊喜便是其强大的特性。一方面跟C兼容,可以直面系统底层API,SDK,另一方面提供了很多范式,足够的抽象能力,面向对象,操作符重载,模板……


即便如此,Bjarne依然觉得C++还不够完美。“对必须工作几十年的语言来说,稳定性是一种重要的特征。我从一开始就知道,我不可能构建理想的语言,因此我必须以渐进式发展为目标:改进。说真的,我并不相信完美语言的想法:要怎样就算是完美呢?对谁来说(是完美的)?”


因此,为了应对行业的挑战,Bjarne一直活跃在C++开发的前线,认真对待开发者们的使用反馈。他曾说:“为了应对不断变化的世界的挑战,融入新思想,改进是必须的。”


别拿C++和其他语言做比较


C++的强大不仅在于对各行业系统的支撑,更在于其发展至今近40年来一直名列前茅,扛住了一波又一波新兴编程语言如Java、C#、Python等的攻势。


因此,不少人希望Bjarne做一些C++语言与其他语言的比较。但Bjarne拒绝了。他反复重申自己长期且强烈持有的一个观点:语言的比较很少是有意义的,也是有失公平的。


1.独特规则与语义之下的C++


“C++是一种通用的程序设计语言,应该让认真的程序员感觉到编程的快乐。”与其花费精力去和别的语言比较,Bjarne更关注C++本身对开发者的影响,他认为C++应该具有简单、平衡、自由、友好这四大目标。


  • 简单:在不要牺牲性能的情况下,让简单的事情保持简单,不要去复杂化本来的困难,使之成为可能。
  • 平衡:C++试图找到「抽象」和性能的平衡点,并将选择的自由留给程序员。
  • 自由:世界是多样性的,C++的多范式设计思维赋予了程序员极大的自由度和灵活性。
  • 友好:C++变得越来越友好,专家和学者对于这种友好性感触将更加深刻。


要成为真正有用而且人们乐于使用的东西,一个程序设计语言的设计就必须有一种全局观,用于指导语言中各种特征的设计。


对于C++,这种全局观由一组规则和约束构成,Bjarne称其为C++的规则。Bjarne认为把原理这个词用在一个真正的科学原理非常贫乏的领域,显得过于自命不凡,而程序设计语言设计就是这样一个领域。


此外,对许多人而言,术语原理隐含着一个不太实际的推论,也就是说,任何例外都是不可接受的。而Bjarne的有关C++设计的规则几乎可以保证都有例外情况。实际上,如果一条规则与某个实际试验发生冲突,这个规则就应该靠边站。


这样说,看起来似乎有些粗鲁,但是它不过是一条一般性原则的变形:理论必须与试验数据相吻合,否则就应该被更好的理论取代。


  • 一般性规则;
  • 设计支持规则;
  • 语言的技术性规则;
  • 低级程序支持规则。


这些规则绝不能不假思索地使用,也不能用几条肤浅的口号取代。Bjarne作为一个语言设计者,他的工作是决定对付C++语言里出现的问题,决定在C++的框架里能够处理的是哪些问题,并在实际语言特征设计的各种规则之间保持一种平衡。


谈及C++的成功因素时,Bjarne认为这些“设计规则和语义”功不可没。


这也是Bjarne不愿将C++与其他语言相比的原因之一。作为C++的创作者,Bjarne多年来倾尽心血,期望C++能更强大和灵活,以成为更为通用的编程语言。从某种角度来说,他很难对其他编程语言维持一种超然的不偏不倚的观点和一种平和的理性。


2.C++不仅仅是一座桥梁


“C++最初的设计目标:高效地使用硬件,再加上强大的抽象机制,并在实际使用反馈的基础上谨慎地改进。”Bjarne对C++的期望是其能作为一座桥梁,以便让程序员能够借助于它,从传统的程序设计过渡到基于数据抽象和面向对象的程序设计。


C++仅仅是一座桥梁吗?


一旦跨到某个世界,在那里数据抽象和面向对象的程序设计并不是那么自然,C++所提供的那些特征还有其本身的价值吗?


还有,假定上面问题得到的都是正面回答,那么在今后的十年里,程序员们为那些并不关心C兼容性的用户所做的任何事情,都不会对那些始终关心这个问题的人们造成损害吗?


语言的存在就是为了帮助开发者们解决问题。如果一种语言开始很成功,只要人们继续面临这个语言能帮助解决的同一类问题,它就会继续生存下去。进一步说,只要没有其他语言能在同类问题上提供明显优于它的解,它就应该还能繁荣兴旺。这样,问题就变成:


  • C++帮助我们解决的问题仍然是实在的吗?
  • 明显优于它的解出现了吗?
  • C++能为新的问题提供良好的解吗?


对此,Bjarne回答是“许多还将是”“慢慢地”和“是的”。


C++的长处,更多在于它对许多问题都是很好的解决途径,而不在于它对某个特定问题是最好的解决途径。


例如,与C语言类似,C++ 对于低层系统也是一个绝好的语言,对于这类工作,C++ 性能通常超过其他任何高级语言。当然,对多数机器系统结构,一个好的汇编程序员总能做出比很好的C++ 编译器还要小许多、快许多的代码。但这通常并不重要,因为在一个复杂系统里,这种存在显著差异的部分所占的比例非常小,而如果整个系统都用汇编语言写,那将是无法负担的,也是无法维护的。


Bjarne发现,要设想出一个应用领域,在那里人们不可能构造出某种优于C++,同时也能优于任何通用的程序设计语言的特殊语言,是一件极其困难的事情。这样,大部分通用程序设计语言最希望做的就是成为“每个人的第二选择”。


因此,Bjarne开始考察一些领域,在这些领域里C++有着根本的优势:


  • 低层系统程序设计;
  • 高层系统程序设计;
  • 嵌入式代码;
  • 数值/科学计算;
  • 一般应用程序设计。


这些类别并不是相互分离的,它们也没有已经被广泛接受的定义。C++ 将继续是所有这些领域中的一个很好选择。进一步说,任何语言要想成为一个好选择,那么在所提供的基本服务的层面上,它看起来应该很像C++,当然,或许不是在语法或者语义细节的层面上。


一直以来,Bjarne对C++的定位有着清晰的认知,也为C++能更好地适应环境变化而倾注心血研究,因此,像做比较这种需要消耗大量时间精力的事情,Bjarne是拒绝的,他更愿意和创造团队一起研究,让C++对开发者们更有效。


C++如何更高效


得益于Bjarne为C++设计的规则,让C++这门语言在许多领域得到了广泛的应用。


在软件开发的世界里,绝对没有骄傲自满的位置。在这些年里,人们期望的增长总是大大地超过硬件和软件的令人难以置信的增长。Bjarne表示他目前看不到有任何迹象说这些情况会很快改变。


“让 C++ 保持连贯性,并作为一个稳定的开发平台,这一点至关重要。”相比于期待C++能迅速改变,Bjarne更注重C++的连贯性。


在保持连贯性的基础之上,Bjarne开始为开发者们考虑一些更实际的东西,比如学好C++、高效运用C++等。虽然C++11的确让C++相较于之前变得简单快速了很多,但不可否认,C++仍然是开发者们很难掌握的语言之一。


“C++ 确实很复杂,要想学好、用好它,需要付出很多努力。不幸的是,人们不只是想要简单,他们还想要某种不可能的东西:一种更简单的语言,拥有更多的特性,并且还不会破坏他们现有的代码。” Bjarne承认C++的复杂难学,并为开发者们提供了两个重要的支持。


稳定性和标准

语言定义,关键性的库和接口的稳定性,应该列在未来进步的需求表里的最高位置。ANSI/ISO C++标准将提供前者,许多组织和公司在后一方向上工作,在各种领域中,例如操作系统接口、动态连接库、数据库接口等。在不久的将来,C++语言将成为在各种重要平台上都可以使用的东西,那将会大大地推动库和工具工业的发展。


Bjarne认为:“人们当然还会继续要求新特征,但我已经可以在这里描述的C++中生活了。我想,大部分产品代码的程序员也应该可以。特别值得提醒的是,没有任何单独的特征对于生产好代码而言是无可替代的东西——无论你怎样给出“好”的定义。”


教育和技术

对C++及其所有的应用领域而言,Bjarne认为对进步最有潜力的事情就是学习新的设计技术和编程技术。从原则上说,更有效地使用C++是最容易获得的进步,也最廉价。昂贵的工具并不是必需的。


在另一方面,改变思维习惯也不是很容易做的事情。对于大多数程序员而言,所需要的并不是简单的有关新语法的训练,而是有关新概念的教育。他预计,在今后几年里,我们将看到设计和编程技术方面的重大进步,这些方面当然没有拖延的理由。


开发者中的大多数已经在一个或几个领域里大大地落后于现状了,他们可以从一些阅读和试验中得到重要的收获,战斗在标准和工具的前沿上将更加乐趣无穷。


Bjarne认为,C++ 最有实力的地方并不是它的某个独到之处特别伟大,而在于它在事物的大范围变化中的表现都很不错。与此类似,从根本上说,C++发展也不是来自某个孤立的进步,而是来自在不同领域中的大量的各种各样的进步。更好的库、更好的设计技术、接受过更好教育的程序员和设计师、语言标准、可选择的废料收集、对象通信标准、数据库、基于非正文形式的环境、更好的工具、更快的编译等,都将会对此有所贡献。


因此,Bjarne认为,目前C++只是刚刚开始有所成效。基础已经建立,但也只不过是一个基础。面向未来,Bjarne期望能看到最主要的活动和进步能够从语言本身——这是一个基础——转移到依赖于它,在它上面构造起来的工具、环境、库、应用等方面去。


如何学习C++


C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。


C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。


对初学者来说,学习C++首选斯蒂芬·普拉塔的《C++ Primer Plus 中文版 第6版》作为入门图书。这本畅销近40年,豆瓣评分9.6,堪称C++程序员的“引路人”。从第一版出版至今已经升级到了第六版,作者坚持初心——致力于编写一本指导性强、条理清晰而且有用的C语言教程。所以,书中大量完整的、可运行的程序及详细的注释有助于理解代码和概念。


C++ Primer Plus(第6版)中文版

作者:[美]Stephen Prata

译者: 张海龙 ,袁国忠


C++ Primer Plus 第6版 中文版(异步图书出品)
¥59
购买


C++ Primer Plus 第6版 中文版(异步图书出品)

作者:[美]史蒂芬·普拉达(Stephen,Prata)

京东


内容简介:

史上畅销的重量级C++大百科全书,C++入门的首选图书,累计销量近百万册。


本书分18章,分别介绍了C++程序的运行方式、基本数据类型、复合数据类型、循环和关系表达式、分支语句和逻辑运算符、函数重载和函数模板、内存模型和名称空间、类的设计和使用、多态、虚函数、动态内存分配、继承、代码重用、友元、异常处理技术、string类和标准模板库、输入/输出、C++11新增功能等内容。


本书针对C++初学者,从C语言基础知识开始介绍,然后在此基础上详细阐述C++新增的特性,因此不要求读者有C语言方面的背景知识。


对已经对C++有所了解的开发者们来说,不妨读读C++之父Bjarne关于C++设计规则的图书《C++语言的设计和演化》。


C++语言的设计和演化

作者:[美]本贾尼·斯特劳斯特卢普 ( Bjarne Stroustrup )

译者: 裘宗燕

C++语言的设计和演化(异步图书出品)
¥49.5
购买

C++语言的设计和演化(异步图书出品)

作者:[美]本贾尼·斯特劳斯特卢普,[,Bjarne,Stroustrup,]

京东

在这本书中,Bjarne Stroustrup全面论述了C++ 的历史和发展,C++中各种重要机制的本质、意义和设计背景,这些机制的基本用途和使用方法,讨论了C++ 所适合的应用领域和未来发展前景。本书在帮助人们深入理解C++ 语言方面的地位无可替代,值得每个关心、学习和使用C++ 语言的专业工作者、科研人员、教师和学生阅读。


在这本书中,作者还从实践的角度出发,讨论了许多与程序设计语言、系统程序设计、面向对象的技术和方法、软件系统的设计和实现技术等有关的问题,值得每一个关心这些领域及相关问题的计算机工作者和学生们阅读参考。