LinuxWorld对Bjarne Stroustrup的采访 荣耀 马皓明 译 LinuxWorld.com:自20世纪六十年代后期,面向对象语言就不断涌现,可是面向对象技术革命的开始却延迟了20多年,您怎么解释这个延迟现象,我们从中可以得出什么结论? Bjarne Stroustrup:部分原因是,人们改变行为所需要的时间总是比我们愿意相信的那个时间要长。另一个主要原因是,一些人对于“革命”抱有(或曾经有过)不切实际的期望。“存在一条本质上无所不能的正确路线”的想法,在根本上就是错误的。我是面向对象编程及其支持的设计理念与技术(起源于Simula 67)的“狂热爱好者”。但是,它们并不是唯一有效的技术。有很多程序被很好地完成了,而它们所使用的技术并没有落入“面向对象”的狭隘定义。同样,假如将面向对象的定义拓展得足够宽泛,使其不会成为优秀编程与设计的障碍,那得到的基本上也是毫无疑义的东西。请参考我的文章:《为什么C++不仅仅是一门面向对象的编程语言》。 另一个原因是,推崇“真正的OO”或“纯粹的OO”的人们,通常使用这样的语言和系统来达到此项目的 — 与C/C++相比,它们对于简单任务强加了巨大的开销。 我得出的结论(大约于1980年)是:一个通用目的的编程语言必须支持多种编程范型,而且每种范型都要受到良好支持,并且在运行时间和空间效率方面尽可能达到最优。我发现新思想被采纳的速度,被“守旧主义”严重减缓了,而这种“守旧主义”,往往以“复杂性”和“开销”方面的无稽之谈作为靠山。 另一个问题是,许多人 — 包括许多程序员、教育者和管理人员,都很不情愿直面软件开发的复杂性。他们梦想着“银弹”,拒绝有效的思想,只是因为这些思想未臻完美且对于初学者来说难以上手。这导致实际的工作正使用不必要的旧语言、工具以及技术来完成,而稀缺的资源则被浪费于一连串的时髦玩意之中。对问题复杂性的低估,也导致了每一个新的“银弹”过于简单,以至于无法解决现实软件开发世界中的难题。并且,一旦有某种新东西与现实相适应,它就易于受到各种公正或不公正的批评,这些批评来自于下一代“银弹”的信徒们对其复杂性的诟病。 让我们再回到不完全是技术方面的话题。我认为,任何一个期望成为主流的语言,都必须为多种技术提供一个广泛的基础 — 包括面向对象编程(类层次体系)和泛型编程(参数化的类型和算法)。尤为重要的是,它必须提供良好的便利设施,以用于将程序的不同部分(有可能使用几种不同的语言编写)组织起来。我还认为异常对于管理“错误处理方面的复杂性”是必不可少的。一门缺乏此类特性的语言,会迫使其用户费尽心力地去模拟实现这些特性。 LinuxWorld.com:我们在不久的将来会看到哪些重要的编程趋势?函数型编程(functional programming)、基于规则的编程(rule-based programming)、泛型编程(generic programming),以及其他编程范型,在未来的软件世界中将扮演什么样的角色?其中一些会成为主流吗,或者它们不过是一些“学术玩笑”而已? Bjarne Stroustrup:我不擅长预测未来,所以除了指出“未来通常比我们想象的更接近昨天”外,我不会尝试做其他预测。请注意,COBOL、FORTRAN和C仍然是主要的语言。泛型编程是真真切切存在的(主流的),你可以看到标准模板库(STL)是如何借用函数型编程社群的技术,并将其优雅高效地应用于C++环境之中的。基于规则的编程(请参考“资源”中R++链接)有一些关于某种程度上的失败和成功的记录,这使得它不足以被接受为主流。这非常可惜,但我不愿称它为“学术玩笑”。许多今天看上去孤立语言的特性,将会随其功能和技术嵌入某种主流语言例如C++,而成为主流。将来我们会看到大量的“多范型编程”和“多语言系统”。 LinuxWorld.com:随着新的C99标准的批准,C/C++的兼容问题似乎比任何时候都更加难讲,“向后兼容C”仍然是C++的目标之一吗?如果是的话,我们应该怎么做才能使两门语言之间的裂缝最小? Bjarne Stroustrup:C99专注于扩充C在数值运算领域的低层功能,它基本上忽略了体现于C++之中的抽象功能和通用目标。C添加了更多特殊的、专用目的的功能,而C++对于同样问题则是依靠以通用语言功能所实现的库加以解决,这使得兼容问题变得更加难以处理,“C99的变长数组对C++的vector”就是一个例子。两门语言更加协调地演化,将会避免这种分歧。 我的理想仍然是得到一门单一的语言。将C++与C99合并成一门单一、相当一致的语言,在技术上仍然是切实可行的。我认为这样的语言可以满足所有合理的技术需求。然而,我并不能确信这在“政治”上没有什么问题。作为此事的开端,C与C++的两个标准委员会需要合并为一体,因为两个不同团体并行地发展这两门语言,是不可能实现此一目标的。每一个委员会都吸引对方团体中“与大多数人意见不统一的人以及不喜欢向大多数人作出让步的人”。是的,单一的委员会“扶植”的是一个意见共享、彼此信任并且折衷让步的团体,而两个独立的委员会则为“意见分歧、漠视“困难的”事实和看法”带来了可乘之机。我个人观点是,两个委员会先拿出关于合并的一致意见,然后在ISO C++标准更新之前及时合并。这样将会产生一门更棒的语言和一个更强大的社群。 LinuxWorld.com:在一些羽翼未丰的语言中(比如Python或Ada95),有没有什么特性或者概念,是您希望看到加入C++的?C++到底需不需要添加什么额外的特性或者库呢? Bjarne Stroustrup:我希望看到即将进行的C++标准修订工作集中于“库”上,而对于语言自身的修订将局限于:错误的更正,使语言更加一致,提供细小的扩充以便支持流行的设计范型(paradigms),以及为“库”提供所需要的技术保证。比如,我猜测“并发”可以通过一个库来很好的支持,而这样的库无需对语言进行大的扩充就能实现。不过,这样的库的实现可能需要在标准中增添一些保证。此外,我希望看到C与C++合为一体。 考虑以下经常被讨论的主要的C++语言功能:
请注意,这些扩充主要是针对标准库的,而且无需增加运行时(runtime)和空间的开销就可以实现。如此一来,它们就可以在加入的同时又不违反“零开销”原则。在其他方面,对于地地道道的嵌入式系统编程来说,C++是一个优秀的语言选择,并且会保持如此。同样,所有功能应能和当前的标准库设施,比如字符串和容器,恰当地集成。 我乐观地认为,除了GUIs外,在2005年左右的C++标准修订版中,所有这些扩充都将完成而不会有不适当的争端。当然,这野心勃勃,但“雄心壮志”的一个“替代品”则是“停滞不前”。我认为开放源码社群能够在其中担当主要角色,因为除非我们通过高质量的实现获得经验,否则这些库将不会被标准所采纳,前者是“标准”的基石。 LinuxWorld.com:C++似乎在“语言鼓吹”这一重要前线失败了。很多人仍然错误地认为C++速度天生慢于C,媒体也没有确认C++是最广泛应用的通用编程语言,而是关注于其他一些被过度夸大的语言。是哪儿出了问题,该如何改变这一状况? Bjarne Stroustrup:C++在那些最重要的领域取得了引人注目的胜利。让人惊奇的是,这并不是通过任何组织并且本质上也未花费什么财力而达到的。这可能已导致C++社群骄傲自满、明显的分化并且易受敌意的宣传的攻击。我猜测真正的问题在于优秀的代码是“看不见”的 — 甚至对其用户也是如此。可以想一想Netscape和Internet Explorer这样的C++软件。为解决现实世界中的问题(比如电信管理、工程控制以及仿真)而生产软件的企业,并没有宣传他们使用的是何种语言,不幸的是,这给软件工具厂商和学者们造成了假象。 C++从没有得到任何大厂商的支持。所有大厂商都将某种专有语言摆在C++之上,而且一贯如此。C++从没有做过市场营销,即使做了市场营销,也常常是由于一些组织所销售的某些别的东西(比如软件开发环境)里恰好包含了C++。而且,C++社群也正是因为C++的巨大成功而受到伤害:很显然,它是众矢之的,而且,在今天这个高度商业化的世界里,已经很少有什么公平的战斗。 C++社群从没有过一个“定义良好的”中心为普及C++知识而提供资金。谁在为C++说话?消息如何传达到程序员、教育者以及管理人员那里?就在这个星期,我还听到一位教授在他的学生面前坚持说“还没有一个C++标准”!可悲的是,C++标准被批准已经是两年前的事了,这是一个普遍性的误解。 那么,现在C++社群应该做些什么呢?就是使C++的成功及其成功的技术广为人知。文章和研讨会可能有那么一些作用,但对于绝大多数繁忙的程序员们来说,网页上的简要描述是一个更加现实的选择。向开放源码站点提供高质量的代码,可能是向大众展示“C++可以做什么”的最有效途径(当前的例证有SGI STL和Boost.org)。总之,我们必须开创一个广为人知的C++相关信息的“入口”。 在向其C++用户宣扬“成功”方面,商业组织可以做得更好,尤其假如他们能够抑制住“将宣传重点集中于产品专有方面”的倾向的话。C++的多供应商和标准化的天性,是许多用户选择C++的一个主要原因。 关于C++的教学必须加以改进,标准库和抽象功能应该占据中心角色。将C++作为对C的一系列高级而复杂的扩充来讲授,是徒劳无功的,而且会导致混乱。(请参阅“资源”中《把标准C++当作一门新语言来学习》一文) 标准委员会必须在 “提供关键的可选物之标准版而不是非标准的东西和库”方面尽心尽职。总之,一切均有可能,但并非轻而易举。 资源 Bjarne Stroustrup的主页: Bjarne Stroustrup的传记: Bjarne Stroustrup的出版物: 《The C++ Programming Language》(Special Edition), Bjarne Stroustrup (Addison-Wesley, 2000): Bjarne Stroustrup的FAQ: C++标准委员会: C++ Boost.org: SGI标准模板库(STL)站点: R++: 一个基于规则的(rule-based)编程语言: C99的新特性: C标准委员会: Python组织: |