[译者按] Bjarne Stroustrup博士,1950年出生于丹麦,先後毕业于丹麦阿鲁斯大学和英国剑挢大学,AT&T大规模程序设计研究部门负责人,AT&T 贝尔实验室和ACM成员。1979年,B. S开始开发一种语言,当时称为"C with Class",後来演化为C++。1998年,ANSI/ISO C++标准建立,同年,B. S推出其经典着作The C++ Programming Language的第三版。C++的标准化标志 B. S博士倾20年心血的伟大构想终於实现。但是,计算技术的发展一日千里,就在几年前人们还猜想C++最终将一统天下,然而随 Internet的爆炸性增长,类似Java C#等新的 现代感十足的语言咄咄逼人,各种Script语言更是如雨後春笋纷纷涌现。在这种情况下,人们不禁有些惶恐不安。C++是不是已经过时了呢?其前景如何?标准C++有怎样的意义?应该如何学习?我们不妨看看B. S对这些问题的思考。以下文字是译者从Stroustrup1998年之後发表的若干文章 谈话笔记中精选出来的,由於出处不一,内容多有重复,为保持完整,亦一并译出。
以下内容选自B. S在自己主页上发表的FAQ
1. 请谈谈C++书。
没有,也不可能有一本书对於所有人来说都是最好的。不过对於那些真正的程序员来说,如果他喜欢从"经典风格"的书中间学习一些新的概念和技术,我推荐我的The C++ Programming Language, 1998年的第三版和特别版。那本书讲的是纯而又纯的C++,完全独立於平台和库(当然得讲到标准库)。该书面向那些有一定经验的程序员,帮助他们掌握C++,但不适合毫无经验的初学者入门,也不适合那些临时程序员品尝C++快餐。所以这本书的重点在於概念和技术,而且在完整性和精确性上下了不少功夫。如果你想知道为什麽C++会变成今天的模样,我的另一本书 The Design and Evolution of C++ 能给你满意的答案。理解设计的原则和限制能帮助你写出更好的程序。www.accu.org是最好的书评网站之一,很多有经验的程序员在此仗义执言,不妨去看看。
2. 学习C++要花多长时间?
这要看你说的"学习"是什麽意思了。如果你是一个Pascal程序员,你应该能很快地使你的C++水平达到与Pascal相近的程度;而如果你是一个C程序员,一天之内你就能学会使用C++进行更出色的C风格编程。另一方面,如果你想完全掌握C++的主要机制,例如数据抽象,面向对象编程,通用编程,面向对象设计等等,而此前又对这些东西不很熟悉的话,花上个一两年是不足为奇的。那麽是不是说这就是学习C++所需要的时间呢?也许再翻一番,我想打算成为更出色的设计师和程序员最起码也要这麽长的时间。如果学习一种新的语言不能使我们的工作和思想方式发生深刻
的变革,那又何苦来哉?跟成为一个钢琴家或者熟练掌握一门外语相比,学习一种新的 不同的语言和编程风格还算是简单的。
3. 了解C是学习C++的先决条件吗?
否 C++中与C相近的子集其实比C语言本身要好学,类型方面的错误会少一些,也不像C那样绕圈子,还有更好的支持库。所以应该从这个子集开始学习C++。
4. 要想成为真正的OO程序员,我是不是得先学习Smalltalk?
否。如果你想学Smalltaok,尽管去学。这种语言很有趣,而且学习新东西总是一个好主意。但是Smalltalk不是C++,而且把Smalltalk的编程风格用在C++里不会有什麽好结果。如果你想成为一个出色的C++程序员,而且也没有几个月的时间百无聊赖,请你集中力量学好C++以及其背後的思想。
5. 我如何开始学习C++?
这取决于你的基础和学习动机。如果你是个初学者,我想你最好找个有经验的程序员来帮助你,要不然你在学习和实践中不可避免的犯下的种种错误会大大地打击你的积极性。另外,即使你的编译器配备了充足的文档资料,一本C++书籍也永远是必不可少的,毕竟文档资料不是学习编程思想的好教材。
选择书籍时,务必注意该书是不是从一开始就讲授标准C++,并且矢志不渝地使用标准库机制。例如,从输入中读取一个字符串应该是这样的:
string s; // Standard C++ style
cin >> s;
而不是这样的:
char s[MAX]; /* Standard C style */
scanf("%s",s);
去看看那些扎实的C++程序员们推荐的书吧。记住,没有哪本书对所有人来说都是最好的。另外,要写地道的C++程序,而避免用C++的语法写传统风格的程序,新瓶装旧酒没多大意义。(遗憾的是,目前在市面上的中文C++教材中,符合B. S的这个标准的可以说一本都没有,大家只好到网上找一些英文的资料来学习了。--译者)
6. 怎样改进我的C++程序?
不好说。这取决于你是怎麽使用该语言的。大多数人低估了抽象类和模板的价值,反过来却肆无忌惮地使用造型机制(cast)和宏。这方面可以看看我的文章和书。抽象类和和模板的作用当然是提供一种方便的手段建构单根的类层次或者重用函数,但更重要的是,它们作为接口提供了简洁的 逻辑性的服务表示机制。
7. 语言的选择是不是很重要?
是,但也别指望奇迹。很多人似乎相信某一种语言能够解决他们在系统开发中遇到的几乎所有问题,他们不断地去寻找完美的编程语言,然後一次次的失败,一次次的沮丧。另外一些人则将编程语言贬为无关紧要的细节,把大把大把的银子放在开发流程和设计方法上,他们永远都在用COBOL C和一些专有语言。一种优秀的语言,例如C++,能帮助设计者和程序员做很多事情,而其能力和缺陷又能够被清楚地了解和对待。
8. ANSI/ISO标准委员会是不是糟蹋了C++?
当然不是 他们(我们)的工作很出色。你可以在一些细节上找些歪理来挑刺,但我个人对於这种语言以及新的标准库可是欣欣然。ISO C++较之C++的以前版本更出色更有条理。相对於标准化过程刚刚开始之初,你今天可以写出更优雅 更易于维护的C++程序。新的标准库也是一份真正的大礼。由於标准库提供了strings, lists, vectors, maps以及作用于其上的基本算法,使用C++的方式已经发生了巨大的变化。
9. 你现在有没有想删除一些C++特性?
没有,真的。问这些问题的人大概是希望我回答下面特性中的一个:多继承 异常 模板和RTTI。但是没有它们,C++就是不完整的。在过去的N年中,我已经反复考虑过它们的设计,并且与标准委员会一起改进了其细节,但是没有一个能被去掉又不引起大地震。
从语言设计的角度讲,我最不喜欢的部份是与C兼容的那个子集,但又不能把它去掉,因为那样对於在现实世界里工作的程序员们来说伤害太大了。C++与C兼容,这是一项关键的设计决策,绝对不是一个叫卖的噱头。兼容性的实现和维护是十分困难的,但确实使程序员们至今受益良多。
但是现在,C++已经有了新的特性,程序员们可以从麻烦多多的C风格中解脱出来。例如,使用标准库里的容器类,象vector, list, map, string等等,可以避免与底层的指针操作技巧混战不休。
10. 如果不必和C兼容,你所创造的语言是不是就会是Java?
不是,差得远。如果人们非要拿C++和Java来作比较,我建议他们去阅读The Design and Evolution of C++,看看C++为什麽是今天这个样子,用我在设计C++时遵从的原则来检验这两种语言。这些原则与SUN的Java开发小组所持的理念显然是不同的。除了表面语法的相似性之外,C++与Java是截然不同的语言。在很多方面,Java更像Smalltalk(译者按:我学习Java时用的是Sun的培训教材,里面清楚地写道:Java在设计上采用了与C++相似的语法,与Smalltalk相似的语义。所以可以说Java与C++是貌合神离,与Smalltalk才是心有灵犀)。Java语言相对简单,这部分是一种错觉,部份是因为这种语言还不完整。随 时间的推移,Java在体积和复杂程度上都会大大增长。在体积上它会增长两到三倍,而且会出现一些实现相关的扩展或者库。这是一条每个成功的商业语言都必须走过的发展之路。随便分析一种你认为在很大范围内取得了成功的语言,我知道肯定是无有例外者,而且实际上这非常有道理。
上边这段话是在Java 1.1推出之前写的。我确信Java需要类似模板的机制,并且需要增强对於固有类型的支持。简单地说,就是为了基本的完整性也应该做这些工作。另外还需要做很多小的改动,大部份是扩展。1998年秋,我从James Gosling(Java语言的创始人--译者)那里得到一份建议书,说是要在Java中增加固有类型 操作符重载以及数学计算支持。还有一篇论文,是数学分析领域的世界级大师,伯克利大学的W. Kahan教授所写的How Java's Floating-Point Hurts Everyone Everywhere("且看Java的浮点运算如何危害了普天下的芸芸众生"--译者),揭露了Java的一些秘密。
我发现在电视和出版物中关於Java的鼓吹是不准确的,而且气势汹汹,让人讨厌。大肆叫嚣凡是非Java的代码都是垃圾,这是对程序员的侮辱;建议把所有的保留代码都用Java重写,这是丧心病狂,既不现实也不负责任。Sun和他的追随者似乎觉得为了对付微软罪恶的"帝国时代",就必须如此自吹自擂。但是侮辱和欺诈只会把那些喜欢使用不同编程语言的程序员逼到微软阵营里去。
Java并非平台无关,它本身就是平台。跟Windows一样,它也是一个专有的商业平台。也就是说,你可以为Windows/Intel编写代码,也可以为Java/JVM编写代码,在任何一种情况下,你都是在为一个属於某个公司的平台写代码,这些代码都是与该公司的商业利益扯在一起的。当然你可以使用任何一种语言,结合操作系统的机制来编写可供JVM执行的程序,但是JVM之类的东西是强烈地偏向于Java语言的。它一点也不像是通用的 公平的 语言中立的VM/OS。
私下里,我会坚持使用可移植的C++作大部份工作,用不同的语言作余下的工作。
("Java is not platform-independent, it is the platform",B. S的这句评语对於C++用户有 很大的影响,译者在国外的几个新闻组里看到,有些C++高手甚至把这句话作为自己的签名档,以表明对Java的态度和誓死捍卫C++的决心。实际上有很多程序员不光是把自己喜爱的语言当成一种工具,更当成一种信仰。--译者)
11. 您怎麽看待C#语言?
就C#语言本身我没什麽好说的。想让我相信这个世界还需要另外一个专有的语言可不是一件容易的事,而且这个语言还是专门针对某一个专有操作系统的,这就更让我难以接受。直截了当地说,我不是一个专有语言的痴迷者,而是一个开放的正式标准的拥护者。
12. 在做大项目时,您是不是真的推荐Ada,而不是C++?
当然不是。我不知道这是谁传出来的谣言,肯定是一个Ada信徒,要麽是过份狂热,要麽是不怀好意。
13. 你愿不愿意将C++与别的语言比较?
抱歉,我不愿意。你可以在The Design and Evolution of C++的介绍性文字里找到原因。
有不少书评家邀请我把C++与其它的语言相比,我已经决定不做此类事情。在此我想重申一个我很久以来一直强调的观点:语言之间的比较没什麽意义,更不公平。主流语言之间的合理比较要耗费很大的精力,多数人不会愿意付出这麽大的代价。另外还需要在广泛的应用领域有充份经验,保持一种不偏不倚 客观独立的立场,有 公正无私的信念。我没时间,而且作为C++的创造者,在公正无私这一点上我永远不会获得完全的信任。
人们试图把各种语言拿来比较长短,有些现像我已经一次又一次地注意到,坦率地说我感到担 。作者们尽力表现的公正无私,但是最终都是无可救药地偏向于某一种特定的应用程序,某一种特定的编程风格,或者某一种特定的程序员文化。更糟的是,当某一种语言明显地比另一种语言更出名时,一些不易察觉的偷梁换柱就开始了:比较有名的语言中的缺陷被有意淡化,而且被拐弯抹角地加以掩饰;而同样的缺陷在不那麽出名的语言里就被描述为致命硬伤。类似的,有关比较出名的语言的技术资料经常更新,而不太出名的语言的技术资料往往是几年以前的,试问这种比较有何公正性和意义可言?所以我对於C++之外的语言的评论严格限制在一般性的特别特定的范畴里。
换言之,我认为C++是大多数人开发大部份应用程序时的最佳选择。
14. 别人可是经常拿他们的语言与C++比来比去,这让你感到不自在了吗?
当这些比较不完整或者出於商业目的时,我确实感觉不爽。那些散布最广的比较性评论大多是由某种语言,比方说Z语言的拥护者发表的,其目的是为了证明Z比其它的语言好。由於C++被广泛地使用,所以C++通常成了黑名单上的头一个名字。通常,这类文章被夹在Z语言的供货商提供的产品之中,成了其市场竞争的一个手段。令人震惊的是,相当多的此类评论引用那些在开发Z语言的公司中工作的雇员的文章,而这些经不起考验文章无非是想证明Z是最好的。特别是在这些比较中确实有一些零零散散的事实,(所以更具欺骗性--译者),毕竟没有一种语言在任何情况下都是最好的。C++当然不完美,不过请注意,特意选择出来的事实虽然好像正确,但有时是完全的误导。
以後再看到语言比较方面的文章时,请留心是谁写的,他的表述是不是以事实为依据,以公正为准绳,特别是评判的标准是不是对於所引述的每一种语言来说都公平合理。这可不容易做到。
15. 在做小项目时,C优于C++吗?
我认为非也。除了由於缺乏好的C++编译器而导致的问题之外,我从没有看到哪个项目用C会比用C++更合适。(不过现在C++编译器导致的问题还是不可忽略的,当你看到同样功能的C++程序可执行代码体积比C大一倍而且速度慢得多时,会对此有所感触的。--译者)
以下内容来自Visual C++ Developer's Journal主编
Elden Nelson 2000年3月对B. S的专访
16. 如果您现在有机会从头设计C++语言,您会做些什麽不同的事情?
当然,你永远都不可能重新设计一种语言,那没有意义,而且任何一种语言都是它那个时代的产物。如果让我今天再设计一种语言,我仍然会综合考虑逻辑的优美 效率 通用性 实现的复杂程度和人们的喜好。要知道人们的习惯对於他们的喜好有 巨大的影响。
现在,我会寻找一种简单得多的语法,我会把类型系统的冲突问题限制在很少的几种情况里,而且你能很容易的发现这些问题。这样就能够很容易的禁止不安全的操作。(B. S的原则是:对於糟糕的代码,就算是不能完全禁止,至少也要让它大白于天下,而不是藏在阴暗的角落里暗箭伤人。C++实际上已经提供了这样的机制,例如如果你使用象reinterpret_cast(pointer)这样的很明显是非常糟糕的表达式进行造型,别人会很容易地找到问题所在。只不过C++仍然允许你使用传统的 C风格的造型机制,而又有不少人一直使用这种老式的风格,所以才引来麻烦多多。B. S的意思是说,要是现在能够禁止老式的风格该有多好 作为语言设计者的他,恐怕是没有这个机会了,但是作为语言使用者的我们,却还有很大的希望去改进自己的代码。何去何从,应该是我们深思的时候了。--译者)
我还会把核心语言的体积尽可能搞得小一些,包括类和模板的关键的抽象特性,而把很多其它的语言特性放在库里来解决。当然我也会保证核心语言足够的强大,使得那些库本身也足以用这个核心语言来产生。我可不希望标准库的创建需要用到什麽不属於该语言本身的神秘机制。另外我会让这个核心语言的定义更加精确。(有不少新的语言在建库时就使用了一些"不属於该语言本身的神秘机制",比如VB和JAVA。从理论上讲,这是近乎无赖的行径,所以B. S不以为然。不过从实用出发倒也无伤大雅。--译者)
最重要的是,我会在该语言被广泛使用之前尽可能维持一个很长的酝酿期,这样我可以以其他人的反馈为基础进行改进。这可能是最困难的,因为一旦有什麽东西是明显出色和有前途的,大家就会蜂拥而至的来使用它,此後作任何不兼容的修正都会是非常困难的。
我相信这些思想与我当初设计C++时的理念是非常类似的,同样也是这些思想指引 一二十年来C++的不断演化。当然,我认为现在还没有什麽东西能让我觉得像是"完美的语言"。
17. 您预期C++做哪些增强,会不会删掉一些东西?
很不幸,虽然有一些东西很应该扔掉,但恐怕很难真的删掉任何东西。第一个应该抛弃的东西就是C风格的造型机制和类型截断转换。就算不禁止,编译器的作者们至少也应该对这种行为给与强烈的警告。我希望能用类似vector的东西彻底取代数组,但这显然是不可能的。不过如果程序员们能主动使用vector来代替数组,就会立刻受益匪浅。关键是你不必再使用C++中最复杂难缠的技巧了,现在有优秀得多的替代方案。
至於主要的特性,我没想去掉任何东西。特别是那些把C++与C区别开来的主要特性恐怕没法风平浪静的被抛掉。通常问这些问题的人是希望我挑出诸如多继承 异常 模板等机制来接受批判。所以在这我想大声讲清楚,我认为多继承机制对於静态类型语言实现继承性来说是必需的,异常机制是在大系统中对付错误的正确方法,模板机制是进行类型安全的 精致的和高效的程序设计的灵丹妙药。我们可以在小的细节上对於这些机制挑挑刺,但在大的方面,这些基本的概念都必须坚持。
现在我们仍在学习标准C++,也正在标准所提供的特性基础上发展出更新的 更有趣的编程技术。特别是人们刚刚开始使用STL和异常机制,还有很多高效强大的技术鲜为人知,所以大可不必急匆匆的跑去增加什麽新的机制。
我认为当前的重点是提供很多新的 比以前更加精致的 更有用的库,这方面潜力巨大。例如,如果有一个能被广泛使用的 更精致的支持并发程序设计的库,那将是一大福音--C风格的线程库(例如Pthread--译者)实在不够好。我们也就可以与各种其他的系统,例如SQL以及不同的组件模型更好地契合起来。数值计算领域的人们在这方面好像已经走在了前面,类似像Blitz++ POOMA MTL之类的高效而精致的库的开发已经取得了非凡的成就。(译者在Internet上造访了Blitz++和POOMA的主页,前者是一个高性能数学库,据称其性能与Fortran 77不相上下,同时又支持大量的C++特性。我想凡是对於数值计算领域有所了解的人都知道这有多麽伟大的意义。POOMA则是一个专门研究C++并行数学算法的项目,它的前景更加不可限量。译者非常认同B. S的这个观念。--译者)
有了足够的经验之後,我们就能更好的决定应该对标准做些什麽调整。
18. 显然,这几年世界变了,正在走向一个以Web为中心 分布式计算为主流的时代。那麽您觉得C++还能维持其地位吗?程序员们可不可能把若干种专用语言(比如Perl Javascript)综合运用以彻底取代某一种通用语言?(C++就是这样的通用语言--译者)为了配合新的计算模式,C++及其标准库应该做怎样的调整?
从来没有哪一种语言能适合所有的工作,我恐怕以後也不会有。实际系统通常是用多种语言和工具构造起来的。C++只是想成为若干语言和工具中的一个,当某些专用语言在其领域里特别突出时,它们可以与C++互为补充。也就是说,我觉得如果大多数现在的专用语言能借助特定领域的C++库共同工作的话,它们会表现得更出色。脚本语言通常导致难以维护的代码,而且也没有给程序的结构 可扩展性和可维护性的优化留下什麽余地。
我不敢肯定未来的代码是否真的会是以Web为中心的。就算是直接处理Web的系统也主要是由处理本地资源,如IP连接之类的程序模块构成的。
地理上的分布性以及服务器软件对於并发机制的高度依赖对於系统的建造者来说的确是个挑战。有些针对上述问题的库已经出现,也许我们将会看到它们最终得以标准化。当然,一些原操作和保证规则应该被加到核心语言中以提供对这些库的更佳支持。
总的来说,对於Web和网络,我们非常需要一个真正的系统/网络级的安全模型。指望JavaScript之类的脚本语言实现这个模型无异于白日做梦。
注意,我也没说C++提供了这个问题的解决方式。C++的重心是高效的访问系统资源,而不是反欺诈。
19. 您看C++未来的走向如何?在接下来的10年里它会衰落吗?或者是基本保持现在的形式?或者发展变化呈不同的形式?
C++有 最美好的未来。用它你能写出伟大的代码。除了故意进行恶意欺诈,C++仍将是开发高性能 高复杂度系统的最好语言。据我所知,没有那种语言能在通用性 效率和精致三方面的统一上可与C++相题并论。
我没看到C++有衰落的徵兆。在我能预见的未来里,它的用途还会不断增长。当然,在未来的十年里我们会看到一些变化,但不会像你想得那麽显着。跟每一种语言一样,C++也会发展变化。"语言专家们"要求改进的喧嚣声震耳欲聋,但是系统开发者们的基本请求是保持稳定。
C++会改进,但是这些改进将主要是为了反映从实践中得来的经验教训,而不会是为了追风尚赶时髦。为了更高效地使用一些新的编程技术,比如通用编程技术,可能会增加一些小的特性。会有大量的库涌现,我预期会出现一种崭新的 更出色的库支持机制。我希望新的扩展主要集中在支持抽象方面的一般特性,而不是为支持某些特殊任务的特定机制。
例如,"属性"这个概念是很有用的,但我不认为在一种通用编程语言中有它的容身之地。用标准C++的一组类可以很容易地支持这一概念。如果我们感觉那族类对於"属性"这一概念的支持不尽如人意,也不会立刻跑去在语言里增加属性机制,而是仔细考虑如何改进类和模板以帮助库设计人员尽可能接近"属性"这个概念。也许通过改进函数对象的机制能够给这个问题一个满意的答复。
为了使C++在接下来的十几年中保持灵活可变,很基本的一点就是不要让标准C++赶什麽学术或者商业的时髦。人们要求增加的特性中很大一部份通过使用现有的标准C++开发新库的方式都可以实现。还有,事实上人们渴望得到的很多特性已经被包括在标准C++中,并且被最新的编译器支持。
对许多程序员来说,提高代码质量的最佳途径不是追求什麽语言扩展,而是好好地 慢慢地品味最新的C++技术书籍(可惜我们到目前为止连这种机会都没有--译者)。
20. 您怎麽看待脚本语言的兴旺态势?特别是Python,似乎提供了一种学习OO技术的更简单的途径
有些语言很不错。比如Python,我很喜欢。但是我认为你从不同的语言中学到的OO技术是不完全相同的。当然,每一个专业的程序员都需要通晓几门语言,并且了解各种语言在编程和设计技术上的不同。
在我看来,用脚本语言建造的系统与用C++那样的通用语言建造的系统大不相同。从两类语言中学到的技术区别明显。在OO技术里也不存在什麽通用部份对於各种系统的高效建造来说都是至关重要的。
21. 有没有计划往标准C++里增加一些新的特性以支持分布式计算?
没有,我也不认为有这个必要。用更好的库就差不多能解决问题了。最多,为了支持这类的库,我们可能会增加一些低级的原操作和规则
22. 未来C++有没有可能定一个可移植的二进制接口?
如果你说的"可移植"是指跨硬件和块操作系统的可移植,我想回答是不会。我们当然可以设计一个解释器或者虚拟机(如同Java的做法--译者),但这样一来,由於无法以最优的方式访问系统资源,C++的能力就会受到削弱,。我真正希望在不远的将来能够看见的东西是platform ABIs(ABI, Application Binary Interface) 。例如,有人正在努力为Intel新的IA64体系定义C++ ABI,我想这些努力会得到用户们的巨大支持。能够把不同编译器产生的代码编译在一起将会是一项十分有意义的事情。
23. 在不少流行领域,C++正在渐渐失去光芒,因为它要求人们花很大的精力去对付一些很基本的工作,比如管理内存(因为没有垃圾收集机制),管理模块之间的依赖性(因为没有包机制),管理组件的版本。C++缺乏一些现代语言已经视为标准的特性。比如传言中最酷的Java语言就特别重视这些问题。那麽在解决这些问题是否会导致C++的发展背离其根本宗旨呢?C++应该怎样发展以保证我们在这种语言上的投资能有合理的回报,而不是被迫去重新使用另一种语言?
我倒还没有注意到C++比以前用的少了。相反,我看到的指标表明C+的使用还在稳定地增长 。只不过这种基数很大的稳定增长以及在标准性 移植性和库方面的不断提高并没有造成什麽具有欺骗性的新闻效应而已。我认为你所说的"失去光芒"只不过是市场推销和新闻意义上的现象。
如果你需要垃圾收集机制的话,你可以在C++应用程序中插入一个垃圾收集器。有不少自由的和商业的垃圾收集器已经在重要的实践中被证明是很出色的。
如果你不想使用垃圾收集机制,也没关系。你可以使用标准容器类,它们大大减少了对於显式分配和回收内存的需要。这样,使用现代的库和现代的编程风格,你能够避免大部份的内存管理问题。
同样的技术还能够用来避免一般资源的管理问题。并不是只有内存才会泄漏,线程句柄 文件 互斥锁 网络连接等都是重要的资源,为了建立可靠的系统,这些资源必须被正确的管理。如果你觉得有了垃圾收集机制就可以解决所有的资源管理问题,那麽你最好赶快从美梦中醒来。
C++提供了很多机制来管理一般性的资源。关键的手段--"Resource Acquisition is Initialization"(这是著名的RAII惯用法,阅读原文时会经常遇到,其意义是说将所有的资源分配申请放在对象初始化过程中进行,而将资源释放动作放在对象销毁过程中——译者)可以使用函数对象来管理生存期问题。语言中关於对象的局部构造和异常机制对这项技术提供了支持。
某些语言的狂热支持者总是用讽刺漫画的笔法描述C++,然而C++实际上要好得多。特别是我觉得很多其他的特性已经泛滥不堪了,在C++中,通常这些特性能够很容易的被模拟出来。相反的,新的语言在推广的过程中总是不断地增加新的特性,这就是为什麽从一种语言诞生到被广泛使用,其体积通常会增加个两三倍。
目前,最为个人和组织,对於C++的最好投资就是去更好地理解标准C++和现代的C++设计编程技术。大多数人使用C++的方式实际上停留80年代中期的水平,甚至比那更陈旧。
至於模块依赖性问题,我的观点是,在编程语言的工作和系统的工作之间应该有一个明显的界线,依赖关系应该尽可能地与编程语言分开,而由系统来支持。
我不认为组建版本的问题应该由编程语言来解决,这是一个系统范畴里的问题,在语言里应该通过提供相应的库来解决。C++有这样的机制。
解决这样的问题不会使C++偏离轨道。但是给C++增加很多特殊的特性就会使C++偏离轨道,而且在保持可移植性和平台独立性方面也会是一个倒退。
24. 标准C++推出有段时间了,Java也大踏步地往前走而且取得了显着的进步,您现在怎麽比较Java与C++?您觉得Java想要变成像C++一样"好"的语言还需要做些什麽?您举的C++从Java身上学到了什麽经验吗?有没有什麽Java的特性您认为是可以被C++吸纳的?
我不比较语言。做好这项工作是十分困难的,而且很少具有专业水准。
我认为C++的进步会是主要以它的用户在使用中遇到的问题以及其自身逻辑为基础。当然,其他语言中的某些思想也会被考虑,但不能被简单的移花接木过来。你必须审视那些机制在技术上和思想上的背景,并且找到在C++中支持这些技术的最佳方案。
有时最好的选择是综合使用几种语言。毕竟没有任何一种语言是放之四海而皆优的。C++现在是,将来也继续会是在广泛应用领域中最好的语言之一。但是,我们不能被拉下水,不能把所有可能的特性都加到C++里面来向大众献媚。我认为Java和C++现在和将来都会是十分不同的语言,语法相似,但背後的对象模型明显不同。
对於我来说,一个很重要的区别是C++有一个ISO标准,而Java则是一个专有语言。
25. 在Java刚刚出现的那几年,有很多欺骗性的言论说它将会是终极语言,会取代C++。您觉得在过去两三年里Java对C++的追随者们有什麽影响?
到现在关於Java的不实之辞也还随处可见。暂且不提Java在过去5年间的创纪录的发展,狂热的大众似乎认为Java将最终取代的不仅仅是C++,而且还有所有其他的编程语言。但在另一方面,C++的使用仍在继续增长。我不认为Java对於C++的影响已经使得人们转而把本来打算用来创造更好的C++工具库的资源调过去开发Java工具库。Java对於学习编程的人来说没有太多的新东西,所以对於C++的定义也没什麽影响。在那个领域,Java还得努力追赶。例如,我认为为Sun迟早会往Java里加入类似模板的机制。
人们应该认识到C++和Java的目标是何等的不同。 以C++的设计理念来衡量Java,或是以Java的设计理念来衡量C++,得出的结论都不会很好。
在访谈即将结束时,或许我该再次表明态度:C++仍然是我喜爱的语言,在写代码时你会发现没有那种语言能像它那样在如此广泛的应用领域和平台上同时达成如此的高效与精致。
[译者按] Bjarne Stroustrup博士,1950年出生于丹麦,先後毕业于丹麦阿鲁斯大学和英国剑挢大学,AT&T大规模程序设计研究部门负责人,AT&T 贝尔实验室和ACM成员。1979年,B. S开始开发一种语言,当时称为"C with Class",後来演化为C++。1998年,ANSI/ISO C++标准建立,同年,B. S推出其经典着作The C++ Programming Language的第三版。C++的标准化标志 B. S博士倾20年心血的伟大构想终於实现。但是,计算技术的发展一日千里,就在几年前人们还猜想C++最终将一统天下,然而随 Internet的爆炸性增长,类似Java C#等新的 现代感十足的语言咄咄逼人,各种Script语言更是如雨後春笋纷纷涌现。在这种情况下,人们不禁有些惶恐不安。C++是不是已经过时了呢?其前景如何?标准C++有怎样的意义?应该如何学习?我们不妨看看B. S对这些问题的思考。以下文字是译者从Stroustrup1998年之後发表的若干文章 谈话笔记中精选出来的,由於出处不一,内容多有重复,为保持完整,亦一并译出。
以下内容选自B. S在自己主页上发表的FAQ
1. 请谈谈C++书。
没有,也不可能有一本书对於所有人来说都是最好的。不过对於那些真正的程序员来说,如果他喜欢从"经典风格"的书中间学习一些新的概念和技术,我推荐我的The C++ Programming Language, 1998年的第三版和特别版。那本书讲的是纯而又纯的C++,完全独立於平台和库(当然得讲到标准库)。该书面向那些有一定经验的程序员,帮助他们掌握C++,但不适合毫无经验的初学者入门,也不适合那些临时程序员品尝C++快餐。所以这本书的重点在於概念和技术,而且在完整性和精确性上下了不少功夫。如果你想知道为什麽C++会变成今天的模样,我的另一本书 The Design and Evolution of C++ 能给你满意的答案。理解设计的原则和限制能帮助你写出更好的程序。www.accu.org是最好的书评网站之一,很多有经验的程序员在此仗义执言,不妨去看看。
2. 学习C++要花多长时间?
这要看你说的"学习"是什麽意思了。如果你是一个Pascal程序员,你应该能很快地使你的C++水平达到与Pascal相近的程度;而如果你是一个C程序员,一天之内你就能学会使用C++进行更出色的C风格编程。另一方面,如果你想完全掌握C++的主要机制,例如数据抽象,面向对象编程,通用编程,面向对象设计等等,而此前又对这些东西不很熟悉的话,花上个一两年是不足为奇的。那麽是不是说这就是学习C++所需要的时间呢?也许再翻一番,我想打算成为更出色的设计师和程序员最起码也要这麽长的时间。如果学习一种新的语言不能使我们的工作和思想方式发生深刻
的变革,那又何苦来哉?跟成为一个钢琴家或者熟练掌握一门外语相比,学习一种新的 不同的语言和编程风格还算是简单的。
3. 了解C是学习C++的先决条件吗?
否 C++中与C相近的子集其实比C语言本身要好学,类型方面的错误会少一些,也不像C那样绕圈子,还有更好的支持库。所以应该从这个子集开始学习C++。
4. 要想成为真正的OO程序员,我是不是得先学习Smalltalk?
否。如果你想学Smalltaok,尽管去学。这种语言很有趣,而且学习新东西总是一个好主意。但是Smalltalk不是C++,而且把Smalltalk的编程风格用在C++里不会有什麽好结果。如果你想成为一个出色的C++程序员,而且也没有几个月的时间百无聊赖,请你集中力量学好C++以及其背後的思想。
5. 我如何开始学习C++?
这取决于你的基础和学习动机。如果你是个初学者,我想你最好找个有经验的程序员来帮助你,要不然你在学习和实践中不可避免的犯下的种种错误会大大地打击你的积极性。另外,即使你的编译器配备了充足的文档资料,一本C++书籍也永远是必不可少的,毕竟文档资料不是学习编程思想的好教材。
选择书籍时,务必注意该书是不是从一开始就讲授标准C++,并且矢志不渝地使用标准库机制。例如,从输入中读取一个字符串应该是这样的:
string s; // Standard C++ style
cin >> s;
而不是这样的:
char s[MAX]; /* Standard C style */
scanf("%s",s);
去看看那些扎实的C++程序员们推荐的书吧。记住,没有哪本书对所有人来说都是最好的。另外,要写地道的C++程序,而避免用C++的语法写传统风格的程序,新瓶装旧酒没多大意义。(遗憾的是,目前在市面上的中文C++教材中,符合B. S的这个标准的可以说一本都没有,大家只好到网上找一些英文的资料来学习了。--译者)
6. 怎样改进我的C++程序?
不好说。这取决于你是怎麽使用该语言的。大多数人低估了抽象类和模板的价值,反过来却肆无忌惮地使用造型机制(cast)和宏。这方面可以看看我的文章和书。抽象类和和模板的作用当然是提供一种方便的手段建构单根的类层次或者重用函数,但更重要的是,它们作为接口提供了简洁的 逻辑性的服务表示机制。
7. 语言的选择是不是很重要?
是,但也别指望奇迹。很多人似乎相信某一种语言能够解决他们在系统开发中遇到的几乎所有问题,他们不断地去寻找完美的编程语言,然後一次次的失败,一次次的沮丧。另外一些人则将编程语言贬为无关紧要的细节,把大把大把的银子放在开发流程和设计方法上,他们永远都在用COBOL C和一些专有语言。一种优秀的语言,例如C++,能帮助设计者和程序员做很多事情,而其能力和缺陷又能够被清楚地了解和对待。
8. ANSI/ISO标准委员会是不是糟蹋了C++?
当然不是 他们(我们)的工作很出色。你可以在一些细节上找些歪理来挑刺,但我个人对於这种语言以及新的标准库可是欣欣然。ISO C++较之C++的以前版本更出色更有条理。相对於标准化过程刚刚开始之初,你今天可以写出更优雅 更易于维护的C++程序。新的标准库也是一份真正的大礼。由於标准库提供了strings, lists, vectors, maps以及作用于其上的基本算法,使用C++的方式已经发生了巨大的变化。
9. 你现在有没有想删除一些C++特性?
没有,真的。问这些问题的人大概是希望我回答下面特性中的一个:多继承 异常 模板和RTTI。但是没有它们,C++就是不完整的。在过去的N年中,我已经反复考虑过它们的设计,并且与标准委员会一起改进了其细节,但是没有一个能被去掉又不引起大地震。
从语言设计的角度讲,我最不喜欢的部份是与C兼容的那个子集,但又不能把它去掉,因为那样对於在现实世界里工作的程序员们来说伤害太大了。C++与C兼容,这是一项关键的设计决策,绝对不是一个叫卖的噱头。兼容性的实现和维护是十分困难的,但确实使程序员们至今受益良多。
但是现在,C++已经有了新的特性,程序员们可以从麻烦多多的C风格中解脱出来。例如,使用标准库里的容器类,象vector, list, map, string等等,可以避免与底层的指针操作技巧混战不休。
10. 如果不必和C兼容,你所创造的语言是不是就会是Java?
不是,差得远。如果人们非要拿C++和Java来作比较,我建议他们去阅读The Design and Evolution of C++,看看C++为什麽是今天这个样子,用我在设计C++时遵从的原则来检验这两种语言。这些原则与SUN的Java开发小组所持的理念显然是不同的。除了表面语法的相似性之外,C++与Java是截然不同的语言。在很多方面,Java更像Smalltalk(译者按:我学习Java时用的是Sun的培训教材,里面清楚地写道:Java在设计上采用了与C++相似的语法,与Smalltalk相似的语义。所以可以说Java与C++是貌合神离,与Smalltalk才是心有灵犀)。Java语言相对简单,这部分是一种错觉,部份是因为这种语言还不完整。随 时间的推移,Java在体积和复杂程度上都会大大增长。在体积上它会增长两到三倍,而且会出现一些实现相关的扩展或者库。这是一条每个成功的商业语言都必须走过的发展之路。随便分析一种你认为在很大范围内取得了成功的语言,我知道肯定是无有例外者,而且实际上这非常有道理。
上边这段话是在Java 1.1推出之前写的。我确信Java需要类似模板的机制,并且需要增强对於固有类型的支持。简单地说,就是为了基本的完整性也应该做这些工作。另外还需要做很多小的改动,大部份是扩展。1998年秋,我从James Gosling(Java语言的创始人--译者)那里得到一份建议书,说是要在Java中增加固有类型 操作符重载以及数学计算支持。还有一篇论文,是数学分析领域的世界级大师,伯克利大学的W. Kahan教授所写的How Java's Floating-Point Hurts Everyone Everywhere("且看Java的浮点运算如何危害了普天下的芸芸众生"--译者),揭露了Java的一些秘密。
我发现在电视和出版物中关於Java的鼓吹是不准确的,而且气势汹汹,让人讨厌。大肆叫嚣凡是非Java的代码都是垃圾,这是对程序员的侮辱;建议把所有的保留代码都用Java重写,这是丧心病狂,既不现实也不负责任。Sun和他的追随者似乎觉得为了对付微软罪恶的"帝国时代",就必须如此自吹自擂。但是侮辱和欺诈只会把那些喜欢使用不同编程语言的程序员逼到微软阵营里去。
Java并非平台无关,它本身就是平台。跟Windows一样,它也是一个专有的商业平台。也就是说,你可以为Windows/Intel编写代码,也可以为Java/JVM编写代码,在任何一种情况下,你都是在为一个属於某个公司的平台写代码,这些代码都是与该公司的商业利益扯在一起的。当然你可以使用任何一种语言,结合操作系统的机制来编写可供JVM执行的程序,但是JVM之类的东西是强烈地偏向于Java语言的。它一点也不像是通用的 公平的 语言中立的VM/OS。
私下里,我会坚持使用可移植的C++作大部份工作,用不同的语言作余下的工作。
("Java is not platform-independent, it is the platform",B. S的这句评语对於C++用户有 很大的影响,译者在国外的几个新闻组里看到,有些C++高手甚至把这句话作为自己的签名档,以表明对Java的态度和誓死捍卫C++的决心。实际上有很多程序员不光是把自己喜爱的语言当成一种工具,更当成一种信仰。--译者)
11. 您怎麽看待C#语言?
就C#语言本身我没什麽好说的。想让我相信这个世界还需要另外一个专有的语言可不是一件容易的事,而且这个语言还是专门针对某一个专有操作系统的,这就更让我难以接受。直截了当地说,我不是一个专有语言的痴迷者,而是一个开放的正式标准的拥护者。
12. 在做大项目时,您是不是真的推荐Ada,而不是C++?
当然不是。我不知道这是谁传出来的谣言,肯定是一个Ada信徒,要麽是过份狂热,要麽是不怀好意。
13. 你愿不愿意将C++与别的语言比较?
抱歉,我不愿意。你可以在The Design and Evolution of C++的介绍性文字里找到原因。
有不少书评家邀请我把C++与其它的语言相比,我已经决定不做此类事情。在此我想重申一个我很久以来一直强调的观点:语言之间的比较没什麽意义,更不公平。主流语言之间的合理比较要耗费很大的精力,多数人不会愿意付出这麽大的代价。另外还需要在广泛的应用领域有充份经验,保持一种不偏不倚 客观独立的立场,有 公正无私的信念。我没时间,而且作为C++的创造者,在公正无私这一点上我永远不会获得完全的信任。
人们试图把各种语言拿来比较长短,有些现像我已经一次又一次地注意到,坦率地说我感到担 。作者们尽力表现的公正无私,但是最终都是无可救药地偏向于某一种特定的应用程序,某一种特定的编程风格,或者某一种特定的程序员文化。更糟的是,当某一种语言明显地比另一种语言更出名时,一些不易察觉的偷梁换柱就开始了:比较有名的语言中的缺陷被有意淡化,而且被拐弯抹角地加以掩饰;而同样的缺陷在不那麽出名的语言里就被描述为致命硬伤。类似的,有关比较出名的语言的技术资料经常更新,而不太出名的语言的技术资料往往是几年以前的,试问这种比较有何公正性和意义可言?所以我对於C++之外的语言的评论严格限制在一般性的特别特定的范畴里。
换言之,我认为C++是大多数人开发大部份应用程序时的最佳选择。
14. 别人可是经常拿他们的语言与C++比来比去,这让你感到不自在了吗?
当这些比较不完整或者出於商业目的时,我确实感觉不爽。那些散布最广的比较性评论大多是由某种语言,比方说Z语言的拥护者发表的,其目的是为了证明Z比其它的语言好。由於C++被广泛地使用,所以C++通常成了黑名单上的头一个名字。通常,这类文章被夹在Z语言的供货商提供的产品之中,成了其市场竞争的一个手段。令人震惊的是,相当多的此类评论引用那些在开发Z语言的公司中工作的雇员的文章,而这些经不起考验文章无非是想证明Z是最好的。特别是在这些比较中确实有一些零零散散的事实,(所以更具欺骗性--译者),毕竟没有一种语言在任何情况下都是最好的。C++当然不完美,不过请注意,特意选择出来的事实虽然好像正确,但有时是完全的误导。
以後再看到语言比较方面的文章时,请留心是谁写的,他的表述是不是以事实为依据,以公正为准绳,特别是评判的标准是不是对於所引述的每一种语言来说都公平合理。这可不容易做到。
15. 在做小项目时,C优于C++吗?
我认为非也。除了由於缺乏好的C++编译器而导致的问题之外,我从没有看到哪个项目用C会比用C++更合适。(不过现在C++编译器导致的问题还是不可忽略的,当你看到同样功能的C++程序可执行代码体积比C大一倍而且速度慢得多时,会对此有所感触的。--译者)
以下内容来自Visual C++ Developer's Journal主编
Elden Nelson 2000年3月对B. S的专访
16. 如果您现在有机会从头设计C++语言,您会做些什麽不同的事情?
当然,你永远都不可能重新设计一种语言,那没有意义,而且任何一种语言都是它那个时代的产物。如果让我今天再设计一种语言,我仍然会综合考虑逻辑的优美 效率 通用性 实现的复杂程度和人们的喜好。要知道人们的习惯对於他们的喜好有 巨大的影响。
现在,我会寻找一种简单得多的语法,我会把类型系统的冲突问题限制在很少的几种情况里,而且你能很容易的发现这些问题。这样就能够很容易的禁止不安全的操作。(B. S的原则是:对於糟糕的代码,就算是不能完全禁止,至少也要让它大白于天下,而不是藏在阴暗的角落里暗箭伤人。C++实际上已经提供了这样的机制,例如如果你使用象reinterpret_cast(pointer)这样的很明显是非常糟糕的表达式进行造型,别人会很容易地找到问题所在。只不过C++仍然允许你使用传统的 C风格的造型机制,而又有不少人一直使用这种老式的风格,所以才引来麻烦多多。B. S的意思是说,要是现在能够禁止老式的风格该有多好 作为语言设计者的他,恐怕是没有这个机会了,但是作为语言使用者的我们,却还有很大的希望去改进自己的代码。何去何从,应该是我们深思的时候了。--译者)
我还会把核心语言的体积尽可能搞得小一些,包括类和模板的关键的抽象特性,而把很多其它的语言特性放在库里来解决。当然我也会保证核心语言足够的强大,使得那些库本身也足以用这个核心语言来产生。我可不希望标准库的创建需要用到什麽不属於该语言本身的神秘机制。另外我会让这个核心语言的定义更加精确。(有不少新的语言在建库时就使用了一些"不属於该语言本身的神秘机制",比如VB和JAVA。从理论上讲,这是近乎无赖的行径,所以B. S不以为然。不过从实用出发倒也无伤大雅。--译者)
最重要的是,我会在该语言被广泛使用之前尽可能维持一个很长的酝酿期,这样我可以以其他人的反馈为基础进行改进。这可能是最困难的,因为一旦有什麽东西是明显出色和有前途的,大家就会蜂拥而至的来使用它,此後作任何不兼容的修正都会是非常困难的。
我相信这些思想与我当初设计C++时的理念是非常类似的,同样也是这些思想指引 一二十年来C++的不断演化。当然,我认为现在还没有什麽东西能让我觉得像是"完美的语言"。
17. 您预期C++做哪些增强,会不会删掉一些东西?
很不幸,虽然有一些东西很应该扔掉,但恐怕很难真的删掉任何东西。第一个应该抛弃的东西就是C风格的造型机制和类型截断转换。就算不禁止,编译器的作者们至少也应该对这种行为给与强烈的警告。我希望能用类似vector的东西彻底取代数组,但这显然是不可能的。不过如果程序员们能主动使用vector来代替数组,就会立刻受益匪浅。关键是你不必再使用C++中最复杂难缠的技巧了,现在有优秀得多的替代方案。
至於主要的特性,我没想去掉任何东西。特别是那些把C++与C区别开来的主要特性恐怕没法风平浪静的被抛掉。通常问这些问题的人是希望我挑出诸如多继承 异常 模板等机制来接受批判。所以在这我想大声讲清楚,我认为多继承机制对於静态类型语言实现继承性来说是必需的,异常机制是在大系统中对付错误的正确方法,模板机制是进行类型安全的 精致的和高效的程序设计的灵丹妙药。我们可以在小的细节上对於这些机制挑挑刺,但在大的方面,这些基本的概念都必须坚持。
现在我们仍在学习标准C++,也正在标准所提供的特性基础上发展出更新的 更有趣的编程技术。特别是人们刚刚开始使用STL和异常机制,还有很多高效强大的技术鲜为人知,所以大可不必急匆匆的跑去增加什麽新的机制。
我认为当前的重点是提供很多新的 比以前更加精致的 更有用的库,这方面潜力巨大。例如,如果有一个能被广泛使用的 更精致的支持并发程序设计的库,那将是一大福音--C风格的线程库(例如Pthread--译者)实在不够好。我们也就可以与各种其他的系统,例如SQL以及不同的组件模型更好地契合起来。数值计算领域的人们在这方面好像已经走在了前面,类似像Blitz++ POOMA MTL之类的高效而精致的库的开发已经取得了非凡的成就。(译者在Internet上造访了Blitz++和POOMA的主页,前者是一个高性能数学库,据称其性能与Fortran 77不相上下,同时又支持大量的C++特性。我想凡是对於数值计算领域有所了解的人都知道这有多麽伟大的意义。POOMA则是一个专门研究C++并行数学算法的项目,它的前景更加不可限量。译者非常认同B. S的这个观念。--译者)
有了足够的经验之後,我们就能更好的决定应该对标准做些什麽调整。
18. 显然,这几年世界变了,正在走向一个以Web为中心 分布式计算为主流的时代。那麽您觉得C++还能维持其地位吗?程序员们可不可能把若干种专用语言(比如Perl Javascript)综合运用以彻底取代某一种通用语言?(C++就是这样的通用语言--译者)为了配合新的计算模式,C++及其标准库应该做怎样的调整?
从来没有哪一种语言能适合所有的工作,我恐怕以後也不会有。实际系统通常是用多种语言和工具构造起来的。C++只是想成为若干语言和工具中的一个,当某些专用语言在其领域里特别突出时,它们可以与C++互为补充。也就是说,我觉得如果大多数现在的专用语言能借助特定领域的C++库共同工作的话,它们会表现得更出色。脚本语言通常导致难以维护的代码,而且也没有给程序的结构 可扩展性和可维护性的优化留下什麽余地。
我不敢肯定未来的代码是否真的会是以Web为中心的。就算是直接处理Web的系统也主要是由处理本地资源,如IP连接之类的程序模块构成的。
地理上的分布性以及服务器软件对於并发机制的高度依赖对於系统的建造者来说的确是个挑战。有些针对上述问题的库已经出现,也许我们将会看到它们最终得以标准化。当然,一些原操作和保证规则应该被加到核心语言中以提供对这些库的更佳支持。
总的来说,对於Web和网络,我们非常需要一个真正的系统/网络级的安全模型。指望JavaScript之类的脚本语言实现这个模型无异于白日做梦。
注意,我也没说C++提供了这个问题的解决方式。C++的重心是高效的访问系统资源,而不是反欺诈。
19. 您看C++未来的走向如何?在接下来的10年里它会衰落吗?或者是基本保持现在的形式?或者发展变化呈不同的形式?
C++有 最美好的未来。用它你能写出伟大的代码。除了故意进行恶意欺诈,C++仍将是开发高性能 高复杂度系统的最好语言。据我所知,没有那种语言能在通用性 效率和精致三方面的统一上可与C++相题并论。
我没看到C++有衰落的徵兆。在我能预见的未来里,它的用途还会不断增长。当然,在未来的十年里我们会看到一些变化,但不会像你想得那麽显着。跟每一种语言一样,C++也会发展变化。"语言专家们"要求改进的喧嚣声震耳欲聋,但是系统开发者们的基本请求是保持稳定。
C++会改进,但是这些改进将主要是为了反映从实践中得来的经验教训,而不会是为了追风尚赶时髦。为了更高效地使用一些新的编程技术,比如通用编程技术,可能会增加一些小的特性。会有大量的库涌现,我预期会出现一种崭新的 更出色的库支持机制。我希望新的扩展主要集中在支持抽象方面的一般特性,而不是为支持某些特殊任务的特定机制。
例如,"属性"这个概念是很有用的,但我不认为在一种通用编程语言中有它的容身之地。用标准C++的一组类可以很容易地支持这一概念。如果我们感觉那族类对於"属性"这一概念的支持不尽如人意,也不会立刻跑去在语言里增加属性机制,而是仔细考虑如何改进类和模板以帮助库设计人员尽可能接近"属性"这个概念。也许通过改进函数对象的机制能够给这个问题一个满意的答复。
为了使C++在接下来的十几年中保持灵活可变,很基本的一点就是不要让标准C++赶什麽学术或者商业的时髦。人们要求增加的特性中很大一部份通过使用现有的标准C++开发新库的方式都可以实现。还有,事实上人们渴望得到的很多特性已经被包括在标准C++中,并且被最新的编译器支持。
对许多程序员来说,提高代码质量的最佳途径不是追求什麽语言扩展,而是好好地 慢慢地品味最新的C++技术书籍(可惜我们到目前为止连这种机会都没有--译者)。
20. 您怎麽看待脚本语言的兴旺态势?特别是Python,似乎提供了一种学习OO技术的更简单的途径
有些语言很不错。比如Python,我很喜欢。但是我认为你从不同的语言中学到的OO技术是不完全相同的。当然,每一个专业的程序员都需要通晓几门语言,并且了解各种语言在编程和设计技术上的不同。
在我看来,用脚本语言建造的系统与用C++那样的通用语言建造的系统大不相同。从两类语言中学到的技术区别明显。在OO技术里也不存在什麽通用部份对於各种系统的高效建造来说都是至关重要的。
21. 有没有计划往标准C++里增加一些新的特性以支持分布式计算?
没有,我也不认为有这个必要。用更好的库就差不多能解决问题了。最多,为了支持这类的库,我们可能会增加一些低级的原操作和规则
22. 未来C++有没有可能定一个可移植的二进制接口?
如果你说的"可移植"是指跨硬件和块操作系统的可移植,我想回答是不会。我们当然可以设计一个解释器或者虚拟机(如同Java的做法--译者),但这样一来,由於无法以最优的方式访问系统资源,C++的能力就会受到削弱,。我真正希望在不远的将来能够看见的东西是platform ABIs(ABI, Application Binary Interface) 。例如,有人正在努力为Intel新的IA64体系定义C++ ABI,我想这些努力会得到用户们的巨大支持。能够把不同编译器产生的代码编译在一起将会是一项十分有意义的事情。
23. 在不少流行领域,C++正在渐渐失去光芒,因为它要求人们花很大的精力去对付一些很基本的工作,比如管理内存(因为没有垃圾收集机制),管理模块之间的依赖性(因为没有包机制),管理组件的版本。C++缺乏一些现代语言已经视为标准的特性。比如传言中最酷的Java语言就特别重视这些问题。那麽在解决这些问题是否会导致C++的发展背离其根本宗旨呢?C++应该怎样发展以保证我们在这种语言上的投资能有合理的回报,而不是被迫去重新使用另一种语言?
我倒还没有注意到C++比以前用的少了。相反,我看到的指标表明C+的使用还在稳定地增长 。只不过这种基数很大的稳定增长以及在标准性 移植性和库方面的不断提高并没有造成什麽具有欺骗性的新闻效应而已。我认为你所说的"失去光芒"只不过是市场推销和新闻意义上的现象。
如果你需要垃圾收集机制的话,你可以在C++应用程序中插入一个垃圾收集器。有不少自由的和商业的垃圾收集器已经在重要的实践中被证明是很出色的。
如果你不想使用垃圾收集机制,也没关系。你可以使用标准容器类,它们大大减少了对於显式分配和回收内存的需要。这样,使用现代的库和现代的编程风格,你能够避免大部份的内存管理问题。
同样的技术还能够用来避免一般资源的管理问题。并不是只有内存才会泄漏,线程句柄 文件 互斥锁 网络连接等都是重要的资源,为了建立可靠的系统,这些资源必须被正确的管理。如果你觉得有了垃圾收集机制就可以解决所有的资源管理问题,那麽你最好赶快从美梦中醒来。
C++提供了很多机制来管理一般性的资源。关键的手段--"Resource Acquisition is Initialization"(这是著名的RAII惯用法,阅读原文时会经常遇到,其意义是说将所有的资源分配申请放在对象初始化过程中进行,而将资源释放动作放在对象销毁过程中——译者)可以使用函数对象来管理生存期问题。语言中关於对象的局部构造和异常机制对这项技术提供了支持。
某些语言的狂热支持者总是用讽刺漫画的笔法描述C++,然而C++实际上要好得多。特别是我觉得很多其他的特性已经泛滥不堪了,在C++中,通常这些特性能够很容易的被模拟出来。相反的,新的语言在推广的过程中总是不断地增加新的特性,这就是为什麽从一种语言诞生到被广泛使用,其体积通常会增加个两三倍。
目前,最为个人和组织,对於C++的最好投资就是去更好地理解标准C++和现代的C++设计编程技术。大多数人使用C++的方式实际上停留80年代中期的水平,甚至比那更陈旧。
至於模块依赖性问题,我的观点是,在编程语言的工作和系统的工作之间应该有一个明显的界线,依赖关系应该尽可能地与编程语言分开,而由系统来支持。
我不认为组建版本的问题应该由编程语言来解决,这是一个系统范畴里的问题,在语言里应该通过提供相应的库来解决。C++有这样的机制。
解决这样的问题不会使C++偏离轨道。但是给C++增加很多特殊的特性就会使C++偏离轨道,而且在保持可移植性和平台独立性方面也会是一个倒退。
24. 标准C++推出有段时间了,Java也大踏步地往前走而且取得了显着的进步,您现在怎麽比较Java与C++?您觉得Java想要变成像C++一样"好"的语言还需要做些什麽?您举的C++从Java身上学到了什麽经验吗?有没有什麽Java的特性您认为是可以被C++吸纳的?
我不比较语言。做好这项工作是十分困难的,而且很少具有专业水准。
我认为C++的进步会是主要以它的用户在使用中遇到的问题以及其自身逻辑为基础。当然,其他语言中的某些思想也会被考虑,但不能被简单的移花接木过来。你必须审视那些机制在技术上和思想上的背景,并且找到在C++中支持这些技术的最佳方案。
有时最好的选择是综合使用几种语言。毕竟没有任何一种语言是放之四海而皆优的。C++现在是,将来也继续会是在广泛应用领域中最好的语言之一。但是,我们不能被拉下水,不能把所有可能的特性都加到C++里面来向大众献媚。我认为Java和C++现在和将来都会是十分不同的语言,语法相似,但背後的对象模型明显不同。
对於我来说,一个很重要的区别是C++有一个ISO标准,而Java则是一个专有语言。
25. 在Java刚刚出现的那几年,有很多欺骗性的言论说它将会是终极语言,会取代C++。您觉得在过去两三年里Java对C++的追随者们有什麽影响?
到现在关於Java的不实之辞也还随处可见。暂且不提Java在过去5年间的创纪录的发展,狂热的大众似乎认为Java将最终取代的不仅仅是C++,而且还有所有其他的编程语言。但在另一方面,C++的使用仍在继续增长。我不认为Java对於C++的影响已经使得人们转而把本来打算用来创造更好的C++工具库的资源调过去开发Java工具库。Java对於学习编程的人来说没有太多的新东西,所以对於C++的定义也没什麽影响。在那个领域,Java还得努力追赶。例如,我认为为Sun迟早会往Java里加入类似模板的机制。
人们应该认识到C++和Java的目标是何等的不同。 以C++的设计理念来衡量Java,或是以Java的设计理念来衡量C++,得出的结论都不会很好。
在访谈即将结束时,或许我该再次表明态度:C++仍然是我喜爱的语言,在写代码时你会发现没有那种语言能像它那样在如此广泛的应用领域和平台上同时达成如此的高效与精致。
]]>
posted on 2005-09-15 12:54
Sung 阅读(722)
评论(0) 编辑 收藏 所属分类:
software Development