《C++ Primer》作者Stanley B.Lippman谈C++语言和软件产业的发展

摘要:《C++ Primer》作者Stanley B.Lippman到访中国,并于10月27在由CSDN主办、电子工业出版社博文视点协办的CSDN TUP大师系列线下活动上做了主题演讲,介绍了C++的新进展,本刊特约记者对Lippman进行了采访。

金秋10月,《C++ Primer》作者Stanley B.Lippman到访中国,并于10月27在由CSDN主办、电子工业出版社博文视点协办的CSDN TUP大师系列线下活动上做了主题演讲,介绍了C++的新进展。活动间隙,本刊特约记者对Lippman进行了采访,形成此文。


勉励中国程序员要加强创新

《程序员》:您好,Lippman先生,欢迎来到中国。我们上次见面,还是在2004年的微软TechEd期间,如今已经过去近10年了。您感觉中国软件行业和软件社区有哪些变化?

Lippman:事实上,我2009年还来过一次中国,那时在上海首次发表了现在称为Hugo的研究项目的主题演讲。

这些年,我所认识的大多数曾在微软等美国企业工作的中国人,现在都工作于中国国内企业了。而中国开发者社区则明显表现出了更强的自信心,或者说独立性。我是说,在2004年时显得更偏向于由西方主导,而现在更偏向于中国国内主导。

《程序员》:那么,您认为这种自信心源自哪里?

Lippman: 源自他们取得的成就。例如,你们已经有了自己的如同Facebook一般的社交网络工具,也有了自己的互联网。我2009年就去过中国的一家大型公司,深 刻感受到它做得非常成功。在那家公司里,我遇到不少曾在微软研究院的熟人,他们已经加入了那家公司了,而且他们显得信心满满,觉得自己就代表着未来。

《程序员》:您是否认为,现在中国的软件社区和是否越来越不受西方驱动了,并且拥有它们自己的想法和创新意识了?

Lippman: 我认为这还有待见证。这就好比自由软件基金会。光有设想还不能算是创新。自由软件基金会其实没做过太多有意思的事情,他们所做的大多数工作就是克隆现有的商业软件。而从目前看来,中国的软件社区做出来的有意思的事情也比较有限,它们也还是在创建一整套业界现有软件的仿制品。

但我期望看到的是,你们能够做一些创新的事情。目前而言,大多数的软件创新都还来自别处。你们要看一下自己的特色是什么。美国计算机行业现在变得相当软弱,人们不再勤奋 地工作。他们被惯坏了,只想快速赚钱,并且不再努力工作。中国的优势, 或者说中国程序员的优势在于,他们很勤奋地工作,并且渴望成功,愿意遵守纪律,也很投入工作。而在美国我看不到这种气氛了。

所以我认为,你们有着足够的能力在你们的国家做出伟大的事情,但这个时刻还不能说已经到来了。

《程序员》:我觉得您的说法是要鞭策我们不只是勤奋地工作,还要聪明地工作。

Lippman:就是这样。

回忆C++语言诞生时期的峥嵘岁月,在贝尔实验室的黄金年代

《程序员》:您刚才说到,美国业界的目前情况是,人们不再努力工作。但我想,在30年前肯定不是这样。而您则经历过那个时代。我不知道您是否还记得,C++编 程语言最初的那些实现中,是否有一些完全由您实现出来的功能,如果有的话,您能否告诉我们您是如何设计它,以及它的哪些部分比较有意思呢?

Lippman: 我一向热衷于编译技术。当我开始与Bjarne合作工作于Cfront时,我在1983年从Jerry Schwartz那里了解到了C++。当时Jerry工作于Steve Johnson的一个名叫NAIL的项目,即“新一代中间语言”,全部由C++实现,而我当时则在从事C++语言组的测试工作。然后,在1985 年,Bjarne决定发布Cfront,即后来被称为“发行版1.0”的实现。之所以这么急迫是因为,如果C++老是处于实验阶段,而没有官方技术支持的 话,那么大学里的研究生就无法使用这门语言来做研究。我们为了让C++能够成功发布而很努力地工作着,而我做的是测试工作。我问了一些很有难度的问题,他 对我做测试时的思路感到满意。

《程序员》:“他”是指Bjarne还是指Schwartz?

Lippman:Bjarne, 他因为Cfront发行版1.0的工作而注意到了我,因为我总是询问有关该语言的问题。你知道,那时我们对C++做了种种严苛的测试来发现Bug。而我还 会问他一些微妙的问题,诸如某种特定代码的行为应该是怎样的,所以当我从测试小组转到编译器小组时,我可以选择做代码生成——这正是我感兴趣的——或者做 Cfront。我当时不太想做Cfront,因为我对于前端没有兴趣,因为前端的逻辑很混乱,我是说,它没有一定的规则。而后端的工作,则有逻辑、有算法 得多。

