找回密码
 注册
Simdroid-非首页
查看: 179|回复: 3

[10. Others] STL之父A.Stepanov专访(加点人气,版主手下留情:))

[复制链接]
发表于 2005-6-29 21:00:34 | 显示全部楼层 |阅读模式 来自 黑龙江哈尔滨
STL之父A.Stepanov专访  

作者:Graziano lo Russo  

译者:荣 耀  

[译序]  

这是stlport.com对STL之父A.  
Stepanov的专访,言辞甚为激进。我已经努力在忠实原著的原则上,尽量使译文看起来温
  
和一些,但仍不能丝毫掩盖其“反动”和“刻薄”。对此,我想,我们应该思考,而不是
  
争论。另外,关于术语称谓,我基本上(但不全是)采用侯捷老师的译法,如generic  

programming一词,即采用侯老师的繁体译法─泛型编程(这个词听起来很“酷”,不是  

吗J)。限于时间和能力,文中谬误之处,当以英文原版为准。  

问:  

可以先作个自我简介吗?  

答:  

     1950年11月16日,我出生于苏联莫斯科。在莫斯科大学研究数学,但我从未成为数  

学家。我实在不能对Tamagawa numbers产生兴趣,尽管我被人以为擅长Coxeter  
groups和一些别的东西。Hardy的念头对我毫无吸引力─他的数学从来不打算被实用化。  

我想做一些哪怕只有一丁点实际的事。不过,话说回来,我还是幸运的─能看到很多伟大
  
的数学家是如何做的─使我能彻底对那些批着数学外衣的所谓严谨免疫─不幸的是,这在
  
计算机科学中很普遍。  
因此,能成为一名程序员对我来说真是一件好事。1972年,我作为一名小组成员参与开发
  
一个用于控制大型水电站的新型小型机系统。我参与了所有部分的设计,从架构到OS硬件
  
测试(我的第一篇公开发表的论文就是关于实时操作系统的)到编程工具。我学到了关于
  
软件可靠性和效率性的  
第一手知识─电站系统是不能轻易重新启动的,水流也总是实时冲泄而下的。  

     那时,我还发现了两位伟大的计算机科学家Donald Knuth和Edsger Dijkstra的著作
  
,从中我学到了奠定我职业基础的科学知识。前者告诉我答案,而后者则引我深思。我一
  
次又一次地到他们的著作中寻觅新的见解。我的下一个重要的职业生涯阶段是在纽约  
Schenectady  
的通用电器研究中心计算机科学分部工作了5年。我工作在一个叫Tecton的高级语言上,  

阅读了大量的资料:从繁多的程序语言设计论文到William of Occam  
的逻辑纲要─亚里斯多德和中世纪逻辑学家知道很多出现在自然语言里的不同种类的逻辑
  
结构以及它们的正式属性。从那时起直到现在,我和Dave  
Musser合作进行了硕果累累的研究。1984年,我成为纽约布鲁克林理工大学助理教授。教
  
授计算机科学给我带来很大好处-我要对付各种研究生课程。在此过程中,我学到了很多
  
新东西。我还用Schema语言开发了一个巨大的数据结构和算法库,这项工作导致了Ada泛  

型库的诞生(和Dave  
Musser合作)。在贝尔实验室短暂地研究了一段时间C++算法后,我便去了位于Palo  
Alto的惠普实验室(1988年)。在这儿我花了四年时间研究存储系统:我不得不学习磁盘
  
控制器编程。1993年,我得到了一个短暂的回头研究泛型编程的机会。STL就是这次研究  

的结果。1995年我又到了Silicon Graphics,在此,我正试图组建一个小组进行进一步地
  
STL开发工作。  

问:  

你刚才提到了William of Occam。William of Occam曾说过“Entia non sunt  
multiplicanda”─我把它译为“[抽象]对象是不必要的”。好象你已经对OOP举起了  
Occam的剃刀。以算法而不是对象为起点之类的东西使我想起了中世纪关于宇宙的争论,  

