Jun'uary
Jan'uary » 日志 » The Most Important C++ Software...Ever
The Most Important C++ Software...Ever
Jan 发表于 2006-08-24 11:40:27
Scott Meyers同志最近在artima上抛出一个系列,叫做Five Lists of Five,用了五个列表来举出C++发展史上最重要的一些,呃,东西,或者事件,每个列表也是五个item。现在写到第三个list, The Most Important C++ Software。其它两个list没有引起我的兴趣,这第三个觉得挺有意思的。
排在第一的是Bell实验室的CFront,传说中的超级有名的编译器,也是第一个C++编译器,它的广为人知的有趣功能是能够把C++编译成C代码(或者说预处理)。但也是由于这个原因,那时候没有C++ debuger,所以大家只能用C的debuger对生成的C代码进行调试。在这种艰苦卓绝的培养方式之下黄金时代的强人们练出了一项绝活:看到编译出来的怪异代码就能联想出对应的C++代码,比如说,看到_pl__lAff这种东西,就想到这里是一段使用了+运算符的C++代码。
在那个时候采取编译成C代码这样一种策略有两个好处,首先是容易移植。由于C编译器到处都是,每个平台都有,所以如果能把C++变成C的话,C++也就到处都能运行了。其次它使得人们能够深入C++,看看具体生成什么代码(大家都懂C),来明白C++的各种机制。从这两方面来说,CFront对于C++的成功起到了非常关键的作用。
直到1990年之前,CFront还不仅仅是个编译器,它还是C++语言规范的事实标准。只要是CFront认为对的,那就是对的。在那个时期编译器厂商提供的编译器的行为是如此的接近CFront,以至于CFront的bug都被原样复制出来。当Annotated C++ Reference Manual(ARM)出版之后,尤其是人们发现要为CFront加入异常处理机制需要花费巨大代价之后,CFront的这种影响才开始消退。
CFront的最后一个版本在1993年发布,但是阴魂不散... Edison Design Group,一个专业的商业C++编译器生产厂商在2006年7月的文档中还指出他们的编译器有一个CFront兼容模式。或许,只是或许,在一些没有native C++ compiler的嵌入式环境中,CFront还在发挥它的作用。
排在第二位的是GCC。一个令我惊讶的事实是,GNU C++ Compiler(g++)是史上第一个生成本地代码的C++编译器。在1987年,GNU就看到了C++的潜力,推出了g++,随着时间流逝,g++编译器已经成为交叉编译的不而选择,这是因为GCC本身是一个编译器平台,支持许多前端,以及多种目标语言/平台。在一开始Michael Tiemann是推动g++发展的中间力量,他后来在1989年协助创立了Cygnus,地球上第一家通过开源软件赚钱的公司,大名鼎鼎的cygwin就是来自那里。
随后,令人惊讶的,Visual C++排在第三名的位置,让我们来看看Scott的理由。如果让地球上所有C++程序员说出日常使用的编译器,相信有大部分人会提到同一个词: VC++。这个在1992年第一次推出的东西一直和Windows操作系统,Office办公套件一样,是微软的旗帜产品,而且后两样产品主要是基于C++开发并且用VC++编译的,这三样产品对地球人的重要程度不言而喻(你可以抨击它,但必须承认这个事实),这直接将C++的重要性推到一个新的高度。同时由于微软对C++的依赖,使得他们投入大力气去开发相关的开发工具,为自己的产品提供基于C++的API,这也使的C++成为大量Windows程序员的必然选择。所以我觉得,排在第三位的,更准确的说,是Visual C++ & Microsoft,如果说不是微软而是Borland写出了VC++,我想VC++也不会有今天这样的地位(当然Borland也会垮的更快)。这样一个事实也让人替Borland感到悲哀。
但是VC++也有一个成名的缺陷,那就是和标准的不兼容。在1997年之前这还不是个问题,因为那时候并没有标准可依。在1998年也就是C++标准完成一年之后, VC6横空出世,这是一个让人赞叹的产品(微软凭借它把一直骑在它头上的Borland C++ Compiler踢飞)。这样一个重要而且广泛应用的编译器,在获得人们喜爱的同时,也给人们深深的烙上一个印象,那就是VC++和标准南辕北辙,尤其是其STL实现。在VC6诞生到VC++7.1推出之前的六年间,开发者们不得不人肉处理许多令人发疯的问题,诸如partial template specialization,相信从那个时代过来的人一定对VC6的令人疯狂作用深有体会。这种情况在VC7推出后稍有改善,直到2003年VC7.1问世,微软才解决了大部分的兼容性问题。
之后就是Standard Template Library, STL了。这个1993年源自HP的类库绝对是C++的一项巨大财富,凝聚无数大牛的心血,设计和代码的典范。STL提供了一系列的常用容器和算法,以及一个优雅设计的框架,基于这个框架你可以把自己设计的容器和算法与STL完美融合,而这个融合的纽带就是iterator。STL把数组和指针时代的人们带进了容器和枚举的时代,这是一项无与伦比的进步。如果仅仅是这样那Java也还勉强有得一拼,但是STL不仅停留于此,STL还具有难以置信的效率,Java的实现根本就难以望其项背。它避开了经典面向对象变成的继承体系,几乎完全依赖模板打造出这样一个杰作,是STL把范型编程引入了C++,使得范型成为和继承并驾齐驱的面向对象模式。STL是类库设计上震撼人心的里程碑,彻底改变了人们对设计类库以及类库框架的思考。Scott本人在Effective STL里面曾说过: "In the nearly 30 years I've been programming, I've never seen anything like the STL.",而今天,他说: "It's now over 30 years, and I still haven't"。
最后出场的是Boost类库,同样是一个类库,1999年诞生。Boost类库是由Boost组织提供的一组类库集合的统称,它们有许多不同的人基于不同的出发点各自实现,所以这个类库提供的功能看起来散漫无常。但是Boost类库已经成为了STL的一个重要补充,这两个类库一起丰富以及完善了C++的功能,免去了程序员大量繁琐的工作,提供高效优美以及精彩的实现。在C++新标准的14项功能提议中,有10项是基于人们使用Boost的经验,没有其它类库能如此明显的影响C++标准制定的进程,事实上当初Boost建立的本意就是成为添加到C++新标准的候选新功能的测试和宣传平台,人们没有料想到这个平台却衍生出在业界巨大的影响力(如果你Google C++ libraries,boost是排名第一的条目)。
排在第一的是Bell实验室的CFront,传说中的超级有名的编译器,也是第一个C++编译器,它的广为人知的有趣功能是能够把C++编译成C代码(或者说预处理)。但也是由于这个原因,那时候没有C++ debuger,所以大家只能用C的debuger对生成的C代码进行调试。在这种艰苦卓绝的培养方式之下黄金时代的强人们练出了一项绝活:看到编译出来的怪异代码就能联想出对应的C++代码,比如说,看到_pl__lAff这种东西,就想到这里是一段使用了+运算符的C++代码。
在那个时候采取编译成C代码这样一种策略有两个好处,首先是容易移植。由于C编译器到处都是,每个平台都有,所以如果能把C++变成C的话,C++也就到处都能运行了。其次它使得人们能够深入C++,看看具体生成什么代码(大家都懂C),来明白C++的各种机制。从这两方面来说,CFront对于C++的成功起到了非常关键的作用。
直到1990年之前,CFront还不仅仅是个编译器,它还是C++语言规范的事实标准。只要是CFront认为对的,那就是对的。在那个时期编译器厂商提供的编译器的行为是如此的接近CFront,以至于CFront的bug都被原样复制出来。当Annotated C++ Reference Manual(ARM)出版之后,尤其是人们发现要为CFront加入异常处理机制需要花费巨大代价之后,CFront的这种影响才开始消退。
CFront的最后一个版本在1993年发布,但是阴魂不散... Edison Design Group,一个专业的商业C++编译器生产厂商在2006年7月的文档中还指出他们的编译器有一个CFront兼容模式。或许,只是或许,在一些没有native C++ compiler的嵌入式环境中,CFront还在发挥它的作用。
排在第二位的是GCC。一个令我惊讶的事实是,GNU C++ Compiler(g++)是史上第一个生成本地代码的C++编译器。在1987年,GNU就看到了C++的潜力,推出了g++,随着时间流逝,g++编译器已经成为交叉编译的不而选择,这是因为GCC本身是一个编译器平台,支持许多前端,以及多种目标语言/平台。在一开始Michael Tiemann是推动g++发展的中间力量,他后来在1989年协助创立了Cygnus,地球上第一家通过开源软件赚钱的公司,大名鼎鼎的cygwin就是来自那里。
随后,令人惊讶的,Visual C++排在第三名的位置,让我们来看看Scott的理由。如果让地球上所有C++程序员说出日常使用的编译器,相信有大部分人会提到同一个词: VC++。这个在1992年第一次推出的东西一直和Windows操作系统,Office办公套件一样,是微软的旗帜产品,而且后两样产品主要是基于C++开发并且用VC++编译的,这三样产品对地球人的重要程度不言而喻(你可以抨击它,但必须承认这个事实),这直接将C++的重要性推到一个新的高度。同时由于微软对C++的依赖,使得他们投入大力气去开发相关的开发工具,为自己的产品提供基于C++的API,这也使的C++成为大量Windows程序员的必然选择。所以我觉得,排在第三位的,更准确的说,是Visual C++ & Microsoft,如果说不是微软而是Borland写出了VC++,我想VC++也不会有今天这样的地位(当然Borland也会垮的更快)。这样一个事实也让人替Borland感到悲哀。
但是VC++也有一个成名的缺陷,那就是和标准的不兼容。在1997年之前这还不是个问题,因为那时候并没有标准可依。在1998年也就是C++标准完成一年之后, VC6横空出世,这是一个让人赞叹的产品(微软凭借它把一直骑在它头上的Borland C++ Compiler踢飞)。这样一个重要而且广泛应用的编译器,在获得人们喜爱的同时,也给人们深深的烙上一个印象,那就是VC++和标准南辕北辙,尤其是其STL实现。在VC6诞生到VC++7.1推出之前的六年间,开发者们不得不人肉处理许多令人发疯的问题,诸如partial template specialization,相信从那个时代过来的人一定对VC6的令人疯狂作用深有体会。这种情况在VC7推出后稍有改善,直到2003年VC7.1问世,微软才解决了大部分的兼容性问题。
之后就是Standard Template Library, STL了。这个1993年源自HP的类库绝对是C++的一项巨大财富,凝聚无数大牛的心血,设计和代码的典范。STL提供了一系列的常用容器和算法,以及一个优雅设计的框架,基于这个框架你可以把自己设计的容器和算法与STL完美融合,而这个融合的纽带就是iterator。STL把数组和指针时代的人们带进了容器和枚举的时代,这是一项无与伦比的进步。如果仅仅是这样那Java也还勉强有得一拼,但是STL不仅停留于此,STL还具有难以置信的效率,Java的实现根本就难以望其项背。它避开了经典面向对象变成的继承体系,几乎完全依赖模板打造出这样一个杰作,是STL把范型编程引入了C++,使得范型成为和继承并驾齐驱的面向对象模式。STL是类库设计上震撼人心的里程碑,彻底改变了人们对设计类库以及类库框架的思考。Scott本人在Effective STL里面曾说过: "In the nearly 30 years I've been programming, I've never seen anything like the STL.",而今天,他说: "It's now over 30 years, and I still haven't"。
最后出场的是Boost类库,同样是一个类库,1999年诞生。Boost类库是由Boost组织提供的一组类库集合的统称,它们有许多不同的人基于不同的出发点各自实现,所以这个类库提供的功能看起来散漫无常。但是Boost类库已经成为了STL的一个重要补充,这两个类库一起丰富以及完善了C++的功能,免去了程序员大量繁琐的工作,提供高效优美以及精彩的实现。在C++新标准的14项功能提议中,有10项是基于人们使用Boost的经验,没有其它类库能如此明显的影响C++标准制定的进程,事实上当初Boost建立的本意就是成为添加到C++新标准的候选新功能的测试和宣传平台,人们没有料想到这个平台却衍生出在业界巨大的影响力(如果你Google C++ libraries,boost是排名第一的条目)。
曾经的这一天...
- » 2005年: Windows Vista SDK Released
- » 2005年: Xen passes Windows milestone
- » 2005年: C Better With CDT 3.0
- » 2005年: 转载
- » 2005年: Google基本上已经疯了
相关日志:
收藏:
QQ书签
del.icio.us
订阅:
Google
抓虾
最新评论
-
2006-08-26 13:52:19 http://andyzn.blogcn.net
俺只用过Vector,感觉速度很慢很慢。
-
2006-08-26 23:19:48
Java那才叫一个慢啊,用过一个类的buffer实现,居然不会自动增加大小的,数据一多就抛exception,比stl容器的buffer分配策略差太远了,吐血, stl还有allocator让你用
