数学建模社区-数学中国

标题: C++之父B. Stroustrup近期言论(1) [打印本页]

作者: 韩冰    时间: 2005-1-26 01:03
标题: C++之父B. Stroustrup近期言论(1)
<>[译者按]  Bjarne Stroustrup博士,1950年出生于丹麦,先后毕业于丹麦阿鲁斯大学和 </P>
- W- k0 D8 _2 Q/ u) R2 Z. P<>英国剑桥大学,AT&amp;T大规模程序设计研究部门负责人,AT&amp;T、贝尔实验室和ACM成员。 </P>
% L8 I+ e1 }! U4 J7 X$ b; [/ f3 r<>1979年,B. S开始开发一种语言,当时称为“C with Class”,后来演化为C++。1998年 </P>
) D/ I2 k! z; K' I% f  Z9 [<>,ANSI/ISO C++标准建立,同年,B. S推出了其经典著作The C++ Programming Language </P>% W  M0 h  O, V+ o
<>的第三版。C++的标准化标志着B. S博士倾20年心血的伟大构想终于实现。但是,计算技 </P>1 ]& {: z3 u- ?; h; l
<>术的发展一日千里,就在几年前人们还猜想C++最终将一统天下,然而随着Internet的爆 </P>
2 Y+ [' ]- X3 P7 i3 N5 a<>炸性增长,类似Java、C#等新的、现代感十足的语言  咄逼人,各种Script语言更是如雨 </P>
  b/ U( {1 }4 S<>后春 穹追子肯帧 在这种情况下,人们不禁有些惶恐不安。C++是不是已经过时了呢?其 </P>
4 |- f8 s/ V. n  L, O  M5 C<>前景如何?标准C++有怎样的意义?应该如何学习?我们不妨看看B. S对这些问题的思考 </P>
) S# ]  e' E1 I) Z0 t<>。以下文字是译者从Stroustrup1998年之后发表的若干文章、谈话笔记中精选出来的,由 </P>
+ M0 T0 S8 L4 J- r<>于出处不一,内容多有重复,为保持完整,亦一并译出。 </P>
- \* H( p5 C  L% O5 `# D- E<>  </P>' |" @$ X1 V2 n
<>以下内容选自B. S在自己主页上发表的FAQ </P>
! {' u  k) y1 a* a9 }6 E! y<>1. 请谈谈C++书。 </P>- c- m) ?& N+ Z0 s* ?# j* X1 v" @
<>没有,也不可能有一本书对于所有人来说都是最好的。不过对于那些真正的程序员来说, </P>( M6 n* L  n9 A) e, h; p- d
<>如果他喜欢从“经典风格”的书中间学习一些新的概念和技术,我推荐我的The C++ </P>/ k$ E# K, K. n% [$ d- Q# T) g$ [
<>rogramming Language, 1998年的第三版和特别版。那本书讲的是纯而又纯的C++,完全 </P>
/ M6 z6 H8 p; D9 e. i4 K0 p4 i+ i1 [<>独立于平台和库(当然得讲到标准库)。该书面向那些有一定经验的程序员,帮助他们掌 </P>
, I% H  g3 P$ i) G, J0 d; p<>握C++,但不适合毫无经验的初学者入门,也不适合那些临时程序员品尝C++快餐。所以这 </P>, B; R; w$ \1 V5 h1 w5 h/ p
<>本书的重点在于概念和技术,而且在完整性和精确性上下了不少功夫。如果你想知道为什 </P>
2 e; W* R* v8 K) H<>么C++会变成今天的模样,我的另一本书The Design and Evolution of C++ 能给你满意 </P>
- M: y) K5 }/ j0 C' B<>的答案。理解设计的原则和限制能帮助你写出更好的程序。<a href="http://www.accu.com" target="_blank" >www.accu.com</A>是最好的书评网 </P>6 m- N, N  {+ N5 c9 D
<>站之一,很多有经验的程序员在此仗义执言,不妨去看看。 </P>9 p9 H) P% I( T9 A# b4 f" B
<>  </P>
2 u8 w- g5 Z- p7 q! W<>2. 学习C++要花多长时间? </P>! U3 L8 x+ n) I. X6 R  i+ w8 u) a$ ~
<>这要看你说的“学习”是什么意思了。如果你是一个Pascal程序员,你应该能很快地使你 </P>; U" l3 H1 L  `5 `+ b# V! v! y8 l
<>的C++水平达到与Pascal相近的程度;而如果你是一个C程序员,一天之内你就能学会使用 </P>& c3 f! ]6 Y. K' X% f  T/ n
<>C++进行更出色的C风格编程。另一方面,如果你想完全掌握C++的主要机制,例如数据抽 </P>
5 I3 v: \& k8 I* b6 m' f6 H<>象,面向对象编程,通用编程,面向对象设计等等,而此前又对这些东西不很熟悉的话, </P>
# f4 P# G8 d! O; D  O! M! h<P>花上个一两年是不足为奇的。那么是不是说这就是学习C++所需要的时间呢?也许再翻一 </P>
% m6 E+ R# `* J, z' O; J4 m<P>番,我想打算成为更出色的设计师和程序员最起码也要这么长的时间。如果学习一种新的 </P>( {6 u9 R) s$ x% c; I1 \( T
<P>语言不能使我们的工作和思想方式发生深刻的变革,那又何苦来哉?跟成为一个钢琴家或 </P>
% R" b9 U/ P0 m" `. W+ }% j<P>者熟练掌握一门外语相比,学习一种新的、不同的语言和编程风格还算是简单的。 </P>/ i0 s1 ^. \" W! F: N
<P>  </P>9 }: b% g+ ]6 Z  X, U6 O
<P>3. 了解C是学习C++的先决条件吗? </P>
2 X! Q! G% I5 x: F/ |<P>否!C++中与C相近的子集其实比C语言本身要好学,类型方面的错误会少一些,也不像C那 </P>
# v" k; G# y! Z<P>样绕圈子,还有更好的支持库。所以应该从这个子集开始学习C++。 </P># V0 b& {. S6 f5 h& [+ K# s# }( g
<P>  </P>2 W* W3 c/ |4 ~2 W" A9 f, E0 E
<P>4. 要想成为真正的OO程序员,我是不是得先学习Smalltalk? </P># O9 \+ b) O, P! _: k( z8 V
<P>否。如果你想学Smalltaok,尽管去学。这种语言很有趣,而且学习新东西总是一个好主 </P>
  B1 B5 Y3 v/ r0 P9 ^<P>意。但是Smalltalk不是C++,而且把Smalltalk的编程风格用在C++里不会有什么好结果。 </P>, q& P, n: ~# A6 e* g; j
<P>如果你想成为一个出色的C++程序员,而且也没有几个月的时间百无聊赖,请你集中力量 </P>' h0 q# @6 |* V$ S' M5 j
<P>学好C++以及其背后的思想。 </P>
" \& y$ k9 w  e1 T$ m+ U<P>  </P>0 I) n) N/ X0 p
<P>5. 我如何开始学习C++? </P>
; B% T6 r# x4 m+ x<P>这取决于你的基础和学习动机。如果你是个初学者,我想你最好找个有经验的程序员来帮 </P>
8 J6 ?0 l! t& i% C- o<P>助你,要不然你在学习和实践中不可避免的犯下的种种错误会大大地打击你的积极性。另 </P>* y# m* q, m' c. `& K: v
<P>外,即使你的编译器配备了充足的文档资料,一本C++书籍也永远是必不可少的,毕竟文 </P>
' Z" j) f$ c6 e7 |<P>档资料不是学习编程思想的好教材。 </P>8 [0 L8 z( d) j9 V# q8 H" L
<P>选择书籍时,务必注意该书是不是从一开始就讲授标准C++,并且矢志不渝地使用标准库 </P>
; P& K. I2 k% R4 O7 L- P<P>机制。例如,从输入中读取一个字符串应该是这样的: </P>3 V' ]: ^" T* e9 O" _. @9 a  }
<P>        string s;       // Standard C++ style </P>- J% v% c$ x( ]: ]
<P>        cin &gt;&gt; s; </P>
8 v9 U& \' r" I& O0 r- c<P>而不是这样的: </P>
) d4 y( W( |* X) _<P>        char s[MAX];     /* Standard C style */ </P>
1 F8 p4 V" j$ `# i3 @) T<P>        scanf("%s",s); </P>5 L3 r" g+ r2 c# t. P% |; N
<P>去看看那些扎实的C++程序员们推荐的书吧。记住,没有哪本书对所有人来说都是最好的 </P>
& ]7 {; P* L2 q+ l* E# i5 y<P>。 </P>& Z) S* L2 H  u; u$ }
<P>另外,要写地道的C++程序,而避免用C++的语法写传统风格的程序,新瓶装旧酒没多大意 </P>& N/ a9 R3 ]) _; Q1 u' P  T' v/ ^
<P>义。 </P>
, ?0 h4 H+ A% w% N4 g<P>(遗憾的是,目前在市面上的中文C++教材中,符合B. S的这个标准的可以说一本都没有 </P>- z/ Y$ @: k9 T7 T" }" J% K
<P>,大家只好到网上找一些英文的资料来学习了。——译者) </P>7 `3 Q4 V# W* n+ a; X
<P>  </P>
( r5 z, I: X8 ^: p  L7 o5 @<P>6. 怎样改进我的C++程序? </P>
* g1 c6 O; Z& A! n: \! a<P>不好说。这取决于你是怎么使用该语言的。大多数人低估了抽象类和模板的价值,反过来 </P>* |; o# m7 ~- z2 T; V8 c/ m9 ~$ w/ [
<P>却肆无忌惮地使用造型机制(cast)和宏。这方面可以看看我的文章和书。抽象类和和模板 </P>$ N; s1 S. @/ y# o3 w. X: A
<P>的作用当然是提供一种方便的手段建构单根的类层次或者重用函数,但更重要的是,它们 </P>
2 ~& w$ ~5 H! b<P>作为接口提供了简洁的、逻辑性的服务表示机制。 </P>- B5 M3 |) D: J8 E
<P>  </P># Y( Y. r& H# q. |0 d) l/ p5 I
<P>7. 语言的选择是不是很重要? </P>
3 J" v; f  y6 x/ K<P>是,但也别指望奇迹。很多人似乎相信某一种语言能够解决他们在系统开发中遇到的几乎 </P>
- _/ ~5 ?1 B% y<P>所有问题,他们不断地去寻找完美的编程语言,然后一次次的失败,一次次的沮丧。另外 </P>
: [7 `# j8 l# Y# a6 N; S0 Z<P>一些人则将编程语言贬为无关紧要的细节,把大把大把的银子放在开发流程和设计方法上 </P>
7 [1 C& F/ V5 j. H7 [% l<P>,他们永远都在用着COBOL, C和一些专有语言。一种优秀的语言,例如C++,能帮助设计 </P>
; b9 Y; Z& f3 t0 m# l<P>者和程序员做很多事情,而其能力和缺陷又能够被清楚地了解和对待。 </P>
$ h! e0 F+ H8 r3 C% a  H<P>  </P>5 R1 @7 M& h9 q$ j7 i  i5 i) w" ]
<P>8. ANSI/ISO标准委员会是不是糟蹋了C++? </P>. N' O  h1 d: _+ C1 G5 S$ p8 E
<P>当然不是!他们(我们)的工作很出色。你可以在一些细节上找些歪理来挑刺,但我个人 </P>
1 c6 f/ j1 l3 n<P>对于这种语言以及新的标准库可是欣欣然。ISO C++较之C++的以前版本更出色更有条理。 </P>
' V7 y4 s, _  x8 b9 S% m<P>相对于标准化过程刚刚开始之初,你今天可以写出更优雅、更易于维护的C++程序。新的 </P>
3 b) @0 ^  F1 u<P>标准库也是一份真正的大礼。由于标准库提供了strings, lists, vectors, maps以及作 </P>. v- |" {, t! z
<P>用于其上的基本算法,使用C++的方式已经发生了巨大的变化。 </P>0 b0 C" S; L- h: s- l; u6 b
<P>  </P>
0 h8 d1 Z6 x1 l: h' \<P>9. 你现在有没有想删除一些C++特性? </P>: {8 ], p8 D5 w/ _9 c  i! ]
<P>没有,真的。问这些问题的人大概是希望我回答下面特性中的一个:多继承、异常、模板 </P>
: [6 w% Z1 r6 V# ?7 v* t, F<P>和RTTI。但是没有它们,C++就是不完整的。在过去的N年中,我已经反复考虑过它们的设 </P>
& C0 Z1 ?/ ]$ \6 x: A<P>计,并且与标准委员会一起改进了其细节,但是没有一个能被去掉又不引起大地震。 </P>  z. x- F- }' P6 Q) |5 Y
<P>从语言设计的角度讲,我最不喜欢的部分是与C兼容的那个子集,但又不能把它去掉,因 </P>
) d" W3 R4 O) O0 M4 z  |<P>为那样对于在现实世界里工作的程序员们来说伤害太大了。C++与C兼容,这是一项关键的 </P># [( `9 [3 `6 a3 q
<P>设计决策,绝对不是一个叫卖的噱头。兼容性的实现和维护是十分困难的,但确实使程序 </P>
6 n% s7 \" V. _- L' v# P  [<P>员们至今受益良多。但是现在,C++已经有了新的特性,程序员们可以从麻烦多多的C风格 </P>. }+ `, B+ {, [" R+ Q( O
<P>中解脱出来。例如,使用标准库里的容器类,象vector, list, map, string等等,可以 </P>
5 V& t( u5 f1 H" Y<P>避免与底层的指针操作技巧混战不休。 </P>
: l, w: T1 n# ]+ l<P>  </P># U& q$ m) K! J# @
<P>10. 如果不必和C兼容,你所创造的语言是不是就会是Java? </P>4 [( r* ?$ C. T0 I: \7 F1 L
<P>不是,差得远。如果人们非要拿C++和Java来作比较,我建议他们去阅读The Design and </P>5 R7 ^! x/ h" W1 d
<P>Evolution of C++,看看C++为什么是今天这个样子,用我在设计C++时遵从的原则来检验 </P>- B$ H. G+ r! O. x# I9 B/ r
<P>这两种语言。这些原则与SUN的Java开发小组所持的理念显然是不同的。除了表面语法的 </P>$ M# N  E; P9 I* ~/ z& ~1 }4 h& a
<P>相似性之外,C++与Java是截然不同的语言。在很多方面,Java更像Smalltalk(译者按: </P>' g8 J9 J( y8 f* k
<P>我学习Java时用的是Sun的培训教材,里面清楚地写道:Java在设计上采用了与C++相似的 </P>
: C) n0 c- @) Z2 W$ ?" Y9 B<P>语法,与Smalltalk相似的语义。所以可以说Java与C++是貌合神离,与Smalltalk才是心 </P># M  \8 O7 F" P* f: [8 p
<P>有灵犀)。Java语言相对简单,这部分是一种错觉,部分是因为这种语言还不完整。随着 </P>
; T. a$ h  e9 F, Y9 R2 ^( k$ i1 I4 u<P>时间的推移,Java在体积和复杂程度上都会大大增长。在体积上它会增长两到三倍,而且 </P>
1 p' k+ u+ D' n$ E0 R<P>会出现一些实现相关的扩展或者库。这是一条每个成功的商业语言都必须走过的发展之路 </P>8 k) t" n6 m: u, k' W
<P>。随便分析一种你认为在很大范围内取得了成功的语言,我知道肯定是无有例外者,而且 </P>
& p- B' @$ U' H! F<P>实际上这非常有道理。 </P>
4 x& a3 c: C- _4 `  y% n6 A) _<P>上边这段话是在Java 1.1推出之前写的。我确信Java需要类似模板的机制,并且需要增强 </P>  H# A% X6 P) p
<P>对于固有类型的支持。简单地说,就是为了基本的完整性也应该做这些工作。另外还需要 </P>% Y) K2 P4 x$ @5 M0 T
<P>做很多小的改动,大部分是扩展。1998年秋,我从James Gosling(Java语言的创始人— </P>
7 P7 k6 o4 v8 j* n' R; q<P>—译者)那里得到一份建议书,说是要在Java中增加固有类型、操作符重载以及数学计算 </P>5 [% k5 {* e& E$ e( n0 b
<P>支持。还有一篇论文,是数学分析领域的世界级大师,伯克利大学的W. Kahan教授所写的 </P>
4 [: h0 M& O& f# r4 A<P>How Java’s Floating-Point Hurts Everyone Everywhere(“且看Java的浮点运算如何 </P>
* W- ?6 h- k) l# Y% q; V: i<P>危害了普天下的芸芸众生”——译者),揭露了Java的一些秘密。 </P>
& O3 x( m, I; Y7 b<P>我发现在电视和出版物中关于Java的鼓吹是不准确的,而且气势汹汹,让人讨厌。大肆叫 </P>
5 I9 X5 R* ]+ G2 C7 V" O<P>嚣凡是非Java的代码都是垃圾,这是对程序员的侮辱;建议把所有的保留代码都用Java重 </P>+ q) l- r6 D% R
<P>写,这是丧心病狂,既不现实也不负责任。Sun和他的追随者似乎觉得为了对付微软罪恶 </P>% F  X! [6 f* U) o: ^
<P>的“帝国时代”,就必须如此自吹自擂。但是侮辱和欺诈只会把那些喜欢使用不同编程语 </P>
! ^" b/ n/ ~2 h5 L2 U<P>言的程序员逼到微软阵营里去。 </P>+ ^# T, ]; G3 R; K
<P>Java并非平台无关,它本身就是平台。跟Windows一样,它也是一个专有的商业平台。也 </P>1 J5 ^7 K$ ?; t$ Z1 u
<P>就是说,你可以为Windows/Intel编写代码,也可以为Java/JVM编写代码,在任何一种情 </P>( y2 K6 f0 h- h" z/ y" M
<P>况下,你都是在为一个属于某个公司的平台写代码,这些代码都是与该公司的商业利益扯 </P>) w$ W" j, d* t/ V
<P>在一起的。当然你可以使用任何一种语言,结合操作系统的机制来编写可供JVM执行的程 </P>
& E7 J0 ?. Q, u: W2 g" k<P>序,但是JVM之类的东西是强烈地偏向于Java语言的。它一点也不像是通用的、公平的、 </P>
3 j. n) l) z! n0 r8 U  z( T<P>语言中立的VM/OS。 </P>1 s4 b8 u/ X: O: b
<P>私下里,我会坚持使用可移植的C++作大部分工作,用不同的语言作余下的工作。 </P>
/ p  }! k$ H: c+ j5 h; t2 ]<P>(”Java is not platform-independent, it is the platform”,B. S的这句评语对于 </P>) E7 j& J- g. d9 g7 E$ f
: j( E$ T( w$ N8 M( k; T
<P>C++用户有着很大的影响,译者在国外的几个新闻组里看到,有些C++高手甚至把这句话作 </P>9 w" [9 l& ?) i" k" N* X5 e8 {4 U
<P>为自己的签名档,以表明对Java的态度和誓死捍卫C++的决心。实际上有很多程序员不光 </P>
4 X3 n) U7 t. m# A- v" u: ?<P>是把自己喜爱的语言当成一种工具,更当成一种信仰。——译者) </P>




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5