对吗?  

答:  

这是个优美的比方,但我并不认为它是对的。我从来都不认为OO和现实主义者的哲学有什
  
么联系,而且我也压根不是一个唯名论者。一个不容否认的事实是:Franciscan学派的  

Alexander of Hales, Bonaventure 和  
Scotus都非常亲近Augustinian/Platonist[译注:柏拉图式]的传统。Occam是不折不扣的
  
个异端分子。作为他的编辑,Opera Omnia Gideon Gal曾说过:“但是这家伙真的疯了!
  
”  
问:  

     对于大多数意大利读者来说,“Stepanov”的名字和STL是不可分割的。STL究竟是  

指Standard Template Library[译注:标准模板库]还是 Stepanov and Lee?另外,在  

STL的历史里,D.Musser 和A.Koenig扮演了什么样的角色?  

答:  

     哦,它真的是指Standard Template Library。我曾经在Dr. Dobb's做的那个专访里
  
开玩笑说STL是指“Stepanov and Lee”,但它只是个玩笑而已。我已经和Dave  
Musser合作近20年了,我们之间的合作是如此紧密以致于很难说清到底谁贡献了什么。他
  
之所以没有出现在官方的STL作者的名单里仅仅因为在撰写标准建议的那一小段时间里,  

他在忙别的。Andy Koenig负责向我解释抽象C机器的结构。STL,从某种意义上说,是  

Dave  
Musser和我一直进行C机器模型开发的泛型编程技术的一个应用。如果不是Andy,我可能  

还在处理装箱、堆分配对象问题并为垃圾收集而憔悴。当然,Andy还和 Bjarne  
Stroustrup负责把STL弄到标准里去了。当要把美妙的设想变成完整的实现时,Meng  
Lee是个完美的合作伙伴。她使我专注─我经常会在问题得到解决之后失去兴趣─为什么  

当我知道解决办法时,“麻烦”这玩意总是知道答案的另外一部分?她在代码和文档上花
  
了大量的令人筋疲力尽的时间。从某种意义上说,她是唯一坚信能从那些原材料中加工出
  
实际东西的人。我想,  
在这一点上,Dave Musser和我都早已不抱任何希望─对能向任何人解释清楚我们搞了许  

久的究竟是什么东西。  

问:  

STL起源于什么?STL一开始被设想为今天这个样子吗?即所谓的C++标准库,或者,它是  

从别的什么项目来的?告诉我们一些关于STL的历史好吗?  

答:  

1976年,又要说回到苏联了,我因为吃生鱼片得了严重的食物中毒。当住在delirium医院
  
的时候,我忽然意识到并发的加法计算能力是基于加法是结合性的[译注:我对这句话的  

理解是:比如说a + b + c = a + ( b + c) = ( a +  b) +  
c]。(因此,简单地说,STL是细菌传染的结果J。)换句话说,我意识到并发的减法运算
  
是和半群结构类型有关联的。这就是基本点:算法是定义于代数结构基础之上的。当意识
  
到必须对正规公理加入复杂性必要条件以扩展结构的概念时,又花了我另外一些年头,接
  
着又花了15年使之工作  
。(我直到现在都不能确定我已经成功地让我朋友小圈子之外的任何人理解了这一点L)  

我相信迭代器理论是计算科学的中心就象环或Banach区间理论是数学的中心一样。每次当
  
我找到一个算法时我都要努力去寻求它所定义的结构基础。我想做的就是泛化地描述算法
  
,并乐此不疲。我愿意  
花一个月时间去发现某个著名算法的泛化表示。迄今为止,在向人们解释我这种行为的重
  
要性方面,我是异乎寻常的失败。但是,不知何故,这种行为的结果─STL却是如此成功  

。  

问:  

     我曾认为STL的复杂性纯粹是由于实现效率而不得不如此。而你好象暗示复杂性纯粹
  
是功能的[函数的?]必要条件,果真如此吗?  

