专访C++之父Bjarne Stroustrup博士Word文档格式.docx
- 文档编号:17116257
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:12
- 大小:217.25KB
专访C++之父Bjarne Stroustrup博士Word文档格式.docx
《专访C++之父Bjarne Stroustrup博士Word文档格式.docx》由会员分享,可在线阅读,更多相关《专访C++之父Bjarne Stroustrup博士Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
因为他认为C++的模板函数应该像Ada通用类一样显式实例化,而你坚持认为函数应使用重载机制隐式实例化。
正是由于您的坚持,这一技术后来在STL中发挥了重要作用。
能跟我们具体谈谈吗?
对此,我已经没有多少可补充的了。
在模板成为C++的一部分之前,Alex和我曾经花了一些时间去讨论语言特性。
从我的角度来看,当时的Ada经验给他施加了过大的影响,而Alex有着自己的优势--泛型编程的宝贵实践经验,这恰恰是我的不足。
他强化了我对不牺牲效率和内限制表达能力或牺牲效率的实现方法。
尤其是过去我对能否把模板参数限制在继承层次持怀疑态度,如今我态度依然。
联的偏好。
我们都讨厌宏而喜欢类型安全。
他本来想要更强的模板参数的静态类型检验,我也是这么想的,不过还没有找到可以不
后来Alex创造性地使用了我所设计的模板特性,这就导致了STL的诞生,使得目前人们开始重视泛型及生成编程。
跟Alex争论很有意思!
关于我对他风格的印象,参看http:
//www.stlport.org/resources/StepanovUSA.html【记者注:
这是一篇STL之父AlexanderStepanov的访谈录,内容相当激进,心脏不好的人请做好一切必要准备^_^。
Alex在GP上有极深的造诣,这篇访谈颠覆性不小,甚至可以看到他对OO的批判!
也许彻底抛弃OO很难,但Alex的话确实富有启发性,值得一看】。
我曾经试验过多种在不使用语言扩展的情况下约束模板参数的方式。
个人早期的想法在《TheDesignandEvolutionofC++》(《C++语言的设计与演化》的中文版和影印版均已由机械工业出版社引进出版)一书中已有详述,其后期的变体如今成为了普遍使用的约束和概念检查的一部分。
这些系统在表现力和弹性上比在其他语言中的常见内建设施要强很多。
如果要举例的话,可以参阅我的C++StyleandTechniqueFAQ(
3、经典流
JerrySchwarz在StandardC++IOStreamandLocales一书的前言中回顾了IOStream的历史。
我想在从经典流到标准IOStream的转变过程间一定有很多趣事,您能给我们讲一些呢?
我不想替这次转变再多说些什么了。
然而,我想强调的是原来我所设计的流库简单且高效,我在两个月内就完成了设计和建构。
那次关键的决策把格式与缓冲分离开来,并使用了类型安全的表达式语法(依赖于<
<
和>
>
运算符)。
与AT&
T贝尔实验室的同事DougMcIlroy进行了一番探讨之后,我最终做出了这些决策。
实验表明,诸如<
、>
、逗号和=都不太合适,后来我选择了使?
lt;
。
类型安全使得在编译时就可以决定一些原本在C风格库中需要在运行时才决定的事情,因而其性能非同一般。
在我刚开始使用流以后的不久,DavePresotto就把我的实现的缓冲部分替换成一个更出色的部分,我一直都没有注意到这一点,直到他后来告诉我。
目前的IO流肯定小不了。
不过我坚信,在许多通常没有使用IO流全部通用性的情况下,借助于强力的优化,我们可以重获原来的效率。
注意,IO流之所以如此复杂,大部分的原因是为了满足那些我原来所设计的经典流没能考虑到的需求。
例如,带本地化的标准IO流就可以处理经典流力不能及的汉字和汉字串。
4、C++、Java与C#
有人说Java是纯粹面向对象的,而C#更胜一筹。
而还有很多人说它们纯粹是面向金钱的。
以您之见呢?
我喜欢"
面向金钱"
这个词:
-)还有AndrewKoenig的成语"
面向大话"
我也喜欢。
不过,C++可不面向这两个东东。
对这点我还想指出,我认为纯粹性并不是优点。
C++的强项恰恰在于它支持多种有效的编程风格(多种的思维模型,如果你一定要这么说)以及他们之间的相互组合。
最优雅、最有效也最容易维护的解决方案常常涉及不止一种的风格(编程模型)。
如果一定要用吸引人的字眼,可以这么说,C++是一种多思维模型的语言。
在软件开发的庞大领域之中,需求千变万化,需要至少一种支持多种编程风格的通用语言,而且很可能需要一种以上。
再说,世界之大,总能容得下好几种编程语言吧?
那种认为一种语言对所有应用和每个程序员都是最好的看法,本质上就是荒谬的。
【注:
paradigm的中文翻译似乎没有约定。
有人偏好"
典范"
或者"
范式"
,记者则喜欢侯捷先生使用的"
思维模式"
思维模型"
总之,paradigm的大概意思是anexampleorpattern,大家理解就行。
】
Java和C#的主要力量源自于其所有者的支持。
这意味着低价(为取得市场份额免费发放实现和库),集约和不择手段的营销(欺骗宣传),以及由于缺乏替代厂商而产生的表面上的标准。
当然,就Java的情形而言,当其他厂商和修改版本出现后,版本、兼容性和移植问题也会像其他语言一样,重新冒出来。
不被语言所有者操纵的开放进程所产生的正式标准是最好的。
如果用户不想看到这种语言为了其发起者或所谓"
一般用户"
的利益,而不顾经济上无足轻重的"
少数派"
反对而来回折腾,像ISO这样正式的标准进程,则是他们唯一的希望了。
C++本可以更简单或更易用些(更纯粹,如果你认为这是必要的),不过这样就无法支持那些有着"
不同寻常"
的需求的用户了。
我个人很关注他们,他们要构建可靠性、运行效率以及可维护性远高于行业平均水准的系统。
我的猜测是,在10年内大多数的程序员都将面临"
的技术要求,他们可以从C++的多思维模型结构中受益,而Java和C#之类"
简化"
语言则力有不逮了。
我认为模板和泛型编程是现代C++的核心,是无损效率、类型安全代码的关键。
然而它们并不适合经典的面向对象编程思维模型。
5、Bjarne看C++的机制
IanJoyner在C++:
ACritiqueofC++andProgrammingandLanguageTrendsofthe1990s一书中比较了C++和Java并批评了C++的许多机制。
你赞成他的观点吗?
尤其是多数新语言都有垃圾收集机制,C++中会加入吗?
IanJoyner对C++的观点,我不敢苟同。
撇开这点,垃圾收集可能算是有价值的技术,不过并不是万能丹,它也会带来问题。
对C++而言,自动垃圾收集是一个有效的实施技术,有许多为C++设计的不错的垃圾收集器(商业支持和免费的都有),而且也被广泛地使用(参看我的C++页面上的链接)。
然而C++中垃圾收集机制应该是可选的,这样在不适合垃圾收集的地方,如严格的实时应用程序,可以免受其累。
关于垃圾收集,我的《TheC++ProgrammingLanguage》(《C++程序设计语言》)一书和我的主页上都用评注,可以参看。
我期望在下一个C++标准中能体现出我的意见,并做出明确的声明。
就此而论,C++可以优雅地处理一般的资源,而不仅仅局限于内存。
尤其是"
resourceacquisitionisinitialization(资源获得就是初始化)"
技术(参看D&
E、TC++PL和我的技术FAQ)支持对任意资源进行简单并且符合异常安全(exception-safe)要求的管理。
没有析构函数的Java不可能支持这一技术。
6、STL与C++的GUI
STL是一个超凡脱俗的跨平台架构。
有没有考虑在其他方面,比如GUI(图形用户接口),设计这样的标准架构?
很自然地,很多人会想如何在其他领域借鉴STL的成功。
比如在数值运算和图论方面都有了许多有趣的工作。
相关链接可以参看我的网页。
标准GUI价值极大,不过我怀疑其政治上的可行性。
太多有钱的大公司在维持其专有GUI上有着重大的商业利益,而且要求用户放弃现在所使用的GUI库也殊非易事。
有朋友可能奇怪,一个GUI库怎么扯出"
政治(politically)"
来了?
西方人口中的"
政治"
,在中文里并没有真正对应的词语。
这里的意思是ofconcerningpublicaffairs,跟中文里的"
无关。
下一段就是对这个所谓"
政治上的可行性"
的详细解释。
这里我所说的可行性是就商业和技术而言。
现在有好几种广泛使用的GUI,即使标准委员会提供一个替代方案,它们也不会就此退出。
其所有者和用户──常常有充分理由──会只是忽略新标准。
更糟的情况:
某些公司或群体会积极反对这样的标准,因为他们认为标准不如他们已有的库,或者因为差异太大而使得转换到新GUI不可行。
必须理解,如果标准不能充分服务于其目标用户,用户会视而不见。
许多ISO标准因为无人理会而变得无关紧要。
C++标准可不想成为其中一员──把现有实施拉近到一起,标准就功德无量了──我们不希望将来ISOC++标准被人忽略。
注意STL成功的一个主要原因在于它是一个技术突破。
它可不单是"
又一个容器库"
,因此它不需要和许多现有的容器库(其中几个品质卓著)直接竞争。
我猜想C++要有一个标准GUI,我们需要技术突破,加上好运多多。
不过我还是怀疑委员会有由必需的专业技术和资源来构建一个可以成为真实世界中真正标准的GUI。
我对标准库的想法倾向于修补现有库的遗漏(如hash_map和正则表达式),以及通过更广泛的运行时间类型信息和并发库来支持分布运算(可选)。
有时大家忘了,库不是非得成为标准的一部分才有用。
有成千上万有用的C++库。
例如,参见C++库FAQ(我的C++网页有链接)。
7、在C++中相得益彰的GP和OO
泛型编程是C++特殊的编程思维模型。
你是怎样看GP(泛型编程)和OO(面向对象)的?
将来C++会提供更强大的机制来支持GP吗?
有没有考虑引入其他思维模型,比如面向模式?
我认为,在C++中面向对象和泛型编程相得益彰,我所写的许多最优美的代码段都是两者的结合。
也就是说,那些认为OOP和GP水火不容的观点是错误的。
它们是应该组合使用的技巧,语言应该支持这样的组合──C++正是如此。
我觉得C++相当好地支持了泛型编程,所以只需要细微的增加。
模板化的typedef是个显而易见的例子。
我们要谨慎地扩展语言,仅当扩展对要表述的内容提供重大的便利时,我们才这样做。
比如我不支持对模板参数约束检查提供直接语言支持的想法。
通过约束/概念检查模板,我们已经可以比用为C++和相似的语言提议的各种各样的语言扩展做得更多。
谈起"
和"
新的思维模型"
让我很为难,只有很少的想法佩得上这样美妙的字眼。
我也担心对新观念过于直接的支持,可能会限制和跟不上我们的观念和技术的进一步演化。
理想的情况是,语言设施应有效地支持非常通用的观念,这样大家可以使用这些设施用各种风格来编写代码。
至于C++能优雅地支持哪些模式概念,能和不能通过与已有风格的组合,还有待观察。
我认为,只需要很少新的特定语言概念来支持模式。
8、今后C++将支持分布开发
今后C++会支持分布开发吗?
对RTTI和多线程的进一步支持呢?
对。
如果事情进展能如我所愿,C++标准的下一次修订会通过提供扩展的类型信息和并发支持库来支持分布计算。
我觉得这不需要特别的语言扩展。
不过在存在并发的情况下现有语言设施实施需要做出额外的保证。
我没有太多可说,因为围绕下一标准应该和不该包含哪些的讨论才刚刚开始。
我的看法是C++需要一个无缝地支持线程(在同一地址空间内)、进程(在不同地址空间)及远端进程(可能有重大的通讯延时而且网络可能暂时分离)的标准库。
支持这点会需要超越简单的Unix或Windows线程的设施。
但是我并不认为这需要设计新的语言元件。
9、爱好广泛的Bjarne
据说大人物年轻时就会表现出与常人的差异,请问您在大学就读时表现过什么与众不同的地方?
我并不清楚是否有人觉得我真的与众不同。
我猜想自己可能比多数人天真和显得理想主义那么一点点。
此外,比起大多数人,我花在解决现实问题的时间会多一点吧──我要挣钱以免债台高筑。
我可不能如此,因为家里并不富有,我一直被告诫要勤奋工作。
另一方面,我喜欢学习自己感兴趣的许多东西(包括哲学和历史),而不仅仅是那些直接有助于我取得学位和提高成绩的东西。
10、Bjarne的中国观
喜欢安徒生的童话吗?
在《夜莺》里他写到了中国。
您对中国、中华文化和中国人的印象如何?
以前去过中国吗?
2008年来中国看奥运会可能是个不错的主意。
作为一名丹麦人,我当然知道安徒生童话。
恰好我也很喜欢这些故事。
在《夜莺》里描绘的中国纯属虚构,与当时的中国可能有也可能没有任何联系。
安徒生创造的那个"
中国"
,是用来泛指许多个国家及其统治者的。
中国是个巨大的概念BjarneStroustrup,很难能对之有一个总体的印象。
我所遇到的中国人大都是程序员或者工程师,因此我对中国人的看法可能会过于狭隘。
纵使是类似于我的本国丹麦这样的小国和文化体也是十分复杂的,不是单个人能够完全理解的──丹麦只有500万人口。
我对历史很感兴趣,因此也看了数本有关中国历史和文化题材的书籍。
不过这可能意味着我头脑里的中国会比较古老,与现在的中国并不能相提并论。
我在台湾进行过一个星期的讲学,那里挺不错的,不过目前我尚没有机会访问大陆。
关于中国历史和文化的书我看过不少。
中国历史悠久、幅员辽阔,因此书的内容就集中于早期的事件、人和传统,几乎没有描绘近10年或者20年的中国。
尽管从新闻和中国朋友那里得知中国已经发生了巨大的变化,但是我对今日的中国还是相当无知(但是可能比大多数人对远方国度的那种无知要强一些),比如我对当今中国的文学和音乐一无所知。
因而一旦想起中国,我就可能想起很多严重过时的东西──尽管自己极力去避免此类的错误。
这里顺便说一句,我对主要从书本上获知的世界其他地区也都有类似的问题。
我对大型人群和有组织的群体事件不太热心,因此我会远离2008年奥运会,就象我远离那些原本可以参与的各届奥运会一样。
我希望能找个除此之外的机会访问中国。
Bjarne著作参考
《C++语言的设计和演化》
《C++语言的设计和演化(英文版)》
《C++程序设计语言(特别版)》即将出版,试读、预订
《C++程序设计语言(特别版)(英文影印版)》
以下内容选自B.S在自己主页上发表的FAQ
1.请谈谈C++书。
没有,也不可能有一本书对于所有人来说都是最好的。
不过对于那些真正的程序员来说,如果他喜欢从“经典风格”的书中间学习一些新的概念和技术,我推荐我的TheC++ProgrammingLanguage,1998年的第三版和特别版。
那本书讲的是纯而又纯的C++,完全独立于平台和库(当然得讲到标准库)。
该书面向那些有一定经验的程序员,帮助他们掌握C++,但不适合毫无经验的初学者入门,也不适合那些临时程序员品尝C++快餐。
所以这本书的重点在于概念和技术,而且在完整性和精确性上下了不少功夫。
如果你想知道为什么C++会变成今天的模样,我的另一本书TheDesignandEvolutionofC++能给你满意的答案。
理解设计的原则和限制能帮助你写出更好的程序。
是最好的书评网站之一,很多有经验的程序员在此仗义执言,不妨去看看。
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++,并且矢志不渝地使用标准库机制。
例如,从输入中读取一个字符串应该是这样的:
strings;
//StandardC++style
cin>
s;
而不是这样的:
chars【MAX】;
/*StandardCstyle*/
scanf("
%s"
s);
去看看那些扎实的C++程序员们推荐的书吧。
记住,没有哪本书对所有人来说都是最好的。
另外,要写地道的C++程序,而避免用C++的语法写传统风格的程序,新瓶装旧酒没多大意义。
(遗憾的是,目前在市面上的中文C++教材中,符合B.S的这个标准的可以说一本都没有,大家只好到网上找一些英文的资料来学习了。
——译者)
6.怎样改进我的C++程序?
不好说。
这取决于你是怎么使用该语言的。
大多数人低估了抽象类和模板的价值,反过来却肆无忌惮地使用造型机制(cast)和宏。
这方面可以看看我的文章和书。
抽象类和和模板的作用当然是提供一种方便的手段建构单根的类层次或者重用函数,但更重要的是,它们作为接口提供了简洁的、逻辑性的服务表示机制。
7.语言的选择是不是很重要?
是,但也别指望奇迹。
很多人似乎相信某一种语言能够解决他们在系统开发中遇到的几乎所有问题,他们不断地去寻找完美的编程语言,然后一次次的失败,一次次的沮丧。
另外一些人则将编程语言贬为无关紧要的细节,把大把大把的银子放在开发流程和设计方法上,他们永远都在用着COBOL,C和一些专有语言。
一种优秀的语言,例如C++,能帮助设计者和程序员做很多事情,而其能力和缺陷又能够被清楚地了解和对待。
8.ANSI/ISO标准委员会是不是糟蹋了C++?
当然不是!
他们(我们)的工作很出色。
你可以在一些细节上找些歪理来挑刺,但我个人对于这种语言以及新的标准库可是欣欣然。
ISOC++较之C++的以前版本更出色更有条理。
相对于标准化过程刚刚开始之初,你今天可以写出更优雅、更易于维护的C++程序。
新的标准库也是一份真正的大礼。
由于标准库提供了strings,lists,vectors,maps以及作用于其上的基本算法,使用C++的方式已经发生了巨大的变化。
9.你现在有没有想删除一些C++特性?
没有,真的。
问这些问题的人大概是希望我回答下面特性中的一个:
多继承、异常、模板和RTTI。
但是没有它们,C++就是不完整的。
在过去的N年中,我已经反复考虑过它们的设计,并且与标准委员会一起改进了其细节,但是没有一个能被去掉又不引起大地震。
从语言设计的角度讲,我最不喜欢的部分是与C兼容的那个子集,但又不能把它去掉,因为那样对于在现实世界里工作的程序员们来说伤害太大了。
C++与C兼
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 专访C+之父Bjarne Stroustrup博士 专访 C+ Bjarne Stroustrup 博士