1.1.3 新C++语言的设计目标

如果读者已经学习过C++98/03,就可以发现C++98/03的设计目标如下:

❑比C语言更适合系统编程(且与C语言兼容)。

❑支持数据抽象。

❑支持面向对象编程。

❑支持泛型编程。

这些特点使得面向对象编程和泛型编程在过去的10~20年内成为编程界的明星。不过从那时开始,C++的发展就不仅仅是靠学者的远见前瞻去推动的,有时也会借由一些“奇缘”而演进。比方说,C++模板就是这样一个“奇缘”。它使得C++近乎成为了一种函数式编程语言,而且还使得C++程序员拥有了模板元编程的能力。但是凡事有两面,C++98/03中的一些较为激进的特性,比如说动态异常处理、输出模板,现在回顾起来则是不太需要的。当然,这是由于我们有了“后见之明”,或者由于这些特性在新情况下不再适用,又或者它们影响了C++11的新特性的设计。因此一部分这样的特性已经被C++11弃用了。在附录B中我们会一一列出这些弃用的特性,并分析其被弃用的原因。

而C++11的整体设计目标如下:

❑使得C++成为更好的适用于系统开发及库开发的语言。

❑使得C++成为更易于教学的语言(语法更加一致化和简单化)。

❑保证语言的稳定性,以及和C++03及C语言的兼容性。

我们可以分别解释一下。

首先,使C++成为更好的适用于系统开发及库开发的语言,意味着标准并不只是注重为某些特定的领域提供专业化功能,比如专门为Windows开发提供设计,或者专门为数值计算提供设计。标准希望的是使C++能够对各种系统的编程都作出贡献。

其次,使得C++更易于教学,则意味着C++11修复了许多令程序员不安的语言“毒瘤”。这样一来,C++语法显得更加一致化,新手使用起来也更容易上手,而且有了更好的语法保障。其实语言复杂也有复杂的好处,比如ROOTS、DEALII等一些复杂科学运算的算法,它们的作者非常喜爱泛型编程带来的灵活性,于是C++语言最复杂的部分正好满足了他们的需求。但是在这个世界上,新手总是远多于专家。而即使是专家,也常常只是精通自己的领域。因此语言不应该复杂到影响人们的学习。本书作者之一也是WG21中的一员,从结果上看,无论读者怎么看待C++11,委员会大多数人都认同C++11达成了易于教学这个目标(即使其中还存在着些看似严重的小缺陷)。

最后,则是语言的稳定性。经验告诉我们,伟大的编程语言能够长期存活下来的原因还是因为语言的设计突出了实用性。事实上,在标准制定过程中,委员会承担了很多压力,这些压力源自于大家对加入更多语言特性的期盼——每一个人都希望将其他编程语言中自己喜欢的特性加入到新的C++中。对于这些热烈而有些许盲目的期盼,委员会成员在Bjarne Stroustrup教授的引导下,选择了不断将许多无关的特性排除在外。其目的是防止C++成为一个千头万绪的但功能互不关联的语言。而如同现在看到的那样,C++11并非大而无序,相反地,许多特性可以良好地协作,进而达到“1+1>2”的效果。可以说,有了这些努力,今天的读者才能够使用稳定而强大的C++11,而不用担心语言本身存在着混乱状况甚至是冲突。

值得一提的是,虽然在取舍新语言特性方面标准委员会曾面临过巨大压力,但与此同时,标准委员会却没有收集到足够丰富的库的新特性。作为一种通用型语言,C++是否是成功,通常会依赖于不同领域中C++的使用情况,比如科学计算、游戏、制造业、网络编程等。在C++11通过的标准库中,服务于各个领域的新特性确实还是太少了。因此很有可能在下一个版本的C++标准制定中,如何标准化地使用库将成为热门话题,标准委员会也准备好了接受来自这方面的压力。