答:  

     选择不同的算法依赖于数据结构提供的基本运算的复杂性。对于SCSI存储设备来说  

,磁盘和磁带在功能是等效的,但是对于一个想把磁带当成磁盘使用的软件设计人员来说
  
无疑是苦恼的。再看看STL,你可以一直使用前向迭代器实现p+n,为什么还要麻烦提供随
  
机存取的迭代器呢?  

问:  

     何谓泛型编程?我只在JOOP上看到A.Koenig写的一些“泛型编程”专栏。在大多数  

C++语言的书里,包括Coplien、 Meyer、 Stroustrup、Lippman等人的,都很难看到泛型
  
编程。我想STL应该描述为“用你从未认为可能的方式编写C++程序”。你赞同这个说法吗
  
?  

答:  

STL,至少对我来说,代表用一致的方式编程是可能的。实际上,它完全不同于过去我们  

看到的C++编程,也完全不同于大多数教科书里所描述的方式。但是,你知道,我并不是  

试图用C++编程,我只是试图找到一个合适方法处理软件。我已经为寻找一个可以表达我  

的意思的语言好长时间了  
。换句话说,我知道我想说什么。我想用C++说,我想用Ada说,我想用Schema说。我可以
  
让自己去适应语言,但本质上,我说要说的是语言无关的。迄今为止,C++是我所发现可  

以表达我想说的最好的语言。它虽非理想的媒介,但用它我可以比用别的语言表达得更多
  
。实际上,我的梦想是  
哪天会出现一个专门为泛型编程设计的语言。  

问:  

你可以为普通C++程序员解释一下什么是泛型编程、泛型编程和C++以及STL的关系吗?并  

且,你是怎么想到在C++里进行泛型编程的?  

答:  

泛型编程是一种基于发现高效算法的最抽象表示的编程方法。就是说,以算法为起点并且
  
寻找能使其工作并且有效率工作的最一般的必要条件。令人惊讶的是,大多数不同的算法
  
都需要相同的必要条件集并且这些必要条件有多种不同的实现方式。类似的事实在数学里
  
也可以看到,大多数不  
同的定理都依赖于同一套公理并且对于同样的公理有多种不同的模型。抽象机制!泛型编
  
程假定有一些基本的法则在支配软件组件的行为并且基于这些法则有可能设计可共用的模
  
块。甚至还有可以用此法则去指导我们的软件设计。STL就是一个泛型编程的例子。C++是
  
我可以利用之实现出令  
人信服的例子的语言。  

问:  

我认为STL和泛型编程标志着一个不同于一般C++编程风格(我发现这种风格基本上是从  

SmallTalk继承过来的)的新起点。你赞成这个说法吗?  

答:  

是的。STL不是面向对象的。我认为面向对象和人工智能[译注:即下文的AI]差不多,都  

是个骗局。我已经看到了一些OO的人们写的“有趣的”代码。某种程度上说,我对AI有偏
  
见:我听说好多关于MIT AI实验室的一帮人的东西了,他们真正干了一些基础性的工作:
  
Bill  
Gosper的Hakmem是程序员最好的读物之一。AI或许没有一个严肃的基础,但它制造出了  

Gosper和Stallman (Emacs), Moses (Macsyma) 和 Sussman (Scheme, 连同Guy  
Steele)。[译注:这句话应该是讽喻之意,可惜我未能真正理解L]。我发现OOP在技术上  

是错误的,它妄图用基于单一类型的不同接口来分解世界,为了处理不同的实际问题你需
  
要不同种类的代数方法─横跨不同类型的接口族;我发现OOP在哲学上是错误的,它声称  

一切都是一个对象。即使  
真的是这样这也不是很有趣─说一切都是对象跟什么都没说一样;我发现OOP的方法论是  

错误的,它从类开始。就好像数学要从公理开始一样。你不是从公理开始─你是从证明开
  
始。直到你找到了一大堆相关证据你才能归纳出公理。你是以公理结束。编程上存在着同
  