我的朋友Barbara E. Moo当时是我的导师,我早已认识她多年,是她说服我接手Cfront。实际上Steve Dewhurst也是我的好朋友,我知道你(高博)翻译过他的一本书《C++语言:99个常见编程错误》。我在贝尔实验室的两位最要好的朋友就是 Barbara E. Moo和Steve Dewhurst。Steve曾作为实习生与Bjarne一起工作过,因为他曾在贝尔实验室从事C++编译器方面的工作。

当时他和 Bjarne坐在同一间办公室里,办公室的大小与一般的宾馆房间差不多。他们并不总是相处得很好。当我开始做Cfront上的工作的时候,已经是1986 年的1.1版的事情了。那时,有一个名叫BlockingsField的以色列公司,他们的一些员工当时正把Cfront移植到PC平台上,那个年代的 PC使用的是16位段式体系结构,这是因为地址只有16位宽的缘故,而在Unix上我们使用的是32位地址。我们都不希望与PC打交道,因为都觉得它是垃圾——从计算机科学的角度来看的话。但我们别无选择,必须发布一个PC版本,于是我们只得做一些事情来使它变为可能,比如,添加了无符号整数。我是说,在 1.1版发布之后我们又不得不添加了一些东西。

《程序员》:就是说,C++中的无符号整数是您添加的?

Lippman:Cfront 的最初版本中是没有无符号整数的,Cfront是Bjarne的一个研究项目,所以它当时并没有像一个正式发布版的那种产品级成熟度。例如,如果你使用 Cfront,而我们还没有实现某种特性,我们可以让它显示“对不起,还没有实现”或者我们会说“如果你这样做的话,会有小鬼缠身哟”。你知道,我们在正 式发布版里面不可能这么干,但我们一开始做的并不是正式发布版。因为最初的Cfront只要50美元就能获得源代码,几乎就相当于免费了,所以任何人都能 购买C++完整的源代码。

Bjarne知道,我可以与同事们和睦相处,因为我当时比较年轻,而我又不很懂计算方面的东西,所以我从不与他争 论,因为他懂的东西是我所知的上百倍!在1.1版以后,他作为研究者,继续他有关多重继承特性的工作,而我是唯一的Cfront支持人员,也是唯一的开发人员。所以基本上大家所知的关于C++的每个特性:成员函数、指向成员函数的指针等等,都是我实际地把它们一个个添加到Cfront中去的。所以那是一段 对我而言非常激动人心的经历。我和Bjarne相处得非常融洽,因为我不喜欢问问题——我喜欢自己研究出问题的答案,而他也不太喜欢回答问题。所以他不来 管我,我也不打扰他,大家反而相处得很好。

C++语言从实验室步入成熟所经历的阵痛

《程序员》:您是说,在早期的C++语言实现中,像指向成员函数的指针这样的特性,都不需要通过一个非常正式的评审过程就能加入吗?

Lippman: 当时完全不具正式性。拿Cfront发行版1.0来说,我测试了它,写了所有的文档,参与了它的移植。所以当时我像是Cfront的单人乐队,因为在产品 部门内部没有任何支持,也还没有人需要这种支持。当时所有人都说:我要用Fortran 77,或者我要用Ada,没有人关心C++。

Steve Johnson被调离以后,新上任的部门经理Carlson Rillo完全不了解计算机语言,所以他所知道的所有事情就是,他需要Ada以获得认证,从而获得政府部门的合同;他需要Fortran 77,因为有一些公司想要买。但他不知道,也不关心C++。事实上,他就是当初那个问我老板Barbara奇怪问题的家伙:“为什么Lippman在写一 本关于C++的书?他到底是什么来头?”

我们都看不起这家伙,他是个打高尔夫的——此人不过是被强行委派到我们小组头的人物,并无远见。只 是因为Steve当初管的事儿范围太大了一点,所以才失控了,但在我眼中,Steve完全称得上是一个研究员,而Carlson Rillo则是一个彻头彻尾的职业经理人。不管怎样,总地来说那段时间是非常精彩的,是我职业生涯中最美好的日子。

《程序员》:随后在迪斯尼和微软的经历如何?

Lippman:我在迪斯尼工作的那段时间可就没那么美好了,你也看得出来,我在一个高度组织化的环境中工作得并不顺心,那里有很多条条框框。所以,当我一开始工作于Cfront上时,那里并没有规则,只有我和Bjarne。

