电脑报
在开发业界,每一个时期总有一些代表的人物,代表的技术。STL就是这样的一门技术,它是那样深刻地影响了一个时代的C++开发。和一群聪慧的C++程序员谈S
TL,就如同和资深的会计师谈珠算一般。
今天我们就有幸请到了STL之父Alex Stepanov,为我们溯源STL,你甚至还能读到对OO与众不同的理解等内容,希望读者能有所收获。
当我面对面见到Alex Stepanov先生时,和像片中的感觉完全不同。从像片上看他, 我们不难对他有威严的感觉。但实际上那并非生活中的他——幽默风趣、平易近人才是真正的他。
Alex先生和C++之父Bjarne先生是很好的朋友,Bjarne的推荐对我们的采访起了重要的推动作用,他告诉我:Alex先生经常有一些有趣的和重要的东西要说。
Alex先生有着非常强烈的个人魅力,他的言辞尖锐,甚至让人想到“猛烈”“激进”等字眼,这可能也正是他对计算机内涵的深刻体会和精深的数学涵养所致——他的眼里容不得半粒沙子。
他给我们的忠告很简洁:“好好学数学,好好学计算机,好好学英语。”
溯源STL
追根溯源,STL起源于什么?意大利记者的提问或许对我们有所帮助。
问:STL一开始被设想成今天这个样子吗?即所谓的C++标准库,或者,它是从别的什么项目发展变化来的?告诉我们一些关于STL的历史好吗?
Alex:1976年,又要说到原苏联了。我因为吃生鱼片严重食物中毒而住院,在精神恍惚中,我忽然意识到并发的加法计算能力是基于加法是结合性的[译注:比如说a+b+c+d=(a+b)+(c+d)]。因此,STL可以说是细菌传染的结果。同时,我意识到并发的减法运算是和半群结构类型有关联的,这就是最基本的重点:算法是定义于代数结构基础之上的。我又花了一些年头,意识到必须在正规公理上加入复杂性必要条件以扩展结构的概念,接着又花了15年之久才完成全面的架构(我直到现在都不能确定我是否成功地让我朋友小圈子之外的任何人理解了这一点)。我相信迭代器理论是计算科学的中心,就像环或 Banach区间理论是数学的中心一样。
每次当我找到一个算法时,我都要努力去寻求它所定义的结构基础。我想做的就是泛化地描述算法,并乐此不疲。我可以花一个月时间去精确地描述一个众所周知的算法的泛化表示。迄今为止,在向人们解释我这种行为的重要性方面,我是异乎寻常的失败。然而,不知何故,这种行为的结果─STL却是如此成功。
关于STL还有很多故事:STL如何成为C++标准的呢?Alex先生有下面的表述,表述中也有他对C++之父Bjarne先生的精彩描述。
&
nbsp; 问:有一件事情我一直都很惊奇——C++标准委员会那么快就采纳了STL?我的意思是,这些委员会成员可都是以谨慎和保守而出名的。这一点,你怎么解释?
Alex:Bjarne的支持是至关重要的。如果说Bjarne想要什么东西的话,那就是他真的想把STL弄到标准里,他办到了。他像骡子一样固执。甚至逼着我去改STL——我从来都不会为第二个人这么做——我也是个顽固分子。但他是我所认识的最有主见的人,他花了一些时间去理解STL是干啥的,当他理解之后,他决定使它成功地被大家接受。
他对STL的贡献还在于他支持“不止一种编程方法是‘合理的’”的观点——这对立于十来年认同“唯一”方法的无休止的争执和夸大——而坚持把弹性、效率、重载、类型安全结合在模板里以至于使STL成为可能。我很乐意明白地声明Bjarne是我这一代人里卓越的语言设计家。
问:您是由于什么原因开发了STL?开发的过程是什么样子的?它对您的生活和研究有什么影响吗?
Alex:STL的开发源于我多年对程序灵活性和参数化探索的结果。我对此仍不太满意:因为C++语言上的一些缺陷,使得我不能完全表达我要表达的意思。 STL应当做将来要设计的库的草稿。我不知道在我有生之年是否能看得到,但我坚信最终会有一个关于算法和数据结构的标准架构,说不定作为读者的你就是这一发明人呢!
我觉得很难形容STL对我生活和研究的影响。STL并未从本质上改变我的生活,因为我没有通过它赚到任何钱。我想向我的几个朋友展示一下正确的编程方法,而 STL正是为他们而做的。事实上将
这项工作完成带给我很多快乐,当我听说它帮助某人解决了问题时,我更加快乐。当然也有人说如果让他们设计,他们可以设计出更好的东西来,也有人对STL嗤之以鼻,这些攻击也确实伤害到了我。
OO与编程
和STL形成对照的是OO——面向对象。OO的思想困扰着许多程序员,OO的思想一直困扰着我,从未有人对OO表达过如此强烈的想法——除了Alex先生。我想:作为一个程序员,这是一定要掌握的,但是……,请看下面Alex先生的观点:
问: 您对面向对象是怎样理解的?它是不是一种好的可接受的编程思考方式?有没有学习OO必须的有用的工具?
Alex:我尽量避免用OO思考问题,我对他们编程的方法不感冒。在意大利的一家期刊采访我时我曾说过:“我发现 OOP在技术上是有问题的,它妄图用基于单一类型的不同接口来分解世界,为了处理不同的实际问题,你需要不同种类的代数方法以横跨不同类型的接口族;我发现OOP在思想上是不健全的,它声称一切都是一个对象。
即使真的是这样,也没什么意思——说一切都是对象跟什么都没说一样;我发现OOP的方法论是错误的。它从类开始,就好像数学要从公理开始一样。你不是从公理开始——你是从证明开始的。直到你找到了一大堆相关证据你才能归纳出公理,以公理结束。编程上存在着同样的事实:你要从有趣的算法开始。只有很好地理解了算法,你才有可能提出合理的接口让其他组件共同工作。”我再重复强调一点:程序是描述算法和数据结构的,而不是描述继承性和多态性的。
问:您认为编程的好方法是什么?对于编程来说,一种工具是不是必需的?
Alex:我认为学习多种不同的编程语言是非常重要的。我用过Algol-60, Common Lisp, Scheme, Ada, C, C++, Java,和多种汇编语言。然而,也不能仅仅局限于程序语言,它仅仅是种表达算法和数据结构的工具——并且是种有缺陷的工具。如Niklaus Wirth有句精辟的见解:程序=算法+数据结构。
问:您认为计算机语言和人类的语言有什么区别?
Alex:没有人尝试过用计算机语言写出诗歌来。计算机语言发展到能允许我们解决一些真正美好的现实生活中的东西,还有很长的路要走。