样的事实:你要从有趣  
的算法开始。只有很好地理解了算法,你才有可能提出接口以让其工作。  

问:  

我可以总结你的思想为“发现隐藏在算法之后的[泛型]数据结构”而不是“发现隐藏在对
  
象之后的[虚]算法”吗?  

答:  

正确。总是开始于算法。  

问:  

这需要从思想上做一个激进的改变,无论是imperative还是OO思想。相比“标准”的OO编
  
程比如SmallTalk或Java,这种方式利弊在于?  

答:  

我的方式能工作,他们的不行。试试用OO方式来实现一个简单的东西,比如说max,我不  

知道OO怎么能办得到。使用泛型编程,我可以这么写:  

template <class StrictWeakOrdered>  

inline StrictWeakOrdered& max(StrictWeakOrdered& x,StrictWeakOrdered& y)  

{return x < y ? y : x;}  

和  

template <class StrictWeakOrdered>  

inline const StrictWeakOrdered& max(const StrictWeakOrdered& x,const  
StrictWeakOrdered& y)  

{return x < y ? y : x;}  

(&和const &两个都要)。然后,我可以定义严格弱序的含义。用Java试试。你不能用  

Java写一个泛型的max()传入两个某种类型的参数并返回一个同类型的结果。继承和接口  

在这儿无济于事。如果不能实现max[译注:求最大值]或swap[译注:交换]或linerar  
search[译注:线性查找],那它们还有多大的把握去实现真正复杂的东西呢?这些就是我
  
的石蕊试验法:如果这个语言能让我实现泛型的max、swap和linear search,那它还是有
  
些潜力的。  

问:  

Java是一门非常新的语言,它还没有模板,因此禁用泛型编程。一切都必须是类。你怎么
  
看Java?  

答:  

我用Java编了几个月的程序。跟它的作者预言的相反,它并没有勾起我的兴趣。我没有从
  
中发现任何新的见解─有生以来第一次在一个新的语言里编程而没有发现新见解。它保留
  
了所有我在C++里从来都不使用的东西─继承、虚机制(OO垃圾),并且拿掉了我认为有  

用的东西。它可能会成  
功─毕竟,DOS就成功过─而且对于你们学习Java的读者来说可能有利可图,但它毫无任  

何知识价值。看看他们对散列表的实现,瞧瞧那个“酷”的sorting  
applet的排序例程,再试试AWT。判别一个语言的最好的办法是看看它的鼓吹者写的代码  

。“!@#$%^&%$!×¥#”J[译注:原文是"Radix enim omnium malorum est  
cupiditas"]—Java显然是一个面向金钱编程(MOP)的例子。SGI的Java首席倡导者曾对  

我说:“Alex,你必须去有金钱的地方。”但是我偏不去有钱的地方—那种地方通常味道
  
都不太好。  

问:  

你认为基于模板编程和泛型编程会被大多数C++程序员采用吗?或者它们仅仅局限于使用  

在STL内,有点象操纵器[manipulators],它从不在输入输出流库外使用。  

答:  

我不知道。STL背后蕴藏的思想需要一个很长的时间才会成为主流。10到15年后,一切都  

会真相大白。  

问:  

有一件事情我一直都很惊奇—C++标注委员会那么快就采纳了STL。我的意思是,这些委员
  
会可都是以谨慎和保守而出名的。这一点,你怎么解释?  

答:  

Bjarne  
Stroustrup的支持是至关重要的。如果说Bjarne想要什么东西的话,那就是他真的想把  

STL弄到标准里。他办到了。他象骡子一样固执。甚至逼着我去改STL—我从来都不会为第
  
二个人这么做—我也是个顽固分子,但他是我所认识的最有主见的人。他成功了。他花了
  
一些时间去理解STL是干  
啥的,当他理解之后,他决定使其更进一步。他对STL的贡献还在于他支持这个观点—不  

止一种编程方法是“合法的”—这反对了十来年的无休止的争吵和谎言,并坚持把弹性、
  