刚来到迪斯尼时,我是首席软件工程师,还有一位是Peter De Vroede,我们一起参与软件工程,并且是那里仅有的来自计算机科学背景的软件工程师,而其他每个人都是动画师、动画制作人员,像Scott Johnson、M. J. Turner等等。他们都是非常聪明的人,但他们不是工程师,所以他们写出来的代码很不修边幅,而我在那种环境中能发挥出我的能力。但随着环境变得越来越结构化,就很难再有机会做些什么事情出来。当所有东西都变成了委员会机制时,我在那样的环境中就不能出色地工作了。

这也就是为什么我在微软干得并不出色,因为在微软,程序员不能决定任何东西,能作决定的是项目经理(Program Manager),他们是接触用户的那些人。但用户并不知道他们想要什么,他们只知道他们现在有什么、现在喜欢什么。例如,对于Cfront,我可能接到 一个开发人员打来的电话,他说他遇到了一个Bug,我就会修复它,并发送一个补丁给他。我不需要通过什么审批,他们马上就能得到这个补丁。但在微软,可能 需要等上两年才能得到一个补丁。因为它必须通过委员会的审批,所以必须等待相当长的时间才能被发布。并且Oracle这样的企业用户,虽然需要等待,但你 还是能得到一个补丁。可是如果你只是一个大众开发者,你将被彻底无视。所以我对你问题的回答就是,我们一路过来基本上都是自己做的,直到标准委员会成立为 止。

标准委员会被发展起来以后,生活就不再那么愉快了。例如,这边我和Bjarne想做一个特性,我就会试着实现它,看看它工作起来效果如何。但下一次会议时,标准委员会说,不,我们要收回这个特性。于是就不那么愉快了。

《程序员》:确实是这样,当组织越来越大,用户群体爆炸式增长以后,组织里面就有了越来越多的决策者。

Lippman: 这就变得相当无趣。例如,在微软,所有的东西都必须达成共识。这样做的问题在于,微软的很多人带着他们的笔记本电脑参加会议,他们在会上首次听说某个设想然后就发表观点,而他们之前都从来没有听过这个设想。但你知道,对于计算机问题,你必须思考得足够深入,因为它们总会产生种种后果,所以这样不经过深思熟 虑是非常令人沮丧的。

我当初的职责是尝试找到把C++移植到.NET上去的方法。我去洛杉矶,在这个问题上工作了个把月。然后我向他们提出 并演示给他们看。接着,有人会说:“不,这样不好”,但他们之前连听都没听到过这些思想。还有人会说“那样做的用处是什么啊?”所以你问我之前负责哪方面 工作,我的回答是负责所有方面的工作:Bjarne发明了那些特性,我负责实现它们。

而有意思的是,因为你实现了它们,而当时又没有任何标 准,就很少有人了解那些特性是什么,除非通过编译器来检验。所以,大概四年来,我自己实现GCC的Michael Tiemann、实现Oracle C++编译器的Michael Bob、实现PC上编译器的Walter Bright,我们是当时仅有的几个真正理解这门语言的人,当然,还包括Bjarne。你知道,这也就是为什么人们想要建立语言标准的原因。

但问题是,一旦你有了标准以后,所有事情都变得困难起来。因为,比如说,微软想要异常处理的另一种模型,然后Bjarne觉得技术上这是正确的。他们想要一 种恢复语义的执行期模型,这是出于他们自己的考虑,于是事情就变得政治化了。然后整个过程就变成了如何获得你的支持者联盟了,而且,突然间,Bjarne 无法思考并做出决策了——他必须在利益各不相同的多个集团之间取得共识,比如,公司有自己的利益,使得我们无法在二进制兼容性上达成一致。

再例如,微软有一个虚拟基类指针实现,实在拙劣得很。但微软为此申请了专利,于是造成巨头之间爆发了标准战争,兼容性就被抛在一边了,这也是为什么微软要发 明COM来解决这个问题。因为如果你无法在编译器之间形成二进制兼容性,就意味着人们就必须用PC上的各个编译器都发布一个库,而这几乎是不可能的。

这个工作量太大了,对吧?如果你想要发布一个字符串库,你必须在Borland上实现一遍,又在Zortec上实现一遍,又在微软编译器上实现一遍。然后你 又必须在Sun上面实现一遍……因此,在我看来,它已经破坏了C++本身所拥有的优秀特性。所以它给我留下了糟糕的印象。

