前言

一个人,如果不耕作,

就必须写作。

Martin A. Hansen

  ACM关于程序设计语言历史的HOLP-2会议要我写一篇关于C++历史的文章。这看起来是一个很合理的想法,还带着点荣誉性质,于是我就开始写了。为了对C++的成长有一个更全面更公平的观点,我向一些朋友咨询了他们对C++那些早期日子的记忆。这就使关于这个工作的小道消息不胫而走。有关的故事逐渐变了味,有一天,我忽然接到一个朋友的来函,问我在哪里可以买到我关于C++设计的新书。这个电子邮件就是本书的真正起源。

  在传统上,关于程序设计和程序设计语言的书都是在解释某种语言究竟是什么,还有就是如何去使用它。但无论如何,有许多人也很想知道某个语言为什么会有它现在这个样子,以及它是怎样成为这个样子的。本书就是针对C++语言,想给出对后面这两个问题的解释。在这里要解释C++怎样从它的初始设计演化到今天的这个语言,要描述造就了C++的各种关键性的问题、设计目标、语言思想和各种约束条件,以及这些东西又是如何随着时间的推移而变化的。

  自然,C++语言和造就它的设计思想、编程思想本身并不会演化,真正演化的是C++用户们对于实际问题的理解,以及他们对于为了帮助解决这些问题而需要的工具的理解。因此,在本书中也将追溯人们用C++去处理的各种关键性问题,以及实际处理那些问题的人们的认识,这些都对C++产生了重要影响。

  C++仍然是一个年轻的语言,许多用户对这里将要讨论的一些问题还不知晓。这里所描述的各种决策的进一步推论,可能还需要一些年才能变得更清晰起来。本书要展示的是我个人关于C++如何出现、它是什么以及它应该是什么的观点。我希望这些东西能够帮助人们理解怎样才能最好地使用C++,理解C++的正在继续进行的演化进程。

  书中特别要强调的是整体的设计目标、实际的约束以及造就出C++的那些人们。有关各种语言特征的关键性设计决策的讨论被放到了相应的历史环境里。在这里追溯了C++的演化过程,从带类的C开始,经过Release 1.02.0,直到当前ANSI/ISO的标准化工作,讨论了使用、关注、商业行为、编译系统、工具、环境和库的爆炸性增长,还讨论了C++CSimula关系的许多细节。对于C++与其他语言的关系只做了简短讨论。对主要语言功能的设计,例如类、继承、抽象类、重载、存储管理、模板、异常处理、运行时类型信息和名字空间等,都在一定细节程度上进行了讨论。

  本书的根本目的,就是想帮助C++程序员更好地认识他们的语言,该语言的背景和基本概念;希望能激励他们去试验那些对他们来说还是新C++使用方式。本书也可供有经验的程序员和程序设计语言的学生阅读,可能帮助他们确定使用C++是不是一件值得做的事情。

鸣谢

我非常感谢Steve ClamageTony HansenLorraine JuhlPeter JuhlBrian KernighanLee KnightDoug LeaDoug McIlroyBarbara MooJens PalsbergSteve RumsbyChristopher Skelly。感谢他们完整地阅读了本书的手稿,他们建设性的指教使本书的内容和组织都发生了重要变化。Steve BuroffMartin CarrollSean CorfieldTom HagelskjerRick HollinbeckDennis ManclStan Lippmann通过对一些章节的评论提供了帮助。还要感谢Archie Lachner在我还没有想到这本书之前就提出了对本书的要求。

  自然,我还应该感谢那些帮助创造出C++语言的人们。从某种意义上说,本书就是献给他们的礼物,他们中一部分人的名字可以在各个章节和索引中找到。如果要我点出一些个人来,那就必然是Brian KernighanAndrew KoenigDoug McIlroyJonathan Shopiro。他们中的每一个在过去十多年期间一直支持和鼓励我,也是提供各种想法的源泉。还有,感谢Kristen NygaardDennis Ritchie作为SimulaC的设计师,C++从它们那里借用了一些关键性的成分。经过这些年,我已经逐渐了解到他们不仅是才华横溢的讲究实际的语言设计师,而且也是真正的绅士和绝对亲切的个人。

Bjarne Stroustrup

Murray Hill, New York