作者之声

C++编程语言被重新定义

荣耀 马皓明 

Bjarne Stroustrup,C++之父,与Amazon.com谈论他最新版的权威著作、即将出炉的ISO C++标准、商业性工具的质量、Java的价值以及C++编程的未来。

Tom Mace, Amazon.com:请问为什么您要更新《The C++ Programming Language》?读者打开书本后将会发现哪些新内容?

Bjarne Stroustrup:可能大部分读者会注意到对标准库的广泛讨论。据我所知,此前没有任何C++教本对标准库的论述达到如此广度和深度。另外,读者还会注意到对技术和设计的强调。所有关键的语言特性都有描述,而且这本书的组织方式是按照逻辑顺序来介绍各种语言特性的。不过,每一项特性都在一个合理的使用情境中予以展现,目标是为了帮助读者免于陷入“精力只放在有损于良好编程的语言技术细节”的常见陷阱。

许多人对这第三版改写的彻底程度表示惊讶。基本上,和第二版相比,大约80%的材料是新的,而且内容组织也被广泛修订,以反映过去大约六年中我们学到的关于C++的使用的很多知识。这本书反映了C++的演化及应用的一个重大进步。

Amazon.com:自从上一版出版以来,对语言最重要的修改有哪些?

Stroustrup:实际上,最重要的修改并不在语言方面,而是标准库的加入。令人惊讶的是,我的第二版图书仍然足以配合大多数C++实现品只是到最近,实现品才赶上并超过第二版中阐述的规范。然而,对于模板和异常机制又有了新的精化处理。另外,运行时类型识别(RTTI)和名字空间对多数人来说都是新东西。标准C++还提供了很多细微的改进,例如在条件中的声明和布尔类型。自然而然,《The C++ Programming Language》涵盖了所有这些内容。

然而,语言特性所支持的技术才是关键。对正文和组织方式所做的大多数修改,就是为了反映语言和标准库的崭新的、更好的使用方式。

凭借标准库,我可以使语言对于C++新手来说更容易上手。通过使用诸如vector、list和map这样的库类型,我可以推迟讲述C风格的指针和数组操作的棘手之处 — 直到预计读者已经熟悉了基础内容之后 — 甚或将那些内容放进一个附录之中。

这并不意味着《The C++ Programming Language》被掺水了。我的目标是写一本本质上能为每一位严肃的C++程序员提供大量信息的书。我认为我已经接近了这个理想。一些极富经验和造诣的C++程序员帮我检阅了草稿(你可以在致谢部分看到他们的大名),他们每一位通过努力也学到了一些重要的东西。

Amazon.com:请问您改变了书的组织方式了吗?

Stroustrup:了解我的第一版和第二版书的人会注意到,参考手册部分已经被对库的描述而取代了。鉴于C++国际标准即将面世,我认为由我来提供解释标准的手册是不合适的。作为补偿,教材形式的正文部分的一些地方更加详尽了,还有几个附录提供了必要的参考资料(比如完整的C++语法)。

这本书的内容组织如下:

导论:第1~3章给出的对C++语言、它所支持的关键编程风格以及有关C++标准库的概观。第一部分:第4~9章是有关C++内建类型以及由它们出发构建程序的基本功能的教材形式的介绍。第二部分:第10~15章是有关使用C++进行面向对象和泛型编程的教材形式的介绍。第三部分:第16~22章介绍C++标准库。第四部分:第23~25章讨论设计和软件开发的问题。附录:附录A~C提供了语言技术细节描述。

与第一版和第二版一样,我的目标是提供一些有价值的内容,它们既可作为严肃程序员的指南,又可作为未来几年的参考资料。

Amazon.com:那些极好的习题会被改变吗?我们能否期待配合新版本的沿袭Tony Hansen的《The C++ Answer Book》路线的书籍的出现呢?

Stroustrup:有很多新习题,不过以前大多数好东西都被保留下来。Tony Hansen针对第一版习题的解答通常仍然有效,这很有意思。但在很多情况下,更新的语言特性以及库使得改良的解答成为可能。

Addison-Wesley计划推出一套优秀的解决方案,但具体做法和时间都还没有最终敲定。

Amazon.com:撇开所有参与者都有着最好的意图不谈,标准团体的审议过程是出了名得慢。ANSI/ISO C++标准化进展如何?是重要的语言特性方面还存在突出问题,抑或只是有一些细节问题尚需推敲?

Stroustrup:正式的标准化过程缓慢曲折。标准团体不断“改进”关于“怎么来制定标准”以及“标准是什么样子”的规则,但无济于事。然而,正式的标准化的唯一替代选择就是被一家商业公司自私任性地控制。

我们可能总会讨论是什么构成了一项“主要”特性,但我认为一个“需要最终敲定一些细节”的问题更接近事实。没有什么新的语言或标准库设施将会被引入这个标准,现有内容也没有什么需要拿掉的。我们正处于最终草案阶段,专注于现有特性集的精确规范。重大改进(以及重大破坏)的阶段已经过去。这正是我现在完成第三版的主要原因之一。它描述了未来5到10年内伴随我们(快乐地 — 我希望如此)生活的语言。

