作者介绍Scott Meyers,C++顶级权威之一,为世界各地客户提供培训和咨询服务。发表有畅销的Effective C++系列图书(《Effective C++》、《More Effective C++》和《Effective STL》),设计了创新型的Effective C++ CD,Addison Wesley的Effective Software Development Series顾问编辑,The C++ Source (http://www.artima.com/cppsource/)咨询板块专家。布朗大学计算机科学博士,他的网站是www.aristeia.com。
C++是一门技术,而其背后支持它的是人——这些人发明、完善、繁荣和应用技术。本周,我将介绍我心目中最重要的五位C++大师。
本周名单上的这些人都拥有巨大的公众影响力。这些“公众人物”(抱歉,都是男性,不过我也没办法)能对很多人产生直接影响。受你影响的人越多,你自然就越重要。
不过,在系列的开篇文章里我也提到过,我是一个C++局外人。可能还有一些在台前幕后对C++产生了重要影响的人物不为我知。Stroustrup或许只是为众多技术工作者代言,标准委员也可能是替代一些不愿抛头露面团体做前台表演。如果是这样,那他们还真的达到目的了:我不知道他们。当然也就不会出现在我的名单上。
另外,我对入选者还有两点要求:(1)应该长期从事C++工作;(2)现在仍在为C++工作。重要的人很多,但最重要的人应该是长期而持续为C++做出贡献,并且直到现在仍在努力。
好了,现在公布我的名单,以较之新闻组文章更正式发表物(当然,这肯定比他们实际开始C++工作的时间晚,因为任何成果在产生影响力前都需要一个周期)的时间为序。在此,我仍然限制为五个名额,没有并列,也没有荣誉奖。因为我这是品活人而不是评静物,难度很大啊。规矩就是规矩,我必须要坚持。
Bjarne Stroustrup(http://www.research.att.com/~bs/homepage.html),1985年至今。嗯,怎么说呢,他是C++发明人,并编写了第一个编译器,还撰写了大量文章和图书(参见http://www.research.att.com/~bs/papers.html),积极参与C++的普及与标准化工作,并且一直持续到今天(如最近的SELLs(http://lcsd05.cs.tamu.edu/papers/stroustrup.pdf)和STAPL(http://parasol.tamu.edu/groups/rwergergroup/research/stapl/,合作者)研究项目)。本来,Stroustrup很多年前就可以退休了,躺在无数的赞誉声里懒洋洋地晒太阳。但他却选择了继续他30年前就开始的研究工作,这是对现代C++(最开始叫“C with Classes”)发展的巨大贡献。尽管我无意评比名单入选人孰轻孰重,但很难想象C++领域里还有谁比发明、最初实现,然后又引导它融入现代软件开发的人更为重要。
Andrew Koenig(http://www.acceleratedcpp.com/authors/koenig/),1988年至今。Andrew Koenig应该是绝无仅有、即便没有撰写任何C++文章和图书也能进入这个名单的人。他是一位真正的C++内部权威,这一点因其写作历史而少为人知。他撰写过两本C++图书(与Barbara Moo合作。译者注:Moo为Koenig夫人)、一本C图书(我没打算用这个为他在C++上加分,但即使这样,他仍然……)和大量专栏文章(可参看其主页上的介绍)。
不过,Koenig最让我感到吃惊的是别人对他的提及率,特别是在C++标准化方面。他一直是引导公众认识STL重要性的践行者,并带领Alexander Stepanov(译者注:原Compaq首席科学家,现Adobe首席科学家,STL之父)将STL引入C++标准。
我已经记不清多少次听到或读到标准化委员会成员类似这样的话了:“我们也在考虑这个问题,但Andrew指出……”,“那的确是个问题,不过Andrew建议……”。事实上据我所知,Koenig是唯一被以其名字命名C++语言特性的人——在标准化工作中,人们发现命名空间相关的名字搜索规范有时会导致编译失败,比如:
std::cout << someObject;
Koenig对此提出了修改意见,这就是后来的“Koenig lookup”[注释1]。在标准中,此规范的官方名称是ADL(argument-dependent lookup),但《Standard》对其的详细描述,则是“[basic.lookup.koenig]”(如果你一定要知道出处,那我告诉你,3.4.2小节)。
Scott Meyers(http://www.aristeia.com/),1991年至今。同样,我必须拿出真凭实据说明我的重要性,而不是靠主观臆断。我会尽量保持客观,用大量事实证明我在C++世界留下了自己的印记——或许是一个伤痕。我写过3本书(像我妻子那样不算再版,如果算上再版,就是6本),发行量都很大。我还撰写过近50篇有关C++及其应用的专栏文章,并且这些年来,我还在不少会议和开发者大会上做过报告。我公布的很多技术规范也成了C++最佳编程实践的一部分[注释2],不少厂商提供的“lint-like”C++检测工具都支持我的规范,它们常常将我的规范作为指导意见。
显然,我在C++标准工作中也扮演了一个小角色。嗯,别误会(译者注:他并没有正式从事C++标准工作,具体可见http://blog.csdn.net/lxpbuaa/archive/2006/11/09/1375988.aspx中他对自己的说明),我的意思是至少有两份标准建议稿,都受到我的影响:“我们还需要进一步讨论这个问题,因为即便Scott Meyers也还没弄明白”(如TR1中有关增加智能指针的建议部分(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1450.html),可以在页面里搜索我的名字)。
Herb Sutter(http://www.gotw.ca/),1997年至今。Sutter走上C++舞台不过10年时间,但其活跃程度几乎让人瞠目结舌。最早是自撰三本图书,和人合著一本。他发表过200多篇文章(绝大部分是独立作者,少量合作),特别让人吃惊的是,他同时是三个专栏的长期作者或合作者[注释3]。我也记不清他为C++标准化委员会提交过多少建议和其他文件了——我好像提到过他是该委员会主席吧?他还是《C++ Report》前任首席编辑,在各种会议和技术大会上做报告,他一直是我知道的对C++最具热情的鼓手。同时,面对性能敏感应用支持的日益紧迫,他还在多线程领域首倡抽象再构造,并为此寻找新方法——可能就是C++语言和库的未来扩展方向——以让开发者更加容易编写多线程代码。[注释4]
Andrei Alexandrescu(http://erdani.org/),1998年至今。是他的《Modern C++ Design》(http://www.artima.com/cppsource/top_cpp_books.html#mcppd)促成了我们模版思想的巨变,从此,Alexandrescu的名字也就和模版紧紧相连。甚至在一些场合下,他的名字就是模版的代名词,但这对他是不公平的。他对C++的贡献,远远不仅仅是尖括号的新用法(尽管就我所知,他是第一个描述“template template parameters”——即将模版作为参数在模版编程中使用——用法之第一人)。
即便抛开与Herb Sutter合著的《C++ Coding Standards》(Addison-Wesley, 2005),他发表的40多篇文章(http://erdani.org/publications/main.html)也充分展示了他在对象拷贝(object copying)、对齐约束(alignment constraint)、多线程编程、异常安全和搜索等领域的巨大贡献;他常常将性能提升看得比符合标准更为重要。以我看来,近几年来工作值得我们一直关注的,仅此Alexandrescu。绝大多数其他写作者和报告人(包括我)时常会奔回收割过的田野一遍遍巡视,以期捡到遗留的麦穗,而Alexandrescu却以其无人望其项背的速度,不断开荒,还在里面种上了新的庄稼[注释5]。
截至目前,我已经开出了C++历史上最重要的图书、文献、软件和人物名单。这些名单相对来说是比较客观的,但在此系列的最后一篇文章里,我想抛开客观,完全表达下自己的主观想法。下次,我将列出C++最重要的五个历史时刻——五个突然来临后,我对C++语言、工作方式及其应用的认识达到新高度的时刻。
注释:
1.简单来说,Koenig lookup指的是:如果函数的参数类型定义在名字空间内,那么函数被调用时,首先应该在此名字空间内搜索被调用函数,然后再是其他地方。比如调用“std::cout << someObject”,应该首先在定义someObject的名字空间内搜索操作符“<<”的实现。像<<这样的操作符函数,如果在被它操作的类型的名字空间内也有定义,Koenig lookup就发挥作用了。
2.我这些年公布的大多数规范都已经成为C++社区的“基本常识”。我的主要贡献不是去自己发明发现这些规范,而是普及之。
3.如果你像我一样,也作过专栏作家,那么你就能更容易理解其工作量之浩繁。我已经很难做到一年六次跟踪那些值得阅读的东西,而Sutter众所周知是每月三次。
4.他还是Microsoft的C++/CLI首席架构师。将这点放在注释里说明,是因为我认为C++/CLI是C++的一个分支语言,而不是C++本身的一部分。直到现在,我仍然搞不清他哪来那么多时间同时开展这么多工作。
5.当然这并不是说所有他写的和提到的东西都是他首创的。尤其是他2001年开始读博士后,也常常会将学术上的研究成果传播到C++社区,例如无锁编程(lock-free programming)(http://erdani.org/publications/cuj-2004-10.pdf)。