| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 465 人关注过本帖, 1 人收藏
标题:【重贴】C++创建者B.S.在自己主頁上發表的FAQ (關心C的人可關注談及C的部分 ...
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏(1)
 问题点数:0 回复次数:2 
【重贴】C++创建者B.S.在自己主頁上發表的FAQ (關心C的人可關注談及C的部分)
Bjarne Stroustrup 在自己主页上发表的FAQ
1. 请谈谈C++书。

没有,也不可能有一本书对于所有人来说都是最好的。不过对于那些真正的程序员来说,如果他喜欢从“经典风格”的书中间学习一些新的概念和技术,我推荐我的The C++ Programming Language, 1998年的第三版和特别版。那本书讲的是纯而又纯的C++,完全独立于平台和库(当然得讲到标准库)。该书面向那些有一定经验的程序员,帮助他们掌握C++,但不适合毫无经验的初学者入门,也不适合那些临时程序员品尝C++快餐。所以这本书的重点在于概念和技术,而且在完整性和精确性上下了不少功夫。如果你想知道为什么C++会变成今天的模样,我的另一本书The Design and Evolution of C++ 能给你满意的答案。理解设计的原则和限制能帮助你写出更好的程序。www.是最好的书评网站之一,很多有经验的程序员在此仗义执言,不妨去看看。

2. 学习C++要花多长时间?

这要看你说的“学习”是什么意思了。如果你是一个Pascal程序员,你应该能很快地使你的C++水平达到与Pascal相近的程度;而如果你是一个C程序员,一天之内你就能学会使用C++进行更出色的C风格编程。另一方面,如果你想完全掌握C++的主要机制,例如数据抽象,面向对象编程,通用编程,面向对象设计等等,而此前又对这些东西不很熟悉的话,花上个一两年是不足为奇的。那么是不是说这就是学习C++所需要的时间呢?也许再翻一番,我想打算成为更出色的设计师和程序员最起码也要这么长的时间。如果学习一种新的语言不能使我们的工作和思想方式发生深刻的变革,那又何苦来哉?跟成为一个钢琴家或者熟练掌握一门外语相比,学习一种新的、不同的语言和编程风格还算是简单的。

3. 了解C是学习C++的先决条件吗?

否!C++中与C相近的子集其实比C语言本身要好学,类型方面的错误会少一些,也不像C那样绕圈子,还有更好的支持库。所以应该从这个子集开始学习C++。

4. 要想成为真正的OO程序员,我是不是得先学习Smalltalk?

否。如果你想学Smalltalk,尽管去学。这种语言很有趣,而且学习新东西总是一个好主意。但是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<int>(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. C++及其标准库应该做怎样的调整?

显然,这几年世界变了,正在走向一个以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。例如,有人正在努力为Intel新的IA64体系定义C++ ABI,我想这些努力会得到用户们的巨大支持。

能够把不同编译器产生的代码编译在一起将会是一项十分有意义的事情。

其他重要问题

23. 在不少流行领域,C++正在渐渐失去光芒,因为它要求人们花很大的精力去对付一些很基本的工作,比如管理内存(因为没有垃圾收集机制),管理模块之间的依赖性(因为没有包机制),管理组件的版本。C++缺乏一些现代语言已经视为标准的特性。比如传言中最酷的Java语言就特别重视这些问题。那么在解决这些问题是否会导致C++的发展背离其根本宗旨呢?C++应该怎样发展以保证我们在这种语言上的投资能有合理的回报,而不是被迫去重新使用另一种语言?

我倒还没有注意到C++比以前用的少了。相反,我看到的指标表明C+的使用还在稳定地增长着。只不过这种基数很大的稳定增长以及在标准性、移植性和库方面的不断提高并没有造成什么具有欺骗性的新闻效应而已。我认为你所说的“失去光芒”只不过是市场推销和新闻意义上的现象。

如果你需要垃圾收集机制的话,你可以在C++应用程序中插入一个垃圾收集器。有不少自由的和商业的垃圾收集器已经在重要的实践中被证明是很出色的。

如果你不想使用垃圾收集机制,也没关系。你可以使用标准容器类,它们大大减少了对于显式分配和回收内存的需要。这样,使用现代的库和现代的编程风格,你能够避免大部分的内存管理问题。

同样的技术还能够用来避免一般资源的管理问题。并不是只有内存才会泄漏,线程句柄、文件、互斥锁、网络连接等都是重要的资源,为了建立可靠的系统,这些资源必须被正确的管理。如果你觉得有了垃圾收集机制就可以解决所有的资源管理问题,那么你最好赶快从美梦中醒来。

C++提供了很多机制来管理一般性的资源。关键的手段——“获取资源就是初始化”——可以使用函数对象来管理生存期问题。语言中关于对象的局部构造和异常机制对这项技术提供了支持。

某些语言的狂热支持者总是用讽刺漫画的笔法描述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++仍然是我喜爱的语言,在写代码时你会发现没有那种语言能像它那样在如此广泛的应用领域和平台上同时达成如此的高效与精致。



[此贴子已经被作者于2015-11-29 13:16编辑过]

搜索更多相关主题的帖子: 程序员 而且 风格 技术 
2015-11-29 13:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
Bjarne Stroustrup 语录

 一、致读者
   1. 在编程序时,你是在为你针对某个问题的解决方案中的思想建立起一种具体表示。让程序的结构尽可能地直接反映这些思想:
    ★.如果你能把“它”看成一个独立的概念,就把它做成一个类。
    ★.如果你能把“它”看成一个独立的实体,就把它做成某个类的一个对象。
    ★.如果两个类有共同的界面,将此界面做成一个抽象类。
    ★.如果两个类的实现有某些显著的共同东西,将这些共性做成一个基类。
    ★.如果一个类是一种对象的容器,将它做成一个模板。
    ★.如果一个函数实现对某容器的一个算法,将它做成为对一族容器可用的模板函数。
    ★.如果一组类、模板等相互之间有逻辑联系,将它们放进一个名字空间里。
    2. 在你定义一个并不是实现某个像矩阵或复数这样的数学对象的类时,或者定义一个低层的类型如链接表的时候:
    ★.不要使用全局数据(使用成员)。
    ★.不要使用全局函数。
    ★.不要使用公用数据成员。
    ★.不要使用友元,除非为了避免a或c。
    ★.不要在一个类里面放“类型域”(指那种为了说明一个类所存储数据的情况而放置的标志域) ;采用虚函数。
    ★.不要使用内联函数(inline function),除非作为效果显著的优化。
 二、C++ 概览
   1. 不用害怕,一切都会随着时间的推移而逐渐明朗起来。
   2. 你并不需要在知道了C++的所有细节之后才能写出好的C++程序。
    3. 请特别关注程序设计技术,而不是各种语言特征。
 三、标准库概览
   1. 不要像重新发明车轮那样企图做每件事;去使用库。
   2. 不要相信奇迹;要理解你的库能做什么,它们如何做,它们做时需要多大的代价。
   3. 当你遇到一个选择时,应该优先选择标准库而不是其他的库。
   4. 不要认为标准库对于任何事情都是最理想的。
   5. 切记#include 你所用到的功能的头文件。
   6. 记住,标准库的功能定义在名字空间std之中。
   7. 请用string,而不是char*。
   8. 如果怀疑,就用一个检查区间范围的向量(例如Vec)。
   9. vector<T> 、list<T>和 map<key,value> 都比T[] 好。
   10. 如果向一个容器中添加一个元素,用push_back() 或 back_inserter()。
   11. 采用对vector的push_back(),而不是对数组的realloc()。
   12. 在main()中捕捉公共的异常。
 四、类型和声明
   1. 保持较小的作用域。
   2. 不要在一个作用域和它外围的作用域里采用同样的名字。
   3. 在一个声明中只声明一个名字。
   4. 让常用的和局部的名字比较短,让不常用的和全局的名字比较长。
   5. 避免看起来类似的名字。
   6. 维持某种统一的命名风格。
   7. 仔细选择名字,反映其意义而不是反映实现方式。
   8. 如果所用的内部类型表示某种可能变化的值,请用typedef 为它定义一个有意义的名字。
   9. 用typedef为类型定义同义词,用枚举或类去定义新类型。
   10. 切记每个声明中都必须描述一个类型(没有“隐式的int”)。
   11. 避免有关字符数值的不必要假设。
   12. 避免有关整数大小的不必要假设。
   13. 避免有关浮点类型表示范围的不必要假设。
   14. 优先使用普通的int 而不是short int 或者long int。
   15. 优先使用double 而不是float 或者long double。
   16. 优先使用普通的 char 而不是 signed char或者 unsigned char。
   17. 避免做出有关对象大小的不必要假设。
   18. 避免无符号算术。
   19. 应该带着疑问去看待从signed 到unsigned ,或者从unsigned 到signed 的转换。
   20. 应该带着疑问去看待从浮点到整型的转换。
   21. 应该带着疑问去看待向较小类型的转换,如将int转换到char。
 五、忠告
   1. 避免非平凡的指针算术。
   2. 当心,不要超出数组的界线去写。
   3. 尽量使用0而不是NULL。
   4. 尽量使用vector 和valarray ,而不是内部(C风格)的数组。
   5. 尽量使用string而不是以0结尾的char 数组。
   6. 尽量少用普通的引用参数。
   7. 避免 void*,除了在某些底层代码里。
   8. 避免在代码中使用非平凡的文字量(“神秘的数”)。相反,应该定义和使用各种符号常量。(这里应理解为避免使用无意义的立即数,而定义一些能够代表意义的常量,例如,用true而不要用1(C/C++)或-1(VB))

授人以渔,不授人以鱼。
2015-11-29 13:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
经常看见有人说,学好了C,自然就能不费劲地学好C++,甚至不学自懂,说学C++之前必须学C。那么,好好地看看B.S.的观点吧,第2、9两个问题,尤其是下面这一段话:
从语言设计的角度讲,我最不喜欢的部分是与C兼容的那个子集,但又不能把它去掉,因为那样对于在现实世界里工作的程序员们来说伤害太大了。C++与C兼容,这是一项关键的设计决策,绝对不是一个叫卖的噱头。兼容性的实现和维护是十分困难的,但确实使程序员们至今受益良多。但是现在,C++已经有了新的特性,程序员们可以从麻烦多多的C风格中解脱出来。例如,使用标准库里的容器类,象vector, list, map, string等等,可以避免与底层的指针操作技巧混战不休。


这些话,实际上表明B.S.认为,拖累C++的恰恰正是与C兼容那部分。在问答2中,他也说了,应该直接从C++学起,从C++中与C最接近的地方学起,但绝对不是要学C的那些。形式相同,或相近,意义却不同。C++编译器在某些时候可以蜕化为C编译器,但这个编译器的厂家并不是说因此其C编译器部分就该绝对支持“C标准”,没有这种承诺,也不该有这种承诺。现在市面上的C/C++编译器绝大多数是C++编译器,我甚至不知道还有哪个现代编译器是纯粹的C编译器。

按照B.S.的说法,是纯粹的C越精通,离C++越远。这也是我多次提过的观点,所以我写和发的C代码,只是用C++与C最接近的部分写的,我不知道什么才是纯C,我只能说,那是C风格的。

会C就会C++,其实是B.S.所说的这句:“而如果你是一个C程序员,一天之内你就能学会使用C++进行更出色的C风格编程。”(问答2)

[此贴子已经被作者于2015-11-29 15:34编辑过]


授人以渔,不授人以鱼。
2015-11-29 15:23
快速回复:【重贴】C++创建者B.S.在自己主頁上發表的FAQ (關心C的人可關注談及C的 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032945 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved