推荐序
在现代计算机的历史中,剑桥大学有着很重要的地位。1949年5月6日,剑桥大学制造的EDSAC计算机成功运行,成为世界上第一台具有完整功能的存储程序计算机。EDSAC是由剑桥大学数学实验室设计的,核心人物是莫里斯·威尔克斯(Maurice Wilkes)(1913—2010)。
1951年,爱迪生-韦斯利出版社(Addison-Wesley)出版了一本名为《为电子数字计算机准备程序》的书,书中介绍了如何为EDSAC计算机编写软件,这本书开创了一个新的出版领域,是出版历史中最早的软件编程图书。这本书的第一作者便是莫里斯·威尔克斯,第二作者是EDSAC团队的另一个成员戴维德·惠勒(David J. WHEELER)(1927—2004)。
1970年,剑桥大学数学实验室改名为计算机实验室。
1975年,一个来自丹麦的年轻人申请到剑桥大学读博士,面试他的便是莫里斯·威尔克斯和罗杰·尼达姆(Roger Needham)。罗杰于1962年加入剑桥大学数学实验室,后来成为微软欧洲研究院的首任院长。
今天回想起来,1975年的这次面试可谓阵容强大,两位面试官一位是EDSAC的总设计师,一位是后来的研究院院长。
两位资深的面试官轮番提问,一个问题接着一个问题,让被面试者难以应付,有点焦头烂额。不过虽然面试过程很痛苦,但是结果却非常让人愉快,被面试的年轻人通过了面试。这个年轻人便是今天被尊称为C++之父的本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)先生。本贾尼出生于1950年,25岁时就已经在丹麦的奥尔胡斯大学获得了硕士学位。这次面试让他得到了到现代计算机的摇篮之一继续学习的机会,也让他满足了女朋友的心愿。在到剑桥面试之前,本贾尼已经拿到了一所大学的邀约(offer),但他的女朋友说:“如果你能拿到剑桥大学的邀约,你应该选择剑桥。”
获得剑桥大学的学习机会,实现了女朋友的愿望,让本贾尼也很高兴。更重要的是,指导本贾尼博士学业的导师便是EDSAC的设计者之一戴维德·惠勒。
多年之后在本贾尼获得计算机历史博物馆的院士荣誉后接受采访时,他仍清楚地记得第一次到惠勒办公室时的情景。本贾尼坐下来后,想听听导师安排自己做什么。没想到,惠勒提出了一个问题:“你知道读博士和读硕士的差别吗?”
本贾尼回答道:“不知道。”
惠勒说:“如果一定需要我告诉你应该做什么,那么你就是来读硕士。”
本贾尼明白了,导师是让他自己寻找研究方向。于是本贾尼花了一年时间来寻找研究方向,经过大量的调查和分析,最后选择了分布式系统。
1979年,本贾尼在剑桥大学拿到了博士学位。经过一番努力,他最终获得了到大洋彼岸的贝尔实验室工作的机会。
于是本贾尼先生带着妻子和女儿从英国到了美国。贝尔实验室位于美国新泽西州的默里山。在本贾尼到达前,那里已经因为发明了UNIX和C语言而名扬天下。
到贝尔实验室报到后,本贾尼找到自己的主管,坐下来,想听听领导安排自己做什么。领导的指示非常简单:“做点有趣的东西。”
回想起当年在剑桥第一次接受惠勒导师指导的经历,本贾尼对这个回答已经不惊异了。而且感到非常高兴,因为可以按照自己的想法大干一场。
做什么呢?本贾尼在做博士研究时,使用了一种名叫Simula的语言,它的最大特点就是“面向对象”,可以非常直观地表达现实世界,代码很优雅。但相对于贝尔实验室里流行的C语言来说,Simula的效率不够高。一个伟大的想法浮现在本贾尼的脑海里,那就是做一种新的编程语言,它既有C的高效性,又有Simula的自然和优雅。
想好了就动手,本贾尼把自己的新语言临时取名为“带有类的C”(C with Classes),开始改造编译器。
开发一种新的编程语言是一项巨大的工程,定义语法、开发编译器、编写用户手册等。在这个过程中,本贾尼给自己的新语言取了一个简单的名字:C++。
经过近5年的工作,1984年,C++语言的参考手册在贝尔实验室内部发布了。
1985年,C++的商业版本对外发布,C++开始了走向世界的步伐。
我在20世纪90年代读大学时,专业课程里安排的编程语言有FORTRAN、C以及汇编语言,没有C++。但是在图书馆里,我找到了介绍C++的书。更重要的是,当年流行的Borland C++ 3.1集成开发环境里大量使用了C++语言,最著名的就是宝蓝(Borland)公司开发的窗口库OWL(Object Windows Library)。于是我开始自学C++语言,并且使用C++语言编写了一些程序,包括我的毕业设计程序。
2005年,在上海的C++大会上,第一次见到本贾尼先生,近距离聆听了他关于C++的演讲。从那以后,多次与本贾尼先生见面,与他谈论的话题也逐渐增多。
2019年11月,本贾尼先生亲临C++大会会场,演讲间隙与很多与会者微笑合影。特别是在与本贾尼的座谈结束后,很多人走到本贾尼身边,请求合影。本贾尼先生有求必应,座谈大约12点结束,我上了个卫生间回来,合影仍在继续。根据主办方的安排,这天的午餐是所有讲师与本贾尼先生共进午餐,因为合影,午餐被推迟了十几分钟。餐厅在5楼,午餐后有演讲或者想听演讲的讲师离开了,本贾尼先生继续在餐厅,一边喝茶,一边聊天,我与他聊到13点多后,因为有事也到4楼会场了。大约14点左右,我在会场侧面的卫生间门口,又见到本贾尼先生,他被一位同行拦住,请求合影。就是在这样“人生有三急”的情况下,本贾尼先生还是非常配合地与那位同行来了个二人合照。我当时真是佩服本贾尼先生的平易和温和。
从2010年起,C++语言走上了快车道,在过去10年间发布了4个版本,大刀阔斧地引入了很多新的特征。在C++11开始的4个已发布版本中,C++引入了100多个新特征。这么多新特征让很多人感觉C++仿佛成了一门新的语言。于是便有了现代C++的说法。
与经典C++相比,现代C++的学习难度也比较大。这意味着对于一些老的C++程序员,学习现代C++也是有挑战的。如何快速掌握现代C++呢?
在2008年《软件调试》第1版出版后,我在高端调试网站举办了一个书友活动,在那次活动中,一个年轻帅气的年轻人给我留下了深刻的印象,他风华正茂,目光炯炯有神。他就是谢丙堃,当时在武汉大学读书。
去年年底,丙堃发了一份书稿给我,是关于现代C++的,我翻看了一下,书中选取了现代C++的40多个特征,每个特征一章,从多个角度解读这个特征。可贵的是,书中不仅有代码示例,结合实际代码来说理,还有作者的很多感悟和经验分享。
现代社会中,每个人都忙忙碌碌,特别是程序员群体,大多忙得像个陀螺。人生就在这样的忙碌中一天天过去。偶尔的闲暇也往往被各种游戏和刷屏占据,顾不上思考人生的方向和怎么实现目标。丙堃能在工作之余,坚持3年之久,日积月累,沉淀下这样一份书稿,真是难能可贵,钦佩之余,略缀数语于书前,聊表寸心。
张银奎
2021年3月于盛格塾