效率、重载、类型安全结合在模板里以致于STL成为可能。我很乐意明白地声明Bjarne是  

我这一代人里卓越的语言  
设计家。  

问:  

STL完全是模板的创造性应用,比如从类中导出符号类型,或者是迭代器标记的一系列重  

载算法的模式匹配。当然足够了,没有任何标准C++书籍提到这些术语,你是怎么想出这  

些术语的?  

答:  

我清楚地知道我要努力达到的目标,于是我“拧”这个语言直到我能够通过。但这花了我
  
好多年去发现所有的技术。我有很多错误的开始。比方说,我浪费了好多年试图从继承和
  
虚机制里找到一些有用的东西,直到我意识到那种机制从根本上是有缺陷而不能用的。我
  
非常高兴没有人能看到  
任何中间步骤—它们大都是愚蠢可笑的。我花了好长时间才弄出一些象点样子的东西。这
  
个工作对使Bjarne愿意往语言里加某些能使我的术语工作的特性起也到了帮助作用。有一
  
次他把这说成是“即时语言设计”。  

问:  

你认为向C++程序员教授泛型编程和STL的最佳途径是?你认为在学习STL之前、期间或之  

后,需要学习继承和其他OO技术吗?  

答:  

我计划在SGI教授一门关于泛型编程的课。我非常希望能出一本书,但我是一个声名狼藉  

的懒惰作者—我从来都没有完成论文过除非我有一个合作伙伴来做这个事。[译注:大师  

不屑回答该问题,同时我们也可猜测Meng Lee在STL中发挥的真正作用了LJ]  

问:  

我已经用Lycos[译注:一种WWW搜索引擎]搜索过你的论文,我只找到两条,是你提供给标
  
准委员会的关于STL的指南和摘要。  

答:  

是吗,我是懒,但我还没那么懒。我大概发表了20来篇的论文并且出了一本书。它们大都
  
在不同的STL站点。(Dave Musser的站点上可能有几篇。)  

问:  

那本书是?  

答:  

那本书叫《Ada泛型库:线性表处理包》["The Ada Generic Library: Linear List  
Processing Packages", by David R. Musser and Alexander A. Stepanov, Compass  

Series, Springer-Verlag, 1989.]它并不值得一读。  

问:  

STL使C++编译器到达了它们的极限。同时代的C++编译器还不能正确地编译一些STL代码。
  
你是怎么开发和测试STL的?  

答:  

为了试图编译STL我都白了不少头发了。不幸的事实是,当我开发STL时,因为编译器的限
  
制和bug,很多代码在当时的STL的实现中是不理想的。幸运的是,我从Bjarne那得到了不
  
少帮助,他指出某种尚未实现的特性假定会被实现。如果能有一个语言设计家告诉你,已
  
经给出的设施究竟干了  
些什么,那是大有帮助的。  

问:  

配置器是怎么到STL里的?对它们你怎么看?  

答:  

我发明了配置器去处理英特尔内存结构问题。理论上它们并不坏—添一层封装所有内存有
  
关的东西:指针、引用、ptrdiff_t、size_t。不幸的是,它们实际上不能工作。例如:  

vector<int, alloc1> a(...);  
vector<int, alloc2> b(...);  
你现在不能说:  

find(a.begin(), a.end(), b[1]);  
b[1] 返回一个alloc2::reference 并不是 int&。它可能会导致类型不匹配。有必要改变
  
实现方式—应该让语言核心去处理引用从而使配置器真正有用。  

问:  

这是不是指出了C++模板的一个严重的缺点?我可以使用模板参数定制一个类,但不同的  

特化实现类型并不兼容。但是,一个类不同的子类(在OO意义上)和其根类是类型兼容的
  
。  

答:  

我认为问题比“T* 是被硬连接[hardwired]在语言里”来得深。一般而言,我相信需要设
  
计一个从根本上可以用一致方式使用泛型编程的程序语言。我希望有人会雇我去做这个工
  
