Bjarne Stroustrup访谈

荣耀 马皓明 

Addison Wesley Longman公司Pradeepa Siva Crowell主持的对Bjarne Stroustrup关于《The C++ Programming Language》第三版的访谈。

1.C++编程语言比较难学的部分有哪些?您是怎么解决这个问题的?

什么东西难学要取决于你的背景。对于大多数人来说,学习C++最难的部分莫过于体会编程语言构件的内涵以及集中于应用中的概念。也就是说,要学会抽象思维,并且设计时要着重于类而非操作序列。

我对付这个棘手问题的办法是,在一个使用某项C++语言特性的情境中来介绍该项特性。对于诸如类、类层次体系这样的关键的C++设施,我对“语言所提供的内容”和“这些特性所支持的设计技术”的讨论是相辅进行的。

每一章都有一个结尾部分以一串“单行忠告”的形式总结这一章中的建议(以及对前文较详细讨论部分的引用)。我期望这些基本规则可以指导C++编程新手初步使用C++。有经验的C++程序员可以通过这些忠告来确定C++编程中多了哪些新内容,并以之作为试验这些新的编程和设计技术的起点。

2.透彻理解面向对象设计是学习C++所必不可少的吗?

两者是共生的。学习如何用好C++就是要学习如何掌握设计原理和实践。另一方面,就像仅通过阅读一本手册学不会骑自行车或跳舞一样,不动手构建程序是学不会面向对象设计的。实践和实验都是不可或缺的,而且只有通过使用一门合适的编程语言(比如C++)才能办到。因此,我在设计良好的小例子的情境中介绍C++特性。书中的设计部分总结并阐明了默默贯穿全书的原则和技术。

通常来说,这本书推进主题的方式是,先以具体而熟悉的内容开始,然后逐渐发展到更一般的内容。毕竟,我们多数人思考和学习的方式就是如此。以这种方式,我们总能通过具体例子帮助我们理解更普遍、更抽象的概念。

3.为了开发工业级应用,程序员需要对新的C++标准库有多少了解?

就像手头应用所要求的了解程度一样。严肃地讲,标准库提供了很多有用的设施,还有很多通用技术的范例。我从标准库中挖掘有用的技术。不过,使用一个库所需要的知识要比完全理解它所需要的知识少多了。我给出了各种设施的概览,以便人们选择他们需要的东西,并迅速找到有关其决定使用的库设施的更多信息。在阅读全书或在专门阅读关于库的部分之前(多数程序员会这么做),书中的详细索引和交叉引用对于使用标准库的程序员来说非常重要。

程序员可以在远未掌握高级C++特性之前就开始使用诸如vectors、strings、lists、maps、I/O流之类的标准库设施。在远未理解C++的C子集的诡异部分之前就可以使用这些库设施,对于没有C背景的人来说可是件幸事。

4.STL与标准库有何区别?

最初的STL是标准库中容器和算法部分的基础,而这些部分现在通常被称作“the STL”。因此,当你使用标准库给一个vector排序或合并两个lists时,你就是在使用STL。除了STL,标准库还提供了strings、I/O、numerics,当然还包括C标准库。

5.为什么C++是关键任务应用和大规模开发的最佳语言?

我认为把单独一门语言看作广阔应用领域的“最佳语言”是没有道理的。人和问题都有太大的差别。然而,C++的确是一门适合开发要求严格的应用的很棒的语言,而且标准化努力已大大增强了其适用于许多大型和关键应用的能力。

C++拥有“接近机器”的特性,使程序员能够完成效率要求最严苛的系统编程任务。数据抽象和面向对象编程设施使得这种基本的高效性被应用于大型且复杂的应用中。用于组织代码的设施对于开发这类应用来说,不可或缺。

我发现C++在一些横跨好几种传统应用领域的项目和组织(比如一个涉及到网络、可视化、数据库访问以及数值分析的项目)中具有真正的实力。更专门化的语言在跨越这些不同的领域时困难重重,而C++则允许程序员针对此应用的不同部分分别构建高效的支持库。毕竟,我最初创建C++的原因就是要将C的原生高效性与程序组织设施合为一体。

对于艰巨的项目来说,我认为C++的灵活性及其设施的基本高效性是至关重要的。企图以某种哲学的名义来限制程序员的手脚纯属自讨苦吃。世界是如此多姿多彩,变化是如此迅速,以至于容不得一门通用目的的语言带有“家长式作风”。我们应当鼓励程序员和设计师使用业已得到证实的技术,但我们不能企图通过限制语言提供的功能集强迫他们只能使用“良好的”风格,以达到限制其只能使用那些已被证明的技术的目的。那些“傻瓜语言”的问题在于那些“傻瓜”非常聪明。用任何语言你都可以写出糟糕的代码,要紧的是编写出优秀且优雅的代码有多么容易。对C++而言,其目标是允许人们在日常工业级软件开发的严苛要求下编写出优秀且优雅的代码。