Amazon.com:您希望C++ ISO标准何时被采纳?

Stroustrup:我希望最终草案能在11月份提交给国际标准组织投票表决。那以后,甚至小到不起眼的打字错误也需要耗费大量精力,但正常来说,ISO和国际标准团体要不字斟句酌一段时间,就不可能诞生一个标准。

Amazon.com:C语言未来还能生存吗?您会推荐用它来做某些工作吗?

Stroustrup:C是而且将会保持是一门有生存力的语言。不过,我怀疑你的真正意图是想问问是不是有什么事情使用C比使用C++来做更好。在我看来,使用C的唯一理由就是,你碰巧被限制于一个没有C++编译器的环境中,或者工具集不认可C++的地方。

作为一门语言,C++在每一个领域都比得上或者超过C,而且使C++编译器生成代码的性能与C匹敌或超过C都不存在任何重大问题。因为C++是一门更富表达力的语言,所以可能需要花费较长的编译时间 — 特别是当你使用诸如模板这样的威力强大的特性的时候。程序员应该切实理解他们所依赖的C++特性的运行时含义。不过,如果对C++已经有了一个不错的基本理解的话,这并不难做到。自然而然,《The C++ Programming Language》对此可以提供帮助,但一个程序员可能还要考虑读一读《The Design and Evolution of C++》,以便了解C++语言的设计原则是如何影响语言特性和技术的基本功效的。

Amazon.com:当C++被用来封装商业性APIs(比如Windows)时,您是否感到惊讶?

Stroustrup:我对Windows感到惊讶,不过对于使用C++来做封装我并不感到惊讶。毕竟,这正是C++被设计用来做的工作之一。自然,《The C++ Programming Language》第三版描述了封装和接口设计技术。我猜想, 假如Windows APIs的设计者有一本我的第三版图书并使用书中描述的语言的话,那些APIs对于程序员来说将会更好用。

如果《The C++ Programming Language》描述的是跟特定API对立的“纯粹的C++”,那将毫无意义。原则上,书中的示例可以运行于任何地方,而且所描述的技术适用于任何C++编译器。

Amazon.com:您感觉那些商业性C++工具的质量怎么样?

Stroustrup:它们还有很长的路要走。特别地,我认为PC供应商们已经把重点放在华而不实的图形特性上而影响了针对关键语言机制的坚实工作。这尤为可悲,因为针对基础东西(例如,为具体类型(concrete types)生成优秀的代码,高效的内联,良好的模板展开功能,更好的错误侦测,以及更好的出错消息)的少数几个“人年”的工作努力就可以给无数程序员带来直接而显著的好处。

我希望,随着标准将语言稳定性提升到一个新水平,编译器供应者们会因此受到鼓舞,从而为基本编译器技术所要求的质量进行相对小的投资。

Amazon.com:作为一门语言的Java以及作为一个软件执行平台的虚拟机,您对它们有何看法?

Stroustrup:匪夷所思的过度吹嘘。我对围绕在它的广告周围的高智商欺骗程度感到不快。它可能是适合运行小型自包含系统的一个不错的平台,但它却被颂扬为针对所有问题、所有程序员的解决方案 — 它不是 — 没有任何语言和系统是。甚至连平台中立问题也并非像看上去的那样了无瑕疵。随着Java库被扩展以支持更多的应用领域,这些库本身就成为一个平台。随着供应商们添加新的便利设施,在使用来自相互竞争厂商的不同设施的机器之间的移植性,需要妥协折衷。

人们常常声称Java类似于C++。这种相似性不过是表面现象而已。语法类似,但计算模型、基本效率、表达力以及很多关键编程技术大不相同。当你考虑各种库需要高效运作时,这两门语言看上去区别甚至更大。Java并未很好地符合C++的设计准则,甚至Java都不接近C++的设计准则。鉴于它有自己的与C++差异很大的设计准则,我想它不可能接近C++的设计准则。同样,C++也不符合Java的设计准则。

我确信Java会有一个合适的生存环境,就如同别的语言一样。我只是觉得大张旗鼓的广告宣传很犯嫌。我发现Sun的广告词“纯粹百分百,没有非Java代码”尤其讨厌 — 也有点可怜。Java不可能为它的供应商(们)“同时”提供平台中立性和主要的利润来源。

Amazon.com:对于C++近期以及长远的将来,您有哪些看法?

Stroustrup:在不远的将来,我预见C++的使用会从一个巨大的基础持续稳步增长。从长远来看,我认为最佳状况还没有到来。标准将极可能导致编译器质量的大幅改进以及工具和库的数量爆炸。我已经看到了这样的一些东西,并且发现C++编程比以往更让人感到享受。