作。  

问:  

我在D.Musser站点上看到了两个散列表的实现,它们都可以工作并且十分灵巧—比一般类
  
库里的要灵巧得多。为什么散列表没有纳入STL呢?  

答:  

政治原因[译注:原文是Politics,但此处并非“政治”的意思,这个词在英语里使用得  

很普遍,应该理解为“有关公众的意愿”]。它们应该包括进来。我们新的STL实现包括它
  
们。大体上说,我们需要发展一个往STL里添东西的机制。毕竟,STL是个可扩展的框架,
  
它也被请求扩展。有很  
多数据结构都还没加进来,比如,单向链接表、矩阵和图。SGI乐意在扩展STL方面起引导
  
作用。  

问:  

你还在研究STL吗?研究什么?  

答:  

我在SGI的团队—Matt Austern, Hans  
Boehm和我自己刚刚完成一个STL的新版本。它包括散列容器、线程安全内存分配和引人入
  
胜的WEB文档。SGI把它发布在http://www.sgi.com/Technology/STL,我们希望STL能够不

  
断成长。多维数据结构、持久化、多线程都是我们计划要加入的东西。唔,我不清楚我们
  
还能搞这个东西多长时  
间。我的管理者们对STL/泛型编程活动没提供任何支持。向他们解释为什么SGI有责任扩  

展STL非常困难。(同样困难的是向惠普的管理层解释。在STL被标准所接纳后,他们取消
  
了我5个月的项目)。  

问:  

好像STL还有不足之处。首先HP  
STL不是线程安全的。而且模板导致了要把大量的代码放到头文件中。你无法拥有真正的  

模板库,不管是DLL形式还是共享库(未初始化的)形式的模板:STL通常是编译时库。最
  
后一点是几乎没有任何CASE工具和OOD方法学有效地支持泛型编程。比如,没有CASE工具  

能让你定义泛型函数。也  
只有Booch符号能某种程度上表示模板,但它产生的图表并不直观(至少对我来说)。  

答:  

SGI STL是线程安全的。“独立编译”已经被标准采纳—我的SGI同事John Wilkinson、  

Jim Dehnert 和Matt  
Austern设计的,它解决了你的第二个问题。它已经经投票纳入标准,但还需要一段时间  

才能有支持“独立编译”的编译器。我坚信“独立编译”最终需要发行共享模板库。这也
  
是我在SGI发起独立编译工作的主要原因。设计处理泛型编程的工具并不困难。我敢肯定  

只要市场需要,Grady  
Booch会改进他的符号来处理泛型编程的。  

问:  

让C++程序员感到痛苦的一件事是那些标准委员会们好像彼此都无动于衷。OMG刚刚定义了
  
一套分布式编程(CORBA)标准,但是STL里并没有对应于CORBA的映射。他们各自定义了  

自己的一套类,比如Sequence<T> 和  
CORBA::String。同样的问题也出现在ODMG和ODMG-93对象数据库标准上。怎么会发生这种
  
事?这种状况能得到改变吗?  

答:  

我老得都记不得所有70年代提出的网络标准了。谁现在还能记得它们。  

问:  

泛型编程在分布式环境里是什么样子?泛型编程是基于这样的思想的—编译器在编译时知
  
道所有可能的类型。这在分布式环境里是不现实的。我们是不是应该考虑在编译器上集成
  
某种ORB?或者泛型编程压根就不适合分布式编程?在这个意义上,是不是Java更合适?  

答:  

泛型编程和“运行时”、“编译时”之类的东西没有任何关系。问题是我发现OOP不单是  

慢,它还不允许我表达可能是最简单的算法。再提一遍,max的记号为:  

max: T x T -> T  

Java无法表达,因为从某个类或接口T继承导致它变为:  

max: T' x T -> T  

你需要协变记号转换并且要能够从类型取得类型信息,如果你喜欢,虚类型的概念—  
v-table包含了类型描述符。  

问:  

什么是迭代器?  