6.最终标准草案意味着什么?ANSI/ISO标准化对于C++编程语言来说意味着什么?

“最终标准草案”就是提交给国际标准团体待以正式批准为一个国际(ISO)标准之前而制定的最终草稿。最终标准草案与国际标准之间不会存在重大差异。不过,国际标准团体会仔细校对最终标准草案以达到完整且表述清晰。这个阶段不会增添新特性,也不会移除目前已有特性。

拥有一份标准的主要好处就是稳定性。它为编译器提供了一个确定的发展目标。这将带来更强固的编译器、更多且更优秀的工具和库。

对程序员来说,标准提供了一个编写可移植代码的基础。必要的系统依赖性可被清楚地描述并加以隔离。从一位教师的角度来看,标准提供了一个讲授概念和技术的稳定环境。一个被广泛使用的标准语言和库非常重要,因为这可以确保所学知识被广泛运用,并且还确保所学知识在未来多年都实用。

另外一点也很重要:一份国际标准使得形形色色的公司要想“玩弄”这门语言更加困难,而且那样做的吸引力也大大减小。

7.自从本书第二版以来,鉴于C++语言尤其是其标准库已经取得如此大的发展,是否出现了新的教学挑战呢?

当然,但是标准库也提供了一个很好的教学机会。依靠标准库,我可以尽早展示更优秀的示例,并且可以把对诡异语言特性的讨论推迟到预计读者对C++有更多一点的经验之后。例如,对标准库vector和list的理解和使用,要比用内建数组类型和指针操作来实现等价功能容易得多。有了标准库,我们就可以将数组和指针用作高阶概念的实现细节。

详细解释标准库可是一大挑战。我尽早引入关键思想和设施以便人们可以使用它们,稍后再深入研究重要的细节。总的来说,书中应该有大约300页与标准库相关的内容。这个库并非单单可被使用,它还是一座蕴藏着有用设计和编程技术范例的矿藏。库中有威力强大且优雅的技术,它们超越了C++程序员的传统使用范围。

8.您认为哪项C++特性价值最大,哪项价值最小?

请问英语这门语言您最喜欢的是什么最不喜欢的又是什么?这样的问题难以回答,而且答案也很容易让人误解。

我讨厌源自C的语法、数组的某些方面以及内建类型杂乱的转型规则,这并不是什么秘密(细节请参阅《The Design and Evolution of C++》)。一项语言特性的优美主要体现在它以某种方式与其他特性相结合以便支持有用且优雅的编程技术。因此,很难孤立地表扬某项单独语言特性。尽管如此,请让我指出两个允许编写的确漂亮的代码的特性例子:抽象类以及重载决议与模板相互作用的方式。

C++中不存在什么大的过剩特性。假如你非要移除某项特性,必然会迫使某些程序员以一种更丑陋、较难维护且(或)效率较低的方式重写他们的代码。某些C++细节部分我不喜欢,但那些都属细枝末节。总的来说,我对经过标准化过程后形成的语言非常满意。标准C++比以前任何版本都更接近我最初的理想。我希望我的新书能向人们展示那是怎么回事儿并帮助他们利用最新的C++编写品质更好的代码。

9.在学习C++和Java之间,一个编程新手该如何选择?

既然Sun选择让Java的语法与C++极其类似,那语言间的对比就在所难免。然而,当你考虑该如何设计系统并编写优秀代码时(当然了,用任何语言你都可以写出糟糕的代码),Java和C++就截然不同了。尤其是,Java缺少C++提供的大多数用以支持灵活代码静态(编译期)检查功能。这导致Java代码依赖运行时设施。此一方式不适合C++程序,而且往往天生效率低下。

我认为如果你计划用C或C++进行严肃编程,你应该学习C++以及与之相伴的技术。学习多门语言总是有用的,严肃的程序员不应该仅懂一门语言。仅懂一门语言本身就是有局限的,学习第二、第三、…… 第十门等语言要比学习第一门时容易多了。不过,不要产生这样的误解:通过学习Java并将新学到的技能应用到C++环境中就可以成为一名优秀的C++程序员。同样的道理,对于学习C++就足以使你成为一名优秀的Java程序员,我也表示怀疑。

另一个问题是Java库与C++库差别很大。语法总是代码的最可见部分,不过往往也是代码的最不重要方面。

10.ISO标准化过程的部分内容是引进改变,您对改变的范围是否满意?还有其他什么应该包括的特性被遗漏了吗?

是的,我对标准C++及库基本满意。要是当时我有机会的话,某些细节我会选择不同的处理,但是没有任何一项主要特性是我希望移除的,或是任何一项“遗漏的”特性是我确实认为应该添进来的。与以往版本的C++相比,标准C++达到了一个新的优雅层次。这正是我或多或少从头写起《The C++ Programming language》的主要原因。新的设施以及技术要求的东西不能比这再少。一个轻微的修订版不足以恰当对待我们今天拥有的语言。