来源:http://hi.baidu.com/zhangshourui/blog/item/7d5c6238bd4f952596ddd81f.html
Bjarne Stroustrup 其它言论 http://www.royaloo.com/bjarne/bjarne.htm
承蒙孟岩先生允许,本译文引用了他的摘译稿,谨致谢意。
Elden Nelson:如果您现在有机会从头设计C++语言,您会做些什么样的改变?
Bjarne Stroustrup:当然,你永远都不可能重新设计一种语言,那没有意义,而且任何一种语言都是它那个时代的产物。如果让我今天再设计一种语言,我仍然会综合考虑逻辑的优美、效率、通用性、实现的复杂程度以及人们的喜好。要知道人们的习惯对于其喜好有着巨大的影响。现在,我会寻找一种简单得多的语法 — 它可能与人们对“熟悉”和“简单”的混淆认识相悖,我会把对类型系统的侵犯限制在极少的语言构造里,并且用明显“丑陋”的语法来标识它们。(就象我对对新风格的“转型”的处理,比方说,reinterpret_cast<数据类型>(p)就是一个用来描述一种“丑陋”操作的“丑陋”记号)。这样可以很容易地禁止不安全的操作。我还会把核心语言的体积搞得尽可能小一些,包括类和模板的关键的抽象特性,而把很多其它的语言功能放在库里来解决。当然我也会保证核心语言足够强大,使得那些库本身也足以用此核心语言来产生。我可不希望标准库的编写者依赖于普通用户无法使用的额外的语言特性。我还努力使核心语言的定义更加精确。最重要的是,我会在该语言被广泛使用之前尽可能维持一个很长的酝酿期,这样我就可以根据来自真实用户的坚实反馈对它进行改进。这可能是最困难的,因为一旦有什么东西明显出色并且前途光明,它就会被广为使用,此后进行任何不兼容的修正都将变得极其困难。我相信这些思想与我当初设计C++时的理念是非常类似的,它们同样也指引着一、二十年来C++的不断演化。当然,我认为现在还没有什么东西能让我觉得象是“完美的语言”。
Elden Nelson:当您设计C++语言时,您是否借鉴了其他崭露头角的对象语言(例如Modula-2)的思想?
Bjarne Stroustrup:在C++的设计过程中,我吸取了C、BCPL、SIMULA、ALGOL 68、Ada、ML以及其他一些语言的思想。当时我知道Modula-2,还知道至少一打别的语言,但我回想不起来Modula-2对我产生了什么直接的影响。为了回答“为什么C++会是这样(以及为什么不这样)”之类的问题,我撰写了《The Design and Evolution of C++》一书。也就是说,这本书记录了导致C++现状的设计决策、原则以及折中权衡,我推荐对此类问题感兴趣的读者阅读这本书。
Elden Nelson:您预期对C++做哪些增强,会不会删掉一些东西?
Bjarne Stroustrup:很不幸,虽然有一些东西真的可以扔掉,但恐怕很难删掉任何东西。第一个应该抛弃的东西就是C风格的转型机制和类型截断转换(narrowing conversions)。就算不禁止,编译器的作者们至少也应该对这种行为给与强烈的警告。我希望能用标准库中的vector之类的东西彻底取代数组,但这显然是行不通的。不过如果程序员们能主动在所有应用编程中使用vector来代替数组,就会立刻受益匪浅。关键是你不必再使用C++中最复杂难缠的技巧了,现在有优秀得多的替代方案。我没打算去掉任何大的特性。特别是那些把C++与C区别开来的主要特性恐怕没法风平浪静地被抛掉。通常问这些问题的人是希望我挑出诸如多继承、异常、模板等机制来接受批判。所以在此我想大声讲清楚,我认为多继承机制对于一门具有继承机制的静态类型语言来说是必需的,异常机制是在大系统中对付错误的恰当的方法,模板机制对于类型安全、优雅和高效的程序设计来说不可或缺。我们可以在语言细节方面对这些机制吹毛求疵,但在大的方面,这些基本概念都必须坚持。现在我们仍在学习标准C++,也正在标准所提供的特性基础上发展出更新且更有意思的编程技术。特别是人们刚刚开始使用STL和异常机制,还有很多高效强大的技术鲜为人知,所以大可不必急匆匆地跑去增加什么新机制。我认为当前的重点是提供很多新的、比以前更加精致的且更有用的库,这方面潜力巨大。例如,如果有一个能被广泛使用的、更精致的支持并发程序设计的库,那将是一大福音 — C风格的线程库实在不理想。我们也就可以与各种其他的系统比如SQL以及不同的组件模型更好地契合起来。在优雅高效的库的开发方面,数值计算领域的人们看起来已经走到了前面(例如Blitz++、POOMA和MTL,请访问http://www.research.att.com/~bs/C++.html)。有了足够的经验之后,我们就可以更好地决定什么能够(也应该)被标准化。
Elden Nelson:我们正不可避免地走向一个以Web为中心、分布式计算为主流的时代。那么您觉得C++还能维持其地位吗?程序员们可不可能把若干种专用语言(比如Perl、Javascript)综合运用以彻底取代某一种通用语言?为了配合新的计算模式,C++或标准库应该做出怎样的调整?
Bjarne Stroustrup:从来没有哪一种语言能适合所有的工作,恐怕以后也不会有。实际系统通常是用多种语言和工具构造起来的。C++只是想成为若干语言和工具中的一个,当某些专用语言在其领域里特别突出时,它们可以与C++互为补充。也就是说,我觉得如果大多数现在的专用语言能借助特定领域的C++库共同工作的话,它们会表现得更出色,而脚本语言通常导致难以维护的代码,这或许跟语言选择关系不大,可能更是因为急着想将产品尽快推向市场。如此一来,哪还有什么精力考虑程序结构、伸缩性和可维护性方面的问题?我不敢肯定未来的代码是否真的会以Web为中心,就算是直接处理Web的系统也主要是由处理本地资源(比如IP连接)的程序模块构成的。地理上的分布性以及服务器软件对于并发机制的高度依赖对于系统的构建者来说的确是个挑战。针对上述问题的一些库已经出现,也许我们将会看到它们最终得以标准化。当然,一些原语操作和保证规则应该被加到核心语言中以提供对这些库的更佳支持。总的来说,对于Web和网络,我们非常需要一个真正的系统/网络级的安全模型。指望下载的“以JavaScript之类的语言编写”的脚本来实现这个模型无异于痴人说梦。请注意,我也并没有宣称C++提供了这个问题的解决方案。C++被设计为对所有系统资源提供高效的访问,而不是为了防止被欺骗。
Elden Nelson:您认为C++未来的走向如何?在接下来的10年里它会衰落吗?或者基本保持现状,或者演化为某种不一样的东西?
Bjarne Stroustrup:C++有着极美好的未来。用它你能写出伟大的代码。不管被多少敌意的宣传所攻击,C++仍将是开发高性能、高复杂度系统的最佳语言。据我所知,还没有哪种语言能象C++这样,将通用性、效率和优雅有机结合。我没看到C++有衰落的迹象。在我能预见的未来里,它的用途还会不断增长。当然,在未来的十年里我们会看到一些变化,但不会象这篇访谈中的这套问题所暗示的那么多。跟每一种语言一样,C++也会不断演化。“语言专家们”要求改进的喧嚣声震耳欲聋,但是系统开发者们的基本请求是保持稳定。C++会改进,但这些改进将是“经验”的结果而非对“狂热”的反应。为了更高效地使用一些新的编程技术,比如通用编程技术,可能会增加一些小特性。会有大量的库涌现,我预期会出现一些新颖的便利设施以支持更好的库。我希望新的扩展主要集中在支持抽象方面的一般特性,而不是为支持某些特殊任务的特定机制。打个比方,属性(properties)是一个有用的应用层的概念,但我不认为在一种通用编程语言中有它的容身之地。用标准C++的一组类可以很容易地支持这一概念。如果我们感觉那族类对于“属性”这一概念的支持不合口味,我们也不应该立刻跑去在语言里增加属性机制,而是仔细考虑如何改进类和模板以帮助库设计人员尽可能接近“属性”这个概念。也许通过改进函数对象机制能够给这个问题一个满意的答复。为了使C++在接下来的十几年中保持生命力,很基本的一点就是不要让标准C++赶什么学术或商业时髦。人们要求增加的特性中很大一部份通过使用现有的标准C++开发新库的方式都可以实现。还有,事实上人们渴望得到的很多奇妙的特性已经包含于标准C++之中,并且被所有最新版本的编译器所支持。对许多程序员来说,提高代码质量的最佳途径不是追求什么语言扩展,而是静下心来品味最新的C++技术书籍。
Elden Nelson:对于当前脚本语言的兴旺态势您怎么看?特别是Python,与C++相比,它似乎提供了一种更简单的OO技术学习途径。
Bjarne Stroustrup:有些语言很不错。比如Python,我很喜欢。但是我认为你从不同的语言中学到的OO技术是不完全相同的。当然,每一个职业程序员都要通晓几门语言,并且应该意识到,在不同的语言之中,编程和设计技术有着显著不同。在我看来,用脚本语言建造的系统与用C++那样的通用语言建造的系统大不相同。从两类语言中学到的技术区别明显。不存在“可以满足绝大多数高效系统构建所需”的公共OO技术子集。
Elden Nelson:有没有计划对标准C++语言进行扩充或改进,从而为分布式计算提供更好的支持?
Bjarne Stroustrup:没有,我也不认为有这个必要。用更好的库就差不多能解决问题了。充其量为了支持这类的库,我们可能会增加一些低级的“原操作(primitives)”或“保证(guarantees)”。
Elden Nelson:将来C++有没有可能定义一个可移植的二进制接口?
Bjarne Stroustrup:如果你说的“可移植”是指跨硬件和跨操作系统,我想答案是no。我们当然可以设计一个解释器或者虚拟机什么的,但这样一来,由于无法以最优方式访问系统资源,C++的能力就会受到削弱。我希望在不远的将来能够看见平台ABIs(platform ABIs)。例如,有人正在努力为Intel新的IA64架构定义C++ ABI,我想这些努力会得到用户社群的强烈支持。能够把一台PC上不同编译器产生的代码连接(link)在一起是一件美妙的事。
Elden Nelson:您目前是否正在为其他新语言开展工作?
Bjarne Stroustrup:没有。我还在学习如何使用标准C++,并且进行一些分布式计算的试验。我认为编程本身远比编程语言细节有趣。我认为只有当你有一些东西无法用已有语言合理表达时,才需要考虑设计一门新语言。对我来说,绝大部分工作都可以通过C++很好地完成。
Elden Nelson:以“后知之明”的角度来看,您是否认为“使一个成员函数默认为非虚函数”是一个明智的决定?假设有机会改变,您会改变这个决定吗?
Bjarne Stroustrup:也是也不是。使C++保持生命力的要素之一即是“零开销规则”:你无需为你不用的功能付出代价。使一个成员函数默认为非虚函数会违反这条规则,还会为“提供高效的具体类型(concrete types)”增加难度。对于那些认为“类”即为存在于复杂层次结构中的大家伙的人们来说,默认为virtual是显然的。一般来讲,虚函数不适合那些关键的小而具体类型,例如复数、points、vectors、lists,以及函数对象。对于这样的类型来说,如下方面至关重要:表达的紧凑性、基本操作的内联化、访问的直接性、堆栈的配置,还有对“重载函数不会对语义造成不希望的修改”的保证。此外,如果默认为virtual的话,你将需要一个non-virtual或final关键字,而且当过度使用它时会导致扩展性问题。在语言设计里,的确没有免费午餐。
Elden Nelson:在您看来,经由IEEE执行的标准化过程对C++语言的完备性、灵活性以及能力等方面产生了怎样的影响?
Bjarne Stroustrup:对于C++来说,ISO标准化过去以和现在都是重要的。其重中之重在于,标准委员会为技术人员提供了一个探讨技术问题的“中立的舞台”。还有什么别的地方能够让来自于相互竞争的机构(比如Microsoft、IBM、Borland/Inprise以及Sun等)的用户和编译器编写者们出于对用户利益着想,坐到一起合作共事呢?ISO的工作是民主的,是以大多数人的意见为基础的。为了达成一致的意见是需要时间的,但这样的努力非常值得。否则将导致语言的定义只为某一家公司(或少数几家公司)的利益服务。由ISO工作而形成的标准C++比以前任何版本的C++都更加接近我的理想。标准C++的“异常”与我自己定义的几乎相同,模板更具灵活性,名字空间和运行时类型信息也被添加进来。从对编程风格(你也可称之为“范型”)提供支持的角度来看,其余内容皆属于细节问题,自然而然,标准委员会工作的主要部分便是精确定义这些细节。鉴于接近标准的编译器可以广泛获得,人们试验那些新功能的时机已经来临。在几年之前很多东西还没有成为现实,如今可以在实际应用中使用它们了。那些对于大多数人来说仅能在语言定义上看到的技术,现在已被开发出来。例如STL(标准库中容器和算法的框架)就是一个有意思的新技术的优秀资源。当然了,在接下来的关键项目中,你不应该冲到最前面使用所有语言特性和所有新技术,但是,是开始学习新语言特性和新标准库并试验它们哪些适合你哪些不适合你的时候了。假如需要文档资料,你可以通过ANSI以18美元购得C++标准(参见 www.research.att.com/~bs/C++.html),也可以免费获得接近标准的草案。但是,这份标准并不是教本。我向有一定经验的程序员推荐我的《The C++ Programming Language》第三版,这本书以更易理解的方式讲述了完整的语言和标准库,它还阐明了C++支持的很多基本设计和编程技术。然而,即便这本书也不适合初学者阅读,因此,请先浏览我的个人主页(www.research.att.com/~bs/)以了解我的写作风格和详细程度能否满足你的需要。
Elden Nelson:在不少流行领域,C++正渐渐失去光芒,因为它要求人们花很大的精力去对付一些很基本的工作,比如管理内存(因为没有垃圾回收机制),管理模块之间的依赖性(因为无法创建包(packages)),管理组件的版本。C++缺乏一些现代语言已经视为标准的特性,谣传中最酷的Java语言试图解决这些问题,那么解决这些问题是否会导致C++的发展背离其根本宗旨呢?C++应该怎样发展以保证我们在这种语言上的投资能有合理的回报,而不是被迫从头学用另一种语言?
Bjarne Stroustrup:我倒还没有注意到C++比以前用的少了,相反,我看到的指标表明C++的使用还在稳步上升。只不过这种基数很大的稳定增长以及在标准性、移植性和库方面的不断提高并没有造成什么具有欺骗性的新闻效应而已。我认为你所说的“失去光芒”只不过是市场营销和新闻意义上的现象。如果你需要垃圾回收机制的话,你可以在C++应用程序中插入一个垃圾回收器。有不少免费的和商业的垃圾回收器已经在重要的实践中被证明非常出色(可以参见www.research.att.com/~bs/C++.html)。如果你不想使用垃圾回收机制也没关系,你可以使用标准容器类,它们大大减少了对于显式分配和回收内存的需要。这样,通过使用现代的库所支持的现代的编程风格,你就能避免绝大多数内存管理问题。同样的技术还可以用来避免一般资源的管理问题。并不是只有内存才会泄漏,线程句柄、文件、互斥锁、网络连接等都是重要的资源,为了建立可靠的系统,它们必须被正确地管理。如果你以为有了自动垃圾回收机制就可以解决所有资源管理问题,那你最好赶快从美梦中醒来。C++提供了一些机制来管理常见资源。关键的手段 — 资源获取即初始化(resource acquisition is initialization)依赖于函数对象来管理生存期问题。语言中关于对象的部分构造规则和异常机制对这项技术提供了一般性的支持。关于异常处理技术的讨论,请参阅The C++ Programming Language (Special Edition) 的新附录“Standard-Library Exception Safety”,它也可以从我的Web站点访问到(www.research.att.com/~bs/3rd_safe0.html)。某些语言的狂热支持者总是用讽刺的手法来描述C++,然而C++实际上要好得多。特别是我认为很多其他特性已经被吹嘘过度了,而在C++中,通常这些特性能够很容易地被模拟出来。相反,新语言总有一种“在损害一般性的情况下”添加新特性的倾向,这也是一门新语言从诞生到被接受为一种用于常见计算的有用的工具,其体积和复杂度通常会增加两到三倍的原因之一。目前,使用C++的个人和组织可以进行的最佳投资就是去更好地理解标准C++和现代的C++设计和编程技术。大多数人使用C++的方式实际上停留在80年代中期的水平,甚至比那更落后。精确区分语言和系统/平台之间的责任是一个困难的问题,我的观点是,它们之间应该有一个明显的分界线,并且,依赖关系应该尽可能地置身于语言之外,系统相关和系统依赖的库才是解决系统依赖性的地方,而语言并不是。我不认为组件版本管理之类的问题应该由编程语言来解决,这是一个系统范畴的问题,在语言里应该通过提供用于系统访问的适当的库来解决。C++有这样的机制。解决这样的问题并不会违背我对C++所奉行的理念。但在另一方面,给C++增加很多特殊的特性会使C++偏离轨道,而且在保持可移植性和平台独立性方面也是一个倒退。