答:  

迭代器是两个理论的联合物。第一个理论是命名理论(例如handle、cookie、address等  

)。一个命名对象实际上是指向另外一个对象[译注:请允许我在这儿使用“对象”一词  

,但此“对象”并非一定是OO里的“对象”]。(可以这么理解—operator*)。我们称之
  
为Trivial Iterator  
理论。再加上解引用[译注:dereferencing,此处没有使用侯捷老师的“解参考”译法]  

,它同样被定义以满足以下公理:  

i == j iff &*i == &*j  

也就是说,两个迭代器是完全相等的当且仅当它们指向同一个对象时。(“相等”当然要
  
满足所有标准公理)。第二个理论是关于前置和后置的自增及自减运算的[译注:原文此  

处有些费解,这只是我的理解]。当然,指针只是一个随机存取迭代器模型。  

问:  

有些人争论说指针会以任何能够想到的可怕的方式和不可思议的方式破坏内存。Java和  

Delphi 就没这个问题,因为它们不接受指针。[译注:原文是:Java and Delphi made  

it right when they disallowed  
pointers.这儿的when显然不是“当...时候”的意思,而应该译为“既然,因此”之意,
  
但这并不符合事实,我怀疑此处说法有误。]。  

答:  

不接受指针还能让你做指针算术是件好事。在C和C++中,指针算术应该只被允许在它真正
  
被允许的地方,也就是说,数组里的指针。但是泛泛地不接受指针是愚蠢的做法。你不能
  
做泛型交换除非你的语言里有指针或引用。  

问:  

“category”[译注:范畴]是一个被C++社团滥用的词。你怎么称呼迭代器范畴?  

答:  

我常常称之为概念[concepts].  

问:  

我试图开发一个STL风格的单向链接表。但是我并没有选择去实现size()成员函数,因为  

我不想仅仅为了常数时间实现size()而保存一个计数的负担,就象C++ CD所声称的那样。
  
这个决定正确吗?  

答:  

STL列表的size()曾是线性时间方式实现的,那一个正确的决定,如果用户想保持一个计  

数的话也容易做到,但通常来说,你不需要那么做,并且它造成了衔接的线性时间。但是
  
标准委员会坚持让我改成常数时间。我别无选择。我们最终将不得不改变这个需求。  

问:  

我正在研究怎样在STL里描述一个树,我碰到了一些问题:每一个节点都有一个父亲和两  

个儿子。移动到父亲可以描述为operator--,但我需要两个不同的operator++以移动到它
  
的儿子们。迭代器怎样来处理非线性结构,比如树或图?  

答:  

即使在序列上你也有不同的迭代器。反向迭代器就是一个例子。步幅迭代器[Stride  
iterators]是非常重要的,最终将被加入到STL.  

问:  

我必须得承认我的无知。什么是步幅迭代器?  

答:  

从i到i+5再到i+10。  

问:  

和随机迭代器的不同点?  

答:  

步幅迭代器是一个迭代器适配器,它带有一个随机存取迭代器范围并且提供一个随机存取
  
迭代器,在其上++就可以通过一个步幅。  

问:  

这和树的遍历有什么关系?  

答:  

我并没有说步幅迭代器或反向迭代器和树的遍历有什么关系,但是,对于一种数据结构,
  
可能有多种迭代器类型以满足不同迭代顺序—例如树的前序、中序和后序遍历。  

问:  

我常常会碰到一个很困难的决定:我应该把一个函数设计成成员函数还是泛型(全局)函
  
数?在STL中做出这个决定的基本原理是什么?  

答:  

只要有可能就把它设计成全局的。如果从头到尾都是全局的话会更好—它允许我们用C数  

组设计它们。如果用缺省定义全局的operator*那该多好:  

template <class T>  

T& operator*(T& x) { return x;}  

template <class T>  

const T& operator*(const T& x) { return x;}  

它将允许我们这么写:  

copy(0, 25, ostream_iterator<int>("\n"));  

