⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csdn_文档中心_stl之父访谈录(一万二千字的大块头).htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 5 页
字号:
            是设计allocator时,Bjarne认为这个封装了内存模式的组件可以用来封装持久性内存模式。Bjarne的<BR>&nbsp;&nbsp; 
            洞察秋毫非常的重要和有趣,好几个对象数据库公司正在盯着这项技术。1994年10月我参加了Object<BR>&nbsp;&nbsp; 
            Database Management 
            Group的一个会议,我做了一个关于演说。他们非常感兴趣,想让他们正在形成<BR>&nbsp;&nbsp; 
            中的组件库的接口与STL一致,但不包括allocator在内。不过该集团的某些成员仔细分析了allocator<BR>&nbsp;&nbsp; 
            是否能够被用来实现持久化。我希望与STL接口一致的组件对象持久化方案能在接下来的一年里出现。</P>
            <P>Q:set,multiset,map和multimap是用红黑树实现的,您试过用其他的结构,比如B*树来实现吗?<BR>A:我不认为B*适用于内存中的数据结构,不过当然这件事还是应该去做的。应该对许多其他的数据结构,<BR>&nbsp;&nbsp; 
            比如跳表(skip list)、伸展树(splay tree)、半平衡树(half-balanced 
            tree)等,也实现STL容器的标<BR>&nbsp;&nbsp; 
            准接口。应该做这样的研究工作,因为STL提供了一个很好的框架,可以用来比较这些结构的性能。结口<BR>&nbsp;&nbsp; 
            是固定的,基本的复杂度是固定的,现在我们就可一个对各种数据结构进行很有意义的比较了。在数据<BR>&nbsp;&nbsp; 
            结构领域里有很多人用各种各样的接口来实现不同的数据结构,我希望他们能用STL框架来把这些数据<BR>&nbsp;&nbsp; 
            结构变成通用的。<BR>&nbsp;&nbsp; 
            (译者注:上面所提到的各种数据结构我以为大多并非急需,而一个STL没有提供而又是真正重要的数据<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            结构是哈希结构。后来在Stepanov和Matt 
            Austern等人的SGI*STL中增补了hashset,hashmap和<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            hashtable三种容器,使得这个STL实现才比较完满。众所周知,红黑树的时间复杂度为O(logN), 
            而理<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            想hash结构为O(1)。当然,如果实现了持久化,B+树也是必须的。)</P>
            <P>Q:有没有编译器厂商跟您一起工作来把STL集成到他们的产品中去?<BR>A:是的,我接到了很多厂家的电话。Borland公司的Peter 
            Becker出的力特别大。他帮助我实现了对应<BR>&nbsp;&nbsp; 
            Borland编译器的所有内存模式的allocator组件。Symantec打算为他们的Macintosh编译器提供一个STL<BR>&nbsp;&nbsp; 
            实现。Edison设计集团也很有帮助。我们从大多数编译器厂商都得到了帮助。<BR>&nbsp;&nbsp; 
            (译者注:以目前的STL版本来看,最出色的无疑是SGI*STL和IBM STL for 
            AS/390,所有Windows下的<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            的STL实现都不令人满意。根据测试数据,Windows下最好的STL运行在PIII 
            500MHz上的速度远远<BR>&nbsp;&nbsp;&nbsp;&nbsp; 落后与在250MHz 
            SGI工作站(IRIX操作系统)上运行的SGI*STL。以我个人经验,Linux也是运行STL<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            的极佳平台。而在Windows的STL实现中,又以Borland C++Builder的Rogue Wave 
            STL为最差,其效率<BR>&nbsp;&nbsp;&nbsp;&nbsp; 甚至低于JIT执行方式下的Java2。Visual 
            C++中的STL是著名大师P. J. Plauger的个人作品,性能较<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            好,但其queue组件效率很差,慎用)</P>
            <P>Q:STL包括了对MS-DOS的16位内存模式编译器的支持,不过当前的重点显然是在32位上线性内存模式<BR>&nbsp;&nbsp; 
            (flat 
            model)的操作系统和编译器上。您觉得这种面向内存模式的方案以后还会有效吗?<BR>A:抛开Intel的体系结构不谈,内存模式是一个对象,封装了有关指针的信息:这个指针的整型尺寸和<BR>&nbsp;&nbsp; 
            距离类型是什么,相关的引用类型是什么,等等。如果我们想利用各种内存,比如持久性内存,共享<BR>&nbsp;&nbsp; 
            内存等等,抽象化的工作就非常重要了。STL的一个很漂亮的特性是整个库中唯一与机器类型相关的<BR>&nbsp;&nbsp; 
            部分——代表真实指针,真实引用的组件——被封装到大约16行代码里,其他的一切,容器、算法等<BR>&nbsp;&nbsp; 
            等,都与机器无关(真是牛啊!)。从移植的观点看,所有及其相关的东西,象是地址记法,指针等<BR>&nbsp;&nbsp; 
            等,都被封装到一个微小的,很好理解的机制里面。这样一来,allocator对于STL而言就不是那么<BR>&nbsp;&nbsp; 
            重要了,至少不像对于基本数据结构和算法的分解那么重要。</P>
            <P><BR>Q:ANSI/ISO 
            C标准委员会认为像内存模式这类问题是平台相关的,没有对此做出什么具体规定。C++委员<BR>&nbsp;&nbsp; 
            会会不会采取不同的态度?为什么?<BR>A:我认为STL在内存模式这一点上跟C++标准相比是超前的。但是在C和C++之间有着显著的不同。C++有构造<BR>&nbsp;&nbsp; 
            函数和new操作符来对付内存模式问题,而且它们是语言的一部分。现在看来似乎让new操作符像STL容器<BR>&nbsp;&nbsp; 
            使用allocater那样来工作是很有意义的。不过现在对问题的重要性不像STL出现之前那么显著了,因为<BR>&nbsp;&nbsp; 
            在大多数场合,STL数据结构将让new失业。大部分人不再需要分配一个数组,因为STL在做这类事情上<BR>&nbsp;&nbsp; 
            更为高效。要知道我对效率的迷信是无以复加的,可我在我的代码里从不使用new,汇编代码表明其效率<BR>&nbsp;&nbsp; 
            比使用new时更高。随着STL的广泛使用,new会逐渐淡出江湖。而且STL永远都会记住回收内存,因为当<BR>&nbsp;&nbsp; 
            一个容器,比如vector退出作用域时,它的析构函数被调用,会把容器里的所有东西都析构。你也不必<BR>&nbsp;&nbsp; 
            再担心内存泄漏了。STL可以戏剧性地降低对于垃圾收集机制的需求。使用STL容器,你可以为所欲为,<BR>&nbsp;&nbsp; 
            不用关心内存的管理,自有STL构造函数和析构函数来对付。</P>
            <P><BR>Q:C++标准库子委员会正在制订标准名空间(namespace)和异常处理机制。STL类会有名空间吗,会抛出异<BR>&nbsp;&nbsp; 
            常吗?<BR>A:是的。该委员会的几个成员正在考虑这件事,他们的工作非常卓越。</P>
            <P>Q:现在的STL跟最终作为标准的STL会有多大不同?委员会会不会干预某些变化,新的设计会不会被严格地控<BR>&nbsp;&nbsp; 
            制起来?<BR>A:多数人的意见看起来是不希望对STL做任何重要的改变。</P>
            <P>Q:在成为标准之前,程序员们怎样的一些STL经验?<BR>A:他们可以从butler.hpl.hp.com/stl当下STL头文件,在Borland和IBM或其他足够强劲的的编译器中使用它。<BR>&nbsp;&nbsp; 
            学习这种编程技术的唯一途径是编程,看看范例,试着用这种技术来编程。</P>
            <P>Q:您正在和P. J. 
            Plauger合作一本STL的书。那本书的重点是什么?什么时候面世?<BR>A:计划95年夏天面世,重点是对STL实现技术的详解,跟他那本标准C库实现和标准C++库实现的书类似。他是<BR>&nbsp;&nbsp; 
            这本书的第一作者。该书可以作为STL的参考手册。我希望跟Bjarne合作另写一本书,在C++/STL背景下介绍<BR>&nbsp;&nbsp; 
            语言与库的交互作用。</P>
            <P>&nbsp;&nbsp; 
            好多工作都等着要做。为了STL的成功,人们需要对这种编程技术进行更多的试验性研究,更多的文章和书籍<BR>&nbsp;&nbsp; 
            应该对此提供帮助。要准备开设此类课程,写一些入门指南,开发一些工具帮助人们漫游STL库。STL是一个<BR>&nbsp;&nbsp; 
            框架,应该有好的工具来帮助使用这个框架。<BR>&nbsp;&nbsp; 
            (译者注:他说这番话时,并没有预计到在接下来的几年里会发生什么。由于Internet的大爆炸和Java、<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            VB、Delphi等语言的巨大成功,工业界的重心一下子从经典的软件工程领域转移到Internet上。再加上<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            标准C++直到98年才制订,完全符合要求的编译器直到现在都还没有出现,STL并没有立刻成为人们心中的<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            关注焦点。他提到的那本书也迟迟不能问世,直到前几天(2001年元旦之后),这本众人久已期盼的书<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            终于问世,由P. J. Plauger, Alexander Stepanov, Meng Lee, David 
            Musser四大高手联手奉献,<BR>&nbsp;&nbsp;&nbsp;&nbsp; Prentice 
            Hall出版。不过该书主要关注的是STL的实现技术,不适用于普通程序员。</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp; 另外就P. J. 
            Plauger做一个简介:其人是标准C中stdio库的早期实现者之一,91年的一本关于标准<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            C库的书使他名满天下。他现在是C/C++ Use's 
            Journal的主编,与Microsoft保持着良好的,甚至是<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            过分亲密的关系,Visual 
            C++中的STL和其他的一些内容就是出自他的那只生花妙笔。不过由于跟MS<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            的关系已经影响到了他的中立形象,现在有不少人对他有意见。</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp; 
            至于Stepanov想象中的那本与Stroustrup的书,起码目前是没听说。其实这两位都是典型的编程圣手,<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            跟Ken Thompson和Dennis 
            Ritchie是一路的,懒得亲自写书,往往做个第二作者。如果作为第一作者,<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            写出来的书肯定是学院味十足,跟标准文件似的,不适合一般程序员阅读。在计算机科学领域,编程<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            圣手同时又是写作高手的人是凤毛麟角,最著名的可能是外星人D. E. Knuth, 
            C++领域里则首推前面<BR>&nbsp;&nbsp;&nbsp;&nbsp; 提到的Andrew 
            Koenig。可惜我们中国程序员无缘看到他的书。)</P>
            <P>Q:通用编程跟OOP之间有什么关系?<BR>A:一句话,通用编程是OOP基本思想的自然延续。什么是OOP的基本思想呢?把组件的实现和接口分开,并<BR>&nbsp;&nbsp; 
            且让组件具有多态性。不过,两者还是有根本的不同。OOP强调在程序构造中语言要素的语法。你必须<BR>&nbsp;&nbsp; 
            得继承,使用类,使用对象,对象传递消息。GP不关心你继承或是不继承,它的开端是分析产品的分类,<BR>&nbsp;&nbsp; 
            有些什么种类,他们的行为如何。就是说,两件东西相等意味着什么?怎样正确地定义相等操作?不单<BR>&nbsp;&nbsp; 
            单是相等操作那么简单,你往深处分析就会发现“相等”这个一般观念意味着两个对象部分,或者至少<BR>&nbsp;&nbsp; 
            基本部分是相等的,据此我们就可以有一个通用的相等操作。再说对象的种类。假设存在一个顺序序列<BR>&nbsp;&nbsp; 
            和一组对于顺序序列的操作。那么这些操作的语义是什么?从复杂度权衡的角度看,我们应该向用户提<BR>&nbsp;&nbsp; 
            供什么样的顺序序列?该种序列上存在那些操作?那种排序是我们需要的?只有对这些组件的概念型分<BR>&nbsp;&nbsp; 
            类搞清楚了,我们才能提到实现的问题:使用模板、继承还是宏?使用什么语言和技术?GP的基本观点<BR>&nbsp;&nbsp; 
            是把抽象的软件组件和它们的行为用标准的分类学分类,出发点就是要建造真实的、高效的和不取决于<BR>&nbsp;&nbsp; 
            语言的算法和数据结构。当然最终的载体还是语言,没有语言没法编程。STL使用C++,你也可以用Ada<BR>&nbsp;&nbsp; 
            来实现,用其他的语言来实现也行,结果会有所不同,但基本的东西是一样的。到处都要用到二分查找<BR>&nbsp;&nbsp; 
            和排序,而这就是人们正在做的。对于容器的语义,不同的语言会带来轻微的不同。但是基本的区别很<BR>&nbsp;&nbsp; 
            清楚是GP所依存的语义,以及语义分解。例如,我们决定需要一个组件swap,然后指出这个组件在不同的<BR>&nbsp;&nbsp; 
            语言中如果工作。显然重点是语义以及语义分类。而OOP所强调的(我认为是过分强调的)是清楚的定义<BR>&nbsp;&nbsp; 
            类之间的层次关系。OOP告诉了你如何建立层次关系,却没有告诉你这些关系的实质。<BR>&nbsp;&nbsp; 
            (这段不太好理解,有一些术语可能要过一段时间才会有合适的中文翻译——译者)</P>
            <P>Q:您对STL和GP的未来怎么看?<BR>A:我刚才提到过,程序员们的梦想是拥有一个标准的组件仓库,其中的组件都具有良好的、易于理解的和标<BR>&nbsp;&nbsp; 
            准的接口。为了达成这一点,GP需要有一门专门的科学来作为基础和支柱。STL在某种程度上开始了这项<BR>&nbsp;&nbsp; 
            工作,它对于某些基本的组件进行了语义上的分类。我们要在这上面下更多的功夫,目标是要将软件工程<BR>&nbsp;&nbsp; 
            从一种手工艺技术转化为工程学科。这需要一门对于基本概念的分类学,以及一些关于这些基本概念的定<BR>&nbsp;&nbsp; 
            理,这些定理必须是容易理解和掌握的,每一个程序员即使不能很清楚的知道这些定理,也能正确地使用<BR>&nbsp;&nbsp; 
            它。很多人根本不知道交换律,但只要上过学的人都知道2+5等于5+2。我希望所有的程序员都能学习一些<BR>&nbsp;&nbsp; 
            基本的语义属性和基本操作:赋值意味着什么?相等意味着什么?怎样建立数据结构,等等。</P>
            <P>&nbsp;&nbsp; 
            当前,C++是GP的最佳载体。我试过其他的语言,最后还是C++最理想地达成了抽象和高效的统一。但是<BR>&nbsp;&nbsp; 
            我觉得可能设计出一种语言,基于C和很多C++的卓越思想,而又更适合于GP。它没有C++的一些缺陷,特别<BR>&nbsp;&nbsp; 
            是不会像C++一样庞大。STL处理的东西是概念,什么是迭代子,不是类,不是类型,是概念。说得更正式<BR>&nbsp;&nbsp; 
            一些,这是Bourbaki所说的结构类型(structure 
            type),是逻辑学家所说的理念(theory),或是类型<BR>&nbsp;&nbsp; 
            理论学派的人所说的种类(sort),这种东西在C++里没有语言层面上的对应物(原文是incarnation,直译<BR>&nbsp;&nbsp; 
            为肉身——译者),但是可以有。你可以拥有一种语言,使用它你可以探讨概念,精化概念,最终用一种<BR>&nbsp;&nbsp; 
            非常“程序化”(programmatic,直译为节目的,在这里是指符合程序员习惯的——译者)的手段把它们<BR>&nbsp;&nbsp; 
            转化为类。当然确实有一些语言能处理种类(sorts),但是当你想排序(sort)时它们没什么用处。我们<BR>&nbsp;&nbsp; 
            能够有一种语言,用它我们能定义叫做foward 
            iterator(前向迭代子)的东西,在STL里这是个概念,没有<BR>&nbsp;&nbsp; 
            C++对应物。然后我们可以从forword iterator中发展出bidirectional 
            iterator(双向迭代子),再发展<BR>&nbsp;&nbsp; 出random 
            iterator。可能设计一种语言大为简化GP,我完全相信该语言足够高效,其机器模型与C/C++充分<BR>&nbsp;&nbsp; 
            接近。我完全相信能够设计出一种语言,一方面尽可能地靠近机器层面以达成绝对的高效,另一方面能够处<BR>&nbsp;&nbsp; 
            理非常抽象化的实体。我认为该语言的抽象性能够超过C++,同时又与底层的机器之间契合得天衣无缝。我认<BR>&nbsp;&nbsp; 
            为GP会影响到语言的研究方向,我们会有适于GP的实用语言。从这些话中你应该能猜出我下一步的计划。</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            mengyan<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            译于2001年1月</P>
            <P><BR>&nbsp;</P><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0 
width=770>
  <TBODY>
  <TR bgColor=#006699>
    <TD align=middle bgColor=#006699 id=white><FONT 
    color=#ffffff>对该文的评论</FONT></TD>
    <TD align=middle>
      <SCRIPT src="CSDN_文档中心_STL之父访谈录(一万二千字的大块头).files/readnum.htm"></SCRIPT>
    </TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -