C++发布至今已经有近40年,拥有无数研究者,其中有一位C++大师,曾发表100多篇C++相关论文,这些文章长时间以来以其朴实而又精深的思想、准确而又权威的论述、高屋建瓴而又平易近人的表达方式,成为业界公认的“正统C++之声”。这位大师就是C++演化的「革新者」,Andrew Koenig。
Andrew Koenig
他是AT&T大规模程序研发部(前贝尔实验室)成员。他从1986年开始从事C语言的研究,1977年加入贝尔实验室。他编写了一些早期的类库,并在1988年组织召开了第一个相当规模的C++会议。在ISO/ANSI C++委员会成立的1989年,他就加入了该委员会,并一直担任项目编辑。他已经发表了C++方面的100多篇论文,在Addsion-Wesley出版了C Trap and Pitfalls,(《C陷阱与缺陷》)和Ruminations on C++(《C++沉思录》),还应邀到世界各地演讲。
Andrew Koenig不仅有着多年的C++开发、研究和教学经验,而且还亲身参与了C++的演化和变革,对C++的变化和发展起到重要的影响。
Koenig出生于纽约,是物理学家Seymour H. Koenig博士的儿子,受父亲的影响,他从小就对理工相关的科目充满兴趣,高中毕业后,Koenig进入哥伦比亚大学计算活动中心(CUCCA)学习,在那里他编写了哥伦比亚大学使用的第一个电子邮件程序,成为CUCCA中的杰出成员。
1977年,他加入了贝尔实验室,开始从事C语言的研究。
没过多久,Koenig发现,对于经验丰富的行家而言,得心应手的工具在初学时的困难程度往往要超过那些容易上手的工具。刚刚接触飞机驾驶的学员,初航时总是谨小慎微,只敢沿着海岸线来回飞行,等他们稍有经验,就会明白这样的飞行其实是一件多么轻松的事。初学骑自行车的新手,可能觉得后轮两侧的辅助轮很有帮助,一旦熟练了,就会发现它们很是碍手碍脚。
这种情况对程序设计语言也是一样。任何一种程序设计语言,总存在一些语言特性,很可能会给还没有完全熟悉它们的人带来麻烦。令人吃惊的是,这些特性虽然因程序设计语言的不同而异,但对于特定的一种语言,几乎每个程序员都在同样的一些特性上犯过错误,吃过苦头!因此,Koenig就萌生了将这些程序员易犯错误的特性加以收集、整理的最初念头。
他第一次尝试收集这类问题是在1977年。当时,在华盛顿特区举行的一次SHARE(IBM 大型机用户组)会议上,Koenig做了一次题为“PL/I中的问题与‘陷阱’”的发言。做此发言时,他刚从哥伦比亚大学调至AT&T的贝尔实验室。Koenig在哥伦比亚大学实验室主要的开发语言是PL/I,而贝尔实验室中主要的开发语言却是C。在贝尔实验室工作的10年间,他积累了丰富的经验,深谙C程序员在开发时如果一知半解将会遇到多少麻烦。
1985年,Koenig开始收集有关C语言的此类问题,并在年底将结果整理后作为一篇内部论文发表。这篇论文所引发的回应大大出乎他的意料,共有2000多人向贝尔实验室的图书馆索取该论文的副本!Koenig由此确信,有必要进一步扩充该论文的内容,于是就写成了现在读者所看到的《C陷阱与缺陷》。
这本讲述C语言的书,自出版以来,历经14载,一直都被各个书评站点(或书评人)列入“重点推荐”的清单中。14年来,在它的18次印刷版本中,除去第二次印刷稍微修改过一些问题,以后的16次印刷,我们居然发现它的内容没有丝毫的变更!对于技术图书而言,其精确性与权威性也算是奇迹了吧。
在C/C++领域中,Koenig的名字如雷贯耳。作为一个知名的专栏作者,Koenig已经在各类杂志上面发表了上百篇的文章,给很多人在技术进步的道路上带来了极大的帮助。ACCU的Francis Glassborow对他的评价是:Koenig是世界上最出色的几位C++专家之一。
在书中,Koenig针对C程序在编译、链接的过程中可能碰到的种种问题以及编译、运行环境对程序可能带来的影响等,列出了许多值得开发者们注意的地方。按照Koenig本人的观点,前人碰到过的问题来现身说法,可以帮助开发者们避免那些一而再,再而三出现在他们程序中的问题。由于是以实例来描述Koenig所碰到过的具体问题,因此,此书少去了许多空洞无味的说教,虽然本书篇幅不大,但实际上,它的每个小节,每一段都蕴含着Koenig大量的经验教训,都值得开发者们去仔细琢磨,经常温习。为此,Francis Glassborow说到:“从我了解C语言开始,我就将它时时放在手边,经常翻阅。”
Koenig自己也在书中说:“如果你是一个程序员在开发中经常用到C语言,这本书应该成为你案头必备书籍。即使你已经是一个C语言的专家级程序员,仍然有必要拥有一本”。事实上,他并没有吹嘘,就书中所列出的种种问题,很多开发者们也表示不止一次在自己的程序中发现它们的踪迹,而且有些问题出现得还极为频繁。
那么Koenig又是如何开始使用C++的呢?
1980年,当时的Koenig还是AT&T贝尔实验室计算科学研究中心的一名成员。早期的局域网原型刚刚作为试验运行,管理方希望能鼓励人们更多地利用这种新技术。为了达到这个目的,贝尔实验室打算增加5台机器,这超过了他们现有机器数目的两倍。此外,根据硬件行情的趋势来看,实验室最终还会拥有多得多的机器(实际上,他们承诺使中心的网络拥有50台左右的机器)。这样一来,Koenig和他的同事们将不得不应对由此引发的软件系统维护问题。
维护问题肯定比想象中困难很多。类似于编译器这样的关键程序总在不断变化。这些程序需要仔细安装;磁盘空间不够或者安装时遇到硬件故障,都可能导致整台机器报废。当时的贝尔实验室不具备计算中心站的优越条件:所有的机器都由使用的人共同合作负责维护。因此,一个新程序要想运行到另一台机器上,唯一的方法就是有人自愿负责把它放到上面。当然,程序的设计者通常是不愿意做这件事的。所以,他们需要一个全局性的方法来解决维护问题。
Mike Lesk多年前就意识到了这个问题,并用一个名叫uucp的程序“部分地”加以解决。为什么强调“部分地”,是因为Mike故意忽略了安全性问题。另外,uucp一次只允许传递一个文件,而且发送者无法确定传输是否成功。
Koenig决定扛着Mike的大旗继续往下走。他采用uucp作为传输工具,通过编写一个名叫ASD(Automatic Software Distribution,自动软件发布)的软件包来为程序员提供一个安全的方法,使他们能够把自己的作品移植到其他机器上。Koenig预料这些机器的数量很快会变得非常巨大。他决定采用两种方式来增强uucp:更新完成后通知发送者;允许同时在不同的位置安装一组文件。
这些功能在理论上都不是很困难,但是由于可靠性和通用性这两个需求相互冲突,所以实现起来特别困难。Koenig想让那些与系统管理无关的人用ASD。他认为,想要达到这个目的就应该恰当地满足使用者的需求,而且没有任何琐碎的限制。因此,他不想对文件名的长度、文件大小、一次运行所能传递的文件数目等问题做任何限制。而且一旦ASD里出现了bug,导致错误的软件版本被发布,那就是ASD的末日。
在那种情况下,Koenig决定来看看能否用C++解决他的问题。尽管他已经非常熟悉C++了,但还没有用它做过任何严肃的工作。好在Bjarne Stroustrup的办公室离他不远,他们常常可以一起讨论关于C++演化的各种问题。
在他看来C++有这么几个特点对他有很大的帮助。第一个就是抽象数据类型的观念。另一个优势是Jonathan Shopiro最写的一个用于处理字符串和链表的组件包。
因为使用C++和上面的方案,Koenig解决了这个问题,ASD每年要在50台机器上进行4000次软件更新。使用C++使他得以在程序中从根本上更精确地表达他的意图。
“我想做的事情是,使程序员能更简单地把自己的工作发布到不断增加的机器中。解决方案必须可移植,还要使用一些操作系统提供的机制。当时还没有C++,所以对于那些特定的机器来说,C基本上就是唯一的选择。我的第一个方案效果不错,但实现之困难令人咋舌,主要是因为要在程序中避免武断的限制。
机器的数目迅速增加,终于超过负荷,到了必须对程序进行大幅度修改的时候了。但是程序已经够复杂了,既要保证可靠性,又要保证正确性,如果让我用C语言来扩展这个程序,我真担心搞不定。”
于是Koenig决定尝试用C++进行改进工作。结果是成功的:重写后的版本较之老版本在效率上有了极大的提高,同时可靠性丝毫不打折扣。尽管C++程序天生不如相应的C程序快,但是C++使他能在自己的智力所及的范围内使用一些高超的技术,而对Koenig来说,用C来实现这些技术太困难了。
在这以后Koenig被C++吸引住,很大程度上是由于数据抽象,而不是面向对象编程。C++允许他定义数据结构的属性,还允许他在用到这些数据结构时,把它们当作“黑匣子”使用。这些特性用C实现起来将困难许多。而且,其他的语言不能把他所需的效率和可靠性结合起来,同时还允许他应付已有的系统。
Andrew Koenig在C++的发展历史中具有不可置疑的权威地位。作为Bjarne Stroustrup的亲密朋友兼ANSI C++标准委员会的项目编辑,Koenig在C++的整个发展过程中发挥了极其重要的作用,是C++社群中最受尊敬的大师之一。
要说Koenig最大的贡献,就是带领Alexander Stepanov将STL引入C++标准。
在当时,大多数人认为计算机既神秘又能干,但在程序员的眼中,计算机又蠢又笨,唯一的优点就是运算速度比人快,不给指令什么都干不了,就是给指令,计算机也不能灵活运用。对于每一种数据类型,都必须给计算机设计一个单独的函数,实在太繁琐了,处理问题不灵活。
为了让计算机不断接近人类的认知能力,Koenig想了很多办法,比如使用面向对象开发技术,通过类的封装和函数重载,创建这样的类之后,当通过类对象调用 add 方法时,就无需考虑参数的具体数据类型了。但从某种程序上来说,这也仅是让计算机聪明了一点点。
最终,在Koenig不断努力研究下,C++ 引入了模板这个功能。成为了当时 C++ 的一个新特性。紧接着在 C++ 支持模板功能,引入了泛型编程思想的基础上,考虑到C++ 程序员们想编写出很多通用的针对不同数据类型的算法,Koenig于是将 STL 引入 C++ 标准程序库。Koenig认为STL 有高度的可用性、高效的模板库,掌握了 STL 标准,很多功能就无需自己费心费力地undefined去实现,直接拿来用即可。
Koenig在C++语言方面是一位真正的内部权威,他的编程经验超过30年,至今已经出版了超过150篇和C++有关的论文,并且在世界范围内就这个主题进行过多次演讲,直到退休之前他都全情投入计算机编程领域为之发光发热。
大多数人会认为,那些了解最多语言特性的人就是最好的程序员。在Koenig看来,这一观点并不正确:编程工作中最困难的部分并不是去学习语言细节,而是理解问题的解决之道。
Koenig曾经历过C++发展历史中很多非常重要的时期。比如C++曾受到了不公正的质疑和诋毁,个别新兴语言的狂热拥护者甚至迫不及待地想宣布C++的死讯。值得庆幸的是,C++在学术界和工业界中稳定地发展,人们对于C++特性的合理运用的认识也越来越丰富,越来越成熟和全面。
现在C++经过这么多年的积淀,已经进入真正的成熟发展时期,它的步子越来越稳健,思路越来越清晰,越来越演化为一种强大而又实用的编程语言。作为工业界的基础技术,C++还将在很长的一段时间里扮演不可替代的重要角色。
Koenig认为,C++一直是一门非常有趣的语言:它允许程序员们进行范围极其宽广的抽象。C++使我们更容易把程序看作抽象的集合,同时也隐藏了那些用户无须关心的抽象工作细节。
除此之外,C++在设计时考虑了特殊用户群的需求。许多语言的设计初衷是用于探索特定的理论原理,还有些是面向特定的应用种类。C++则不然,它使程序员可以以一种更抽象的风格来编程,与此同时,又保留了C中那些有用的和已经深入人心的特色。因此,C++保留了不少C的优点,比如偏重于执行速度快、可移植性强、与硬件和其他软件系统的接口简单等。
C++相关书籍很多,人人都想找到一份学习的辟邪剑谱,Andrew Koenig所著图书自然是C++学习中极为经典的著作,一起来看看吧!
C陷阱与缺陷
作者: [美]安德鲁·凯尼格(Andrew Koenig)
C 陷阱与缺陷 C编程高手的案头必备图书 ¥49 购买内容简介:
《C陷阱与缺陷》作者以自己1985年在贝尔实验室时发表的一篇论文为基础,结合自己的工作经验将这篇论文扩展成对C程序员具有珍贵价值的经典著作。
本书的出发点不是批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍。 《C陷阱与缺陷》分为8章,分别从词法陷阱、语法陷阱、语义陷阱、链接、库函数、预处理器、可一致性缺陷等几个方面分析了C编程中可能遇到的问题。
最后,作者用一章的篇幅给出了若干具有实用价值的建议。 《C陷阱与缺陷》适合有一定经验的C程序员阅读学习,即便你是C编程高手,本书也应该成为你的案头必备图书。
C++沉思录
作者: [美]安德鲁·凯尼格(Andrew Koenig) ,芭芭拉·摩尔(Barbara Moo)
内容简介:
《C++沉思录》基于作者在知名技术杂志发表的技术文章、世界各地发表的演讲以及斯坦福大学的课程讲义整理、写作而成,融聚了作者10多年C++程序生涯的真知灼见。
《C++沉思录》分为6篇,共32章,分别对C++语言的历史和特点、类和继承、STL与泛型编程、库的设计等几大技术话题进行了详细而深入的讨论,细微之处几乎涵盖了C++所有的设计思想和技术细节。本书通过精心挑选的实例,向读者传达先进的程序设计方法和理念。
《C++沉思录》适合有一定经验的C++程序员阅读学习,可以帮助他们提升技术能力,成为C++程序设计的高手。
本文编辑:王一凡 审校:桐希 郭泳泽
参考文献:
维基百科、《C陷阱与缺陷》、《C++沉思录》
—END—