《程序员》:这听起来与C++设计哲学背道而驰。

Lippman: 是啊,但为了成为一个业界的标杆,标准还是需要的,只是这方面的工作已经不再有趣了。这也就是为什么当有机会和Bjarne一起去研究部门做GRAIL项 目时,我就抓住这个机会调过去了,因为这是我们一拨人能做令人兴奋的事情的又一次机会。做那个项目的时候就是《深度探索C++对象模型》一书问世的时候 ——我当时的工作就是建立那个模型。

《程序员》:如果我没有记错的话,最后Bjarne决定不采纳恢复语义,而转向了中止语义?

Lippman:但这是因为他没有研究过现有的模型。他咨询了好多实现者,求证他们的意见,他已经尽力而为了。


谈天才与后天努力,Lippman眼中最好的C++编译器

《程序员》:您在中国有很多粉丝,包括我在内,都认为您是一个真正的天才。

Lippman:我不是天才。我很幸运,而且我工作得很勤奋。但我不是一个天才。

《程序员》:那么我们能不能说,你在正确的方向上作出了努力?

Lippman: 有一本书叫做《权力的游戏》,它也被改编成了一个HBO电视连续剧,或者说是魔幻剧。里面有一个侏儒角色名叫Tyrion,他总是不停地读书。他的哥哥是 一个勇士,一个帅哥;而他的爸爸也是一个勇士,有权有势。所以有人问他为什么读了那么多书。他回答说:“孩子,因为我是一个侏儒。如果我没有智慧,那就没有人会尊重我了。”所以我努力工作因为我必须这样做,而不是别的原因。因为我来自蓝领阶层,来自主流文化之外,没有读过好的学校。我的父母都是外来移民。 除了获取成就,我别无他途。

《程序员》:您曾参与第一个C++编译器Cfront的开发,但您对它的实现并不满意,能谈谈其中的原因吗?

Lippman:我想实现一个特性,他们答应我让我来实现异常处理。但组织里的某些人不认为我有能力完成它。所以他们把这项任务转交给惠普。惠普后来交付给我们一个Cfront版本,在这个版本上,一个带异常处理的Hello World花了15分钟才编译完成。

《程序员》:听起来很不可思议,这样的产品性能是无法接受的。

Lippman: 很遗憾,Cfront以这种方式终结了。如果我来做的话,无论如何不可能做得比这还糟糕,对吧?而这也导致了后来EDG编译器的出现,因为John Spicer和我曾在同一家公司工作,而当Cfront失败以后,他加入了EDG,他们的编译器就成了业界标杆。它是当时最优秀的C++编译器。而现在最优秀的则是LLVM,它是一个出自大学的编译器,Google和苹果都对它作了不少投资,但它仍是一个出色的编译器。它也支持Objective-C,和 Xcode——苹果的编译系统。我认为它是市面上最出色的编译系统。

《程序员》:原来如此,也许使用LLVM来测试一下C++11新标准会是有价值的尝试。您对C++最初的标准有何评价?

Lippman: 好的,结果肯定会很有趣。我想说,C++标准的第一版,是一次很糟糕的失败。他们把数学库放进去了,接下去他们又后悔,想要说服人们不要使用它们。异常处理也工作得不理想,constraint子句无法被真正地用在任何大型编程项目中,用于确定实例化的Koenig查找规则无法正常工作。