通常,对于非迭代器对象来说,operator*应该返回对象自己,未命名的东西是指那个东  

西自己。我甚至想把构造器和析构器都写成全局函数。如果语言允许这么做的话,你会可
  
以做一些令人惊奇的事情。  

问:  

如果我按你的方式定义一个泛型的operator*,并且在我的程序里我这么定义:  

template <class T> class SmartPtr {  

  T* ptr;  

public:  

  SmartPtr(T* _ptr = 0) : ptr(_ptr){}  

  T* operator*() const {return ptr;}  

  // ...  

};  

那么,下面的代码里会不会导致模棱两可:  

int i=0;  

SmartPtr<int> sp(&i);  

int j= *i; // 使用 SmartPtr<int>:perator* 还是operator<SmartPtr<int>,用户都
  
定义了?  

答:  

不,不会的。你的定义比全局的匹配得更好(深层次的一致)。那就是局部特化所讲的。
  

问:  

现在,我有一些好奇:为什么STL没有排序容器之类的适配器。  

答:  

set就是一个排序容器。  

问:  

set并不是适配器。为什么能去写一个堆,但没有写一个独立于任何容器并支持随机存取  

迭代器的排序容器。  

答:  

记住,因为STL的尺寸问题导致它很难通过标准委员会的审核。我已经扔掉了好多有用的  

东西了。(想想散列表身上都发生了些什么吧)  

问:  

为什么<heap.h>里的__adjust_heap函数没有被归档?在Dijkstra算法里,这个函数对使  

用堆来说是必需的。  

答:  

我费了很大的劲才把堆函数弄到标准里。本来我想让STL中所有的辅助函数都暴露出来的  

,但没有政治[译注:对该词真正含义,上文已有描述]上的可能。  

问:  

对我来说,很难想像关于堆函数的政治因素。  

答:  

倒不是函数有什么特别,而是因为它们的数量。Bjarne个人负责减少STL里组件的数目有  

个一分为二的原因。他试图使其尽可能的小以安慰反对者。  

问:  

你到过意大利吗,商务还是休闲?  

答:  

我在比萨逗留了十天,参观了佛罗伦萨和鲁卡。我梦想去安西斯,在内心我是一个方济各
  
会[译注:天主教的一个分支]信徒。在Tosca的第二幕和La  
Traviata的第三幕里我哭了。我把但丁(意大利人!)摆在床头。我喜欢意大利面食、熏
  
火腿和基蒂安葡萄酒,我是传统主义者,我看起来更象John XXIII而不是 Pius XII.  

问:  

你的意大利语肯定很好—如果你能读但丁的原版作品:很少有意大利人能懂。  

答:  

唔,我的意大利语很差的。我能读懂但丁的作品是因为我有英译本。我用意大利语高声朗
  
诵然后再读英译本[J]。  

Graziano:  

非常感谢,Alex,我希望你能够早日来意大利并去安西斯看看,在安西斯的古镇阅读但丁
  
,它可能是意大利最迷人的中世纪小镇。
发表于 2005-7-1 11:04:16 | 显示全部楼层 来自 黑龙江哈尔滨

Re:STL之父A.Stepanov专访(加点人气,版主手下留情:))

Simdroid开发平台
STL是模版吧?干什么用的?
发表于 2005-7-1 18:17:18 | 显示全部楼层 来自 日本

Re:STL之父A.Stepanov专访(加点人气,版主手下留情:))

读了Alexandreson的Modern C++ Design才了解泛型编程是个如此有趣的东西。但还没理解到它的哲学是如此深奥。
对译者的翻译水平表示钦佩。
 楼主| 发表于 2005-7-2 10:36:01 | 显示全部楼层 来自 黑龙江哈尔滨

Re:STL之父A.Stepanov专访(加点人气,版主手下留情:))

苍山负雪 wrote:
STL是模版吧?干什么用的?

Standard Template Library标准模板库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-1 23:34 , Processed in 0.038020 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表