换句话说,C++的第一版标准中有很大一部分无法正常工作。他们后来花费了巨大的努力,才修复了大多数的问题。但我想强调一点,C++在当时还只是在一个很小的社区里流行,其中有些人不惜代价而投身于此,最终成为了真正的专家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书重点:探索“对象导向程序所支持的C++对象模型”下的程序行为。对于“对象导向性质之基础实现技术”以及“各种性质背后的隐含利益交换”提供一个清楚的认识。检验由程序变形所带来的效率冲击。提供丰富的程序范例、图片,以及对象导向观念和底层对象模型之间的效率测量。 C++成山似海的书籍堆中,这一本不是婴幼儿奶粉,也不是较大婴儿奶粉,它是成人专用的低脂高钙特殊奶粉。 对于C++底层机制感兴趣的读者,这本书会给你“漫卷诗书喜欲狂”的感觉。 了解C++ Object Model,是学习Component ObjectModel的最短路线。 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么Inside TheC++ Object Model正适合你。 目录: 本立道生(侯捷 译序) 前言(Stanley B.Lippman) 第0章 导读(译者的话) 第1章 关于对象(Object Lessons) 加上封装后的布局成本(Layout Costs for Adding Encapsulation) 1.1 C++模式模式(The C++ Object Model) 简单对象模型(A Simple Object Model) 表格驱动对象模型(A Table-driven Object Model) C++对象模型(The C++ Object Model) 对象模型如何影响程序(How the Object Model Effects Programs) 1.2 关键词所带来的差异(A Keyword Distinction) 关键词的困扰 策略性正确的struct(The Politically Correct Struct) 1.3 对象的差异(An Object Distinction) 指针的类型(The Type of a Pointer) 加上多态之后(Adding Polymorphism) 第2章 构造函数语意学(The Semantics of constructors) 2.1 Default Constructor的建构操作 “带有Default Constructor”的Member Class Object “带有Default Constructor”的Base Class “带有一个Virual Function”的Class “带有一个virual Base class”的Class 总结 2.2 Copy Constructor的建构操作 Default Memberwise Initialization Bitwise Copy Semantics(位逐次拷贝) 不要Bitwise Copy Semantics! 重新设定的指针Virtual Table 处理Virtual Base Class Subobject 2.3 程序转换语意学(Program Transformation Semantics) 明确的初始化操作(Explicit Initialization) 参数的初始化(Argument Initialization) 返回值的初始化(Return Value Initialization) 在使用者层面做优化(Optimization at the user Level) 在编译器层面做优化(Optimization at the Compiler Level) Copy Constructor:要还是不要? 摘要 2.4 成员们的初始化队伍(Member Initialization List) 第3章 Data语意学(The Semantics of Data) 3.1 Data Member的绑定(The Binding of a Data Member) 3.2 Data Member的布局(Data Member Layout) 3.3 Data Member的存取 Static Data Members Nonstatic Data Member 3.4 “继承”与Data Member 只要继承不要多态(Inheritance without Polymorphism) 加上多态(Adding Polymorphism) 多重继承(Multiple Inheritance) 虚拟继承(Virtual Inheritance) 3.5 对象成员的效率(Object Member Efficiency) 3.6 指向Data Members的指针(Pointer to Data Members) “指向Members的指针”的效率问题 第4章 Function语意学(The Semantics of Function) 4.1 Member的各种调用方式 Nonstatic Member Functions(非静态成员函数) Virtual Member Functions(虚拟成员函数) Static Member Functions(静态成员函数) 4.2 Virtual Member Functions(虚拟成员函数) 多重继承下的Virtual Functions 虚拟继承下的Virtual Functions 4.3 函数的效能 4.4 指向Member Functions的指针(Pointer-to-Member Functions) 支持“指向Virtual Member Functions”之指针 在多重继承之下,指向Member Functions的指针 “指向Member Functions之指针”的效率 4.5 Inline Functions 形式对数(Formal Arguments) 局部变量(Local Variables) 第5章 构造、解构、拷贝 语意学(Semantics of Construction,Destruction,andCopy) 纯虚拟函数的存在(Presence of a Pure Virtual Function) 虚拟规格的存在(Presence of a Virtual Specification) 虚拟规格中const的存在 重新考虑class的声明 5.1 无继承情况下的对象构造 抽象数据类型(Abstract Data Type) 为继承做准备 5.2 继承体系下的对象构造 虚拟继承(Virtual Inheritance) 初始化语意学(The Semantics of the vptr Initialization) 5.3 对象复制语意学(Object Copy Semantics) 5.4 对象的功能(Object Efficiency) 5.5 解构语意学(Semantics of Destruction) 第6章 执行期语意学(Runting Semantics) 6.1 对象的构造和解构(Object Construction and Destruction) 全局对象(Global Objects) 局部静态对象(Local Static Objects) 对象数组(Array of Objects) Default Constructors和数组 6.2 new和delete运算符 针对数组的new语意 Placement Operator new的语意 6.3 临时性对象(Temporary Objects) 临时性对象的迷思(神话、传说) 第7章 站在对象模型的类端(On the Cusp of the Object Model) 7.1 Template Template的“具现”行为(Template Instantiation) Template的错误报告(Error Reporting within a Template) Template中的名称决议方式(Name Resolution within a Template) Member Function的具现行为(Member Function Instantiation) 7.2 异常处理(Exception Handling) Exception Handling快速检阅 对Exception Handling的支持 7.3 执行期类型识别(Runtime Type Identification,RTTI) Type-Safe Downcast(保证安全的向下转型操作) Type-Safe Dynamic Cast(保证安全的动态转型) References并不是Pointers Typeid运算符 7.4 效率有了,弹性呢? 动态共享函数库(Dynamic Shared Libraries) 共享内存(Shared Memory)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值