VC知识库BLOG-技术,非技术......

时间:2022-12-02 17:09:07

一、初识MFC

  我最初知道MFC大概是在1993年,那个时候Visual C++还没面世,当时Microsoft的C++编译器还很弱,官方的名字是Microsoft C/C++ 7.0,MFC的版本是1.0,几乎没有引起什么反响,那个时期最好的C++开发环境是Borland C++ 3.1,其实,大概是1992年11月份,一个偶然的机会,我领略到Borland公司的厉害,记不得在什么地方,我看到一个绝妙的集成开发环境,即Turbo C++ 3.0 for Windows,这是我记忆中第一个真正的Windows环境下的C++集成开发环境,那种激动的感觉至今仍记忆犹新,不客气的说,当时至少在C++方面,Microsoft与Borland不是一个水平的,Borland明显的要高于Microsoft ,Borland的产品在技术上给我留下深刻的印象。那个时候Microsoft最好的开发平台是Visual Basic 3.0,而Borland的Delphi正处于开发阶段(Delphi 的代码名称是:"VB Killer")……,想起这些十几年前的往事,我不禁感慨万千。

  十几年来,我用过许多开发环境,关于Visual Basic,我用过最早的DOS版本,Windows版的Visual Basic我基本上全都用过,至今我还记得每个版本的VB安装盘磁盘的盘数。同样,我用过各个版本的Delphi,特别是Delphi 2.0,给我留下极好的印象。Delphi提供真正编译的可视化开发环境,那个时候(1994年左右),Delphi就可以开发带有GUI的动态链接库,你可以想象,在Microsoft Access 2.0的应用程序中可以加载一个Delphi Form并进行程序交互,那种感觉真是棒极了。

  Borland C++是我心中无法抹掉的遗憾,从Turbo C到C++ Builder,我深刻的体验到Borland的辉煌和无奈,Delphi从VB Killer走到为VB护航(你可以想象Delphi一步到位的ActiveX 控件开发技术有多牛,早期的VB有多土,早期的VB不能开发动态链接库,因此无法开发ActiveX 控件,想起来真令人嘘唏不已),Borland C++的命运也是不济。Borland C++ 3.1的辉煌永远不再了,十几年的开发工作中,我在C++上投入了大量的精力,Borland C++曾经给我带来无数的激动,然而这个经典的名字却在与Microsoft的竞争中渐渐的流逝了……。

  MFC4.0的出现,使得人们感觉Microsoft在C++方面赶上来了,这一版的MFC是Win95推出后出现在Visual C++ 4中(Microsoft没有VC 3,VC4以前的版本是2.2、2.1、2.0、1.51、1.5、1.0)。也许是对Borland C++的潜意识的失望,我不知不觉的接受了MFC,VC 4.2推出时,我通过正常渠道购买了这个编译器的企业版。

二、关于Microsoft

  关于Microsoft,有无数的人要对这个名字叙说感觉,这个令人讨厌的名字!不知道是喜欢还是憎恶,你是程序员,你的心思可能就要因Microsoft的存在而动,即使你用Linux,你可能也是因为Microsoft技术因素。多少年来,这个名字每天都出现在你、我、他的面前,因为你不得不面对Windows的存在,可是你憎恨这个名字吗?你讨厌这个名字吗?我不知道是否已经对这个名字麻木了。

  1998年我个人订了Microsoft MSDN Universal 版,我开始比较全面接触这个公司的开发技术,你可以想象,1998年当你面对上百张技术光盘的时候,你就知道什么叫做"厚度",当我们有时说出"赶上"或 "达到"Microsoft某些产品的水平的时候,可能我们缺乏对这个公司"厚度"的真实了解。进入MSDN,我感觉Microsoft简直不是一个"公司",而是(或者正在形成)一个"社会"。

  当时著名的技术网站全部的技术资料是可下载的(那个时候提供整个网站内容下载服务,大约3M左右),大名鼎鼎的还不存在。一开始,我始终潜意识在技术上对比Microsoft与Borland,应当说技术上Borland不比Microsoft弱,即使现在也有人持有这个看法,可是为什么Borland走到今天这个地步?而Microsoft却如日中天?若干年前,这两个公司竞争何等激烈,而现在却是另一番"合作"的景象?可能很多人想过,如果Borland不存在,对Microsoft不是更有力吗?其实Microsoft可能精通中国历史,读过《三国》、十分了解战国时期的中国,其实Borland形式上的存在,对Microsoft是十分有利的,至少形式上还有竞争对手,而事实上Borland已经受控于Microsoft(Microsoft是Borland的大股东)。你可以看到一些微妙的现象:Borland为Microsoft提供了大量的人才,其中包括Delphi总设计师以及Borland C++编译器的核心成员;同时也为Microsoft .NET提供强有力的护航服务(看看C# Builder、Delphi .NET)。1998年Microsoft 的COM技术基本已经成熟,这个技术使人感到震撼,当时Microsoft的对手们提出"OpenDoc"用于对抗"COM",你看看"OpenDoc"阵营的几个成员:IBM、Apple、Borland、Novell,你会感到这个阵营十分豪华、强大。但结果却差强人意,"OpenDoc"无疾而终,而"COM"依然生机勃勃。

  有人说"COM"没落了,那么就太不了解Microsoft了。在与"OpenDoc"的竞争中,"COM"是个彻底的胜利者,在与"Java"的竞争中,"COM"成功的进化了,在这个过程中Microsoft体现了强大的吸收能力、以及无法想象的韧劲。.NET只不过是COM的"别名"而已。对于一个经验丰富的C++程序员而言,.NET就是COM的进化,而Microsoft内部.NET就是"COM 3.0"(OLE2就是COM 2.0),而"CLR"就是一个不择不扣的COM对象。曾经有人问我,既然牛顿时代就奠定了基础(想想著名的牛顿-莱布尼茨公式),几百年后的今天,数学还研究"微积分"吗?回答当然是依然在研究!"微积分"早期是针对函数的,现代"微积分"是针对"流形(Manifold)、纤维丛(Fiber Bundle)"的,概念深奥了,可是基本思想不变,只是"微积分"的思想得到合理的延拓与进化,你了解Microsoft吗?Microsoft Research有一批超一流的数学家在为Microsoft工作,其中一些是斐尔兹奖的得主,Microsoft正在实现如同"微积分"进化到"微分流形"一样将"COM"进化到".NET"。从科学概念角度上分析COM与Java,可能COM更全面、精确,从实现的成熟度上Java可能更成熟,可是你看到,Microsoft正在不紧不慢的追赶。Microsoft令人联想起战国时期的强秦。

  战国时期的秦国,采取"远交近攻""抚弱掠强"等措施傲视六国,今天的Microsoft也是这样,VB1.0时,Microsoft推出"VBX"控件技术,众多的小公司得以生存,Microsoft自己不开发"VBX"组件,同样"VBX"进化为"OCX"时,Microsoft并不十分强大,可是这种试探得到众多小公司的响应。1997年Microsoft Office 97、1998年Microsoft推出Visual Studio 6.0,给众多中、小公司提供了生存、发展的机会,例如Microsoft Office 97中集成了Visual Basic for Application 5.0,这项技术使得几百家软件开发商与Microsoft签署了VBA技术许可协议,即使AutoDesk这样的公司都与Microsoft签署了这个协议,这个协议使得每个集成VBA的产品的给个用户许可为Microsoft付40$的许可费,如果你了解VSIP(Visual Studio Integration Protocol)协议,以及有多少公司签订了VSIP协议,你就真正感觉到Microsoft的可怕;Microsoft Office 97、Visual Studio 6.0的用户界面十分漂亮,为什么Microsoft自己的开发工具不提供类似的软件组件?你看到众多第三方的Microsoft盟友纷纷推出自己的界面库以模仿Microsoft,他们不会反对Microsoft,因为他们已经形成了使得Microsoft以及这些公司得以生存的生态圈。

  Microsoft的技术储备有多少,Microsoft之外的人很难说清楚,Microsoft中国公司也未必了解多少,1999年WTL类库刚刚出现的时候,人们就希望WTL能得到官方的支持,或授权给一个Microsoft之外的一个公司(你能想象出Borland C++ 5.0内置的ActiveX开发机制是基于Microsoft ATL类库吗?),直到今天,WTL依然如故,我们完全相信,如果Microsoft强力推广WTL,WTL完全可以流行,可是Microsoft不缺类似的技术,类似的类库还有BCL(Base Control Library,一个用于开发轻量级ActiveX控件的类库),Microsoft还有一个基于ATL的类库,这个类库用于开发ActiveX Designer,ActiveX Designer是绝大多数程序员不了解的一类对象,如果你熟悉Office开发,你知道Office VBA 中有一类对象,即Form2,此外VB6.0 中的报表设计器(以及著名的Active Reporter),都属于此类对象,用这个类库,你可以为VB6.0以及集成VBA的系统提供定制化的可视化设计机制等等,如今ActiveX Designer已经演化为集成于Visual Studio .NET中的设计器。

三、向Microsoft学习

  无论从什么角度评价Microsoft,我觉得Microsoft是值得我们学习的,如果说生活在这个时代有Microsoft存在是一场灾难,你就应该痛恨这个家伙,但你首先要向这个家伙学习!我无意为Microsoft歌功颂德,我只是想说出十几年我对Microsoft技术的感受。

  Microsoft在研究式的开发中受益极大,如果你有兴趣,你可以访问,虽然部分中国公司也有研究院,但与Microsoft相比,真有"米粒之珠,也放光华?"的感觉。2003年,我在北京的一个地方现场体验了Microsoft亚洲研究院的招聘会,我看到中国的精英们进入Microsoft的渴望,事实上,在*,Microsoft亚洲研究院的人力资源已经延伸到各著名高校的相关专业的核心层,我感到,Microsoft几乎不需要"求贤",因为,只要Microsoft需要,精英们会"蜂拥而至",每个人都有"可以理解"的理由而向往那个地方,如果为搞数学研究蜂拥到加州大学,我觉得可以理解,因为那里有数学土壤,出了成果国人也会感到自豪,因为"科学无国界"。技术是否有国界?不知道是否有定论?!想想DVD等技术专利给国内业界带来的灾难,不知道应不应该痛定思痛,在Microsoft校园招聘现场的气氛中,我似乎明白了为什么国人"原创技术"少得可怜。我读过几本Microsoft亚洲研究院的高手写的书,明显可以看出,Bill gate 是他们的精神领袖以及他们对Microsoft的虔诚,国内的研究机构应当研究一下Microsoft的用人之道,Microsoft好像是三国里的人物,不知是刘备还是曹操,或者二者的混合物。我经常路过西格玛大厦,第一次西格玛大厦进入真有"朝圣"的感觉,也与Microsoft中国的几个层次的人打过交道,各中滋味实在一言难尽。

  在Office大战中,国产软件的确在一些方面与Microsoft进行较量,其实给人的感觉很勉强,界面上的似是而非,或用户习惯方面的接近并不能解决根本的问题,一个好的软件开发人员必须是一个软件使用的高手,很难想象一个软件操作水平很拙劣的开发人员能开发出高水平的软件,我最早使用的软件之一就是Microsoft Word,当时的版本是2.0,大概是1992年的事情,给我留下深刻印象的是集成于Word中的Word Basic,后来,我接触到Excel 3.0,不出所料,Excel中集成的是Excel Basic,后来使用的Access中自然内置Access Basic 1.0,在这些软件集成捆绑成Office之前,我就感觉这些产品的构思十分了不起,很具有Microsoft的风格,因为你知道,即使是一个DOS,Microsoft都要提供一个内置的QBasic或GW Basic。虽然关于Microsoft的产品评论很多,作为一个技术人员,我认为Microsoft的产品构思绝对是第一流的,从1994年早期的Office系列到1997年形成的Office 4.2,我认为,技术构思上均领先于我国2002年以后的Office产品,你听说过如下说法吗?"Dos 作为操作系统的时代,Windows是应用软件;Windows是操作系统时,Office成为Dos时代的Windows;那么如果按此规律,Office会不会替代Windows而成为操作系统?",现在在开发领域Visual Studio( .NET)正在成为另一个Office,你注意到了吗?控制Visual Studio( .NET)集成开发环境的仍然是一个Basic语言引擎(Visual Basic .NET)。

  与许多公司不同的是,在技术体系上,Microsoft几乎所有的产品是息息相关的,Windows、Office、Visual Studio .NET虽然各不相同,但公共的核心即将形成,我们已经看到,核心组件方面,Office与Visual Studio .NET日渐趋于一致,例如Microsoft正在将Office 2003的核心组件VBA 6.X逐步用新的Visual Studio Tools for Office替代,而我们依然在一些似是而非的现象上与Microsoft的产品比较差距,国家采购或*采购支持的公司,不去钻研核心技术,只是急功近利的采用短期行为急于与Microsoft相争,不知是否有蚍蜉撼树的感觉,个人的体验是,先学习Microsoft,踏踏实实的学,了解Microsoft,深入的了解,然后再喊口号。

四、为什么用MFC?

  经过若干年的竞争,Borland 的OWL几乎消失了,这个OWL是个非常漂亮的C++类库,在Borland C++ 3.1风光无限的年代,OWL真正的做到了独领风骚。然而,Borland C++ 4.0错过了进入32位程序的最佳时机,BC 4.0推出后不久,迎来了Win95,Borland仓促上阵,以一个小的"Pack"使得BC4可以编译基于Win4的程序,当时的Visual C++是2.0版,支持Window16的版本为Visual C++1.51,有意思的是Borland可以用同一个编译器同时支持Win16、Win32,而Microsoft却不得不为Win16、Win32提供不同的编译器。然而,非正式版本的Visual C++ 2.1与Visual C++ 2.2却悄悄地支持了Win95的最新特征,即Win95新提供的一组公共控件,在我的印象中,Borland对Win95新特征的支持不利使得MFC与OWL的距离极大的缩短了。稍后到来的Borland C++ 4.5没有改变这个状况,尽管Borland C++ 5.0同时支持OWL与MFC,可是败象已经显露,Borland C++非常遗憾的只走到了5.5版。C++ Builder虽然形式上引入了Delphi的VCL库,可是许多C++程序员并不买账,因为许多以C++为乐的人更喜欢以编辑的模式进行编码。Visual C++ 4.0的出现,在C++这个战场上,Borland开始落败了。

  MFC发展到今天,已经十多年了,尽管褒贬不一,但可以肯定,十几年的技术积累已经奠定了MFC的生存基础,即使Microsoft的长角发布,MFC也不能推出Windows的舞台,事实上,长角(Longhorn)之后的Visual Studio .NET仍将MFC作为一个重要的组成部分,在今年的Visual Studio .NET 2005中,MFC在C++中的位置依然如故。MFC的未来,应该不必担心,只要你深入考察.NET类库,你会发现,MFC的许多思想机制正悄然进入.NET,与此同时,Microsoft的第三方盟友十多年来已为MFC开发了大量的扩展库,如果Microsoft是船,第三方盟友就是载舟之水。许多人认为MFC不发展了,其实是一种错觉,Visual C++ 6的界面十分经典,特别是其中的Docking控制条机制,其实Visual C++ 6的IDE完全就是MFC写的,可是MFC类库中控制条相关的类功能很弱,为什么?你会看到许多与Microsoft友好的公司,他们很快的在MFC基础上实现了Visual C++ 6 的Docking机制,这就是Microsoft的高明之处,Microsoft很会给盟友提供机会,其一贯的做法就是在自己的商品化产品中预先提供一些有趣的特征,使得其他一些公司进行模仿以带动用户群体。Borland不具备这样的储备。MFC第三方市场的繁荣,得益于Microsoft的策略与明智。MFC可否跨平台?理论上完全可以,Microsoft不做,也是策略,但是有许多重要的产品Microsoft却默许MFC移植到其他平台,事实上,Microsoft的合作伙伴之一Mainsoft公司(Windows源码就是从这家公司流失的),几年来就是负责移植MFC程序移植到UINIX、Linux、AIX等操作系统之上。

  新版的Visual C++中MFC已经支持.NET开发了,MFC与ATL的协作更好了。根据我的经验,MFC、ATL与.NET库三者完全可以融合在一起综合应用到实际的开发工作中去,如果你是MFC行家,我希望ATL与.NET库能成为你的忠实的左右手。那么有没有同时支持MFC、ATL与.NET库的程序?当然有,Visual Studio .NET IDE就是!而且Visual Studio .NET IDE还支持用ATL与.NET库扩展的Addin,如果你希望用MFC管理ATL与.NET库,请继续支持我!

五、认识Application对象

  如果你熟悉Microsoft Office,你应该进一步的剖析这个大型软件,Microsoft Office中几乎每个程序都是可二次开发的,这一点得益于Microsoft Office内置的二次开发机制,一个是基于COM机制的VBA模型,另一个是基于.NET框架的托管模型:Visual Studio Tools for Office。作为一名程序员,你应当在技术角度解析Office的技术结构。Microsoft的大多数软件的对象结构可以通过Visual Studio提供的工具OLE/COM Object Viewer考察其类型库得到,通过引用类型库,你甚至可以得到描述对象信息的C++头文件。这样做真是好处多多。一个典型的Office通常都有一个Application对象(或其他一个与之相当的对象),这个对象相当于软件枢纽,在这里,我们不讨论Office,借此话题说说Application对象。大多数支持扩展(Addin、Plugin)的软件都存在类似的构造。通常,一个系统得Application对象或者是一个COM对象,或者是一个.NET对象,如果你的系统存在这类对象,你的系统就基本具备支持Addin、Plugin的机制了。一个理想的做法就是在一个MFC系统中,内置一个ATL对象或.NET对象,稍后我们给出方案如何做到这一点。设计Application对象的关键是如何规划这个对象的属性、方法、事件。如果你希望系统具备良好的扩展性,Application对象是十分关键的,这也是构架艺术的体现。所谓Addin(Plugin),是系统运行时根据需要加载的对象库,Addin(Plugin)之所以可以扩展系统,关键的因素就是系统加载Addin(Plugin)时,将Application对象传递给Addin(Plugin)库,设想一下,如果Application恰到好处的触发了系统事件,而Addin(Plugin)库如愿的解释了事件,一个Addin(Plugin)库的任务不就OK了吗!因此Application对象是系统设计的关键。

  如果你精通ATL对象,在你的MFC系统中添加一个ATL对象,这个任务可以用VC Wizard完成。你已经接受了一个事实,就是MFC程序中存在一个CXXXApp对象(CWinApp的派生类),现在你要做的是增加一个对应得ATL对象。这个对象可以在CXXXApp::InitInstance()中创建,如果ATL对象的类是CXXXAppObject,建议你在CXXXApp对象对象中增加一个成员变量,例如:CComObject<CXXXAppObject>* m_pAppObj,然后可以入下初始化m_pAppObj:

m_pAppObj = new CComObject<CXXXAppObject>;

  注意程序结束时在CXXXApp::ExitInstance()中释放m_pAppObj,语句如下:

delete m_pAppObj;

  你可以将系统得关键属性设置成CXXXAppObject的属性,例如系统得标题、是否为多文档等等。系统希望外部调用的功能可以实现为CXXXAppObject的方法,这一点取决于你的需要。系统需要外部扩展的功能,表现为CXXXAppObject的事件,关键是在恰当的位置触发事件以及提供的事件参数。例如,你可以在CXXXApp::InitInstance()触发应用程序开始的事件OnStartUp,Plugin捕获事件后,可以进行特定的初始化(身份确认、初始信息查询等等);你可以在CXXXApp::ExitInstance()触发应用程序结束事件,Plugin捕获事件后,处理用户需要的系统退出工作。所有的设计取决于具体设计。

  如何加载Plugin,是一个有趣的问题,如果Plugin实现为一个COM范畴(Category),可以运用COM技术枚举这个Category;可以将Plugin安装到一个特定目录,也可以通过注册表。Plugin的实现可以用COM技术、也可以用.NET框架。适当的机会我会提供例子……

六、后记

  一时心血来潮,就写了这篇文章,很难说是有心,还是无意。几天前我在新浪网上看应氏杯围棋决赛,我觉得该赢了吧,作为一个围棋迷,我们等了十几年,等到了属于国人的应氏杯。记得7、8年前在还在大学工作的时候,有一次,一位同事兴致冲冲的走道我面前对我说:"嗨,昨天马XX赢了李昌镐!",当时我在系办公室正在看报纸,那位仁兄见我头都没抬,非常不满的抢下报纸,对我吼道:"喂!马XX赢了李昌镐!!你听到没有!!!",我对他说:"你大惊小怪个啥?!马XX输了李昌镐多少盘,你知道吗?",马XX几乎一直在输给李昌镐,人们已经不奇怪了,偶尔赢一次,国人就把他捧得北都找不到了,李昌镐弱冠17的时候就傲视这个世界了,可至今面孔不变,几天前的农心杯,中日联军5个人,被他打个落花流水,李昌镐是公认的世界第一,以至于有的高手知道下一个对手如果是他,就会去订回程机票。这次应氏杯,国人竟然感谢崔哲瀚,何也?因为这个弱冠19的小子,挡住了他的大哥李昌镐才使得应氏杯有了悬念。当国人媒体在说韩国仅李昌镐一人厉害的时候,不知道是出何居心还是自欺欺人,李昌镐年方30,不知道要力压中、日多少年!面对这个名字,真有点麻木了,这个太极虎!

  软件界又来了我们一向不齿的印度虎,2001年我们的软件出口额仅是印度的四十分之一,我们震惊了,怎么可能呢?这个四十分之一水分很大,很可能更可怜!当时我在大连参加一个关于"大连软件出口国内第一"的官方会议,那位大人在会上说:"据说,我们大连软件出口国内排名第一,市有关领导希望今天的会议给出这个第一的数字依据,希望你们把数据报上来,去年的数据也可申报,注意,我们要的只是数据,你们仔细体会,我们根据数据,有奖励,机会难得呀!"……。某一天,几个朋友在我家看央视的对话节目,对话一方为国内的软件大鳄们(用友、阿尔派等公司的老总们),另一方为印度软件的一个代表团。当问及中、印软件差距的时候,我们的刘老总(代表阿尔派)不以为然的说,据他的看法,我们已经快赶上(印度)了,……,言下之意颇有印度的水平不过如此的感觉,印度方的话我至今记忆犹新:"是否赶上,国际市场说的算!在中国看来,印度程序员的个性不足,技术也不怎么样,其实是个错觉,印度软件首先注重个性,许多重要的美国商品化软件都是在印度本土开发的……",我们的舆论总是将印度程序员的水平描述的平庸至极,可是差距日渐拉开,……,围棋、足球(不好意思谈,谈不出口!)、软件,我们被近邻严酷的*了,乐坏了记者们、给媒体带来了生机……

  日本江户时代的围棋,如果一个人要想世袭一个称号(例如:本因坊),他必须战胜所有的师兄弟,然后,住进师父家的内室,你知道以后的事情吗?以后,这个棋手,就得为师父一家做饭、带孩子、搞卫生……,其余的门人则一心一意的下棋,这样的人、方式,造就了一代一代的本因坊,他们的棋谱大多数都流芳至今,这就是早期日本围棋的悟道模式。软件总共有多少语句?我最早接触的计算机软件教材是一本英文版的(影印的D版),不同于我们,那本书的作者构造了"X-语言",他们不讲什么C、Pascal、Basic,一旦缺了什么机制,就给"X-语言"添加些成分。什么C、Pascal、Basic,你感觉差不多,但现在却分出了等级!我们驾驭语言的能力弱得很,可是我们在语言的细微之处却很讲究,不知道对不对,许多程序员也许是出于虚荣而用C++,事实上,地球人到知道,做数据库,Delphi、VB远比C++胜任,铺天盖地的C++的书,写的东西几乎雷同,因为,有用的或者作者不写、或者作者不懂。有时我在想,如果国内没有内需,会怎样?也许软件内需的存在,造就了中国软件的特色,我认为国内业界并没有充分利用中国软件内需的存在,也许中国软件内需的存在是软件落后的硬伤。

  我记得一部电影《神辫》,那个英雄的大辫子被洋人炸掉了,最终他成了神枪手,战胜洋人用大刀、秘籍是不行的,用洋的东西战胜洋的技术才是正道。我觉得,一个好的程序员必须了解软件的历史,学习历史,你知道你为什么弱,别人是如何强大的。我们正在另一个战场上抗美(可笑的是我们却要赶超印度!),无论Microsoft、Borland如何争斗,无论他们谁统治谁,他们不影响美国的强大,朋友们,学习Microsoft,开发出让国人感到牛的软件!

发表于 hangwire 阅读(6843) | |  


--------------------next---------------------

Steve Jobs是使电脑走进千家万户的功臣之一。他的故事我想所有爱好电脑科技的朋友都很熟悉:都说他从Xerox的研究室里获得了GUI和MOUSE的想法,76年创建苹果,在他家的车库里爨出了第一台PC,86年在公司斗争中失败被赶出Apple,96年又被请回苹果公司。Steve Jobs 还头戴另一顶帽子,他也是电脑动画公司Pixar的创始人兼总裁.

Pixar是Steve Jobs 1986年被Apple赶出之后花了10 Million从<<星球大战>>创造者乔治芦克思那儿买来的电脑动画制作公司,足足经
营了10年才靠<<Toy Story>>一炮打响,这之后老史不但在苹果公司咸鱼大翻身,在Pixar也好戏连台:

1998年  <<虫子的一生-A Bug's Life>>
1999年 <<玩具总动员-Toy Story 2 >>
2001年 <<群魔公司- Monsters Inc.>>
2003年 <<海底总动员-Finding Nemo >>
2004年 <<超人特工队-The Incredibles >>
2006年 将推出<<汽车-Cars >>

Pixar和迪斯尼之间是有合约的:由Pixar搞动画片制作,迪斯尼负责市场发行,两位老总争风吃醋翻脸成仇的故事就发生在2003年 <<海底总动员>>公演的前后。

Michael Eisner 预测 <<海底总动员>> 是颗臭子早在<<海底总动员>>公演之前,迪斯尼总裁Eisner就在董事会上宣称:他看了小丑鱼的样片,觉得很臭,票房肯定不行。

他这么说是有他的道理的:Pixar和迪斯尼之间的合约就要到期,正要续新约。如果小丑鱼阴沟翻船,老麦就可以在条款上压老史一头,即使公司短期会有损失,但长期会为迪斯尼多榨出不少银子来。说老实话,911后迪斯尼的日子一直不大好过。

结果<<海底总动员>>在公演的第一周票房就收进7900万,到2003年底,就已经赚了3.7亿,打破了以往所有迪斯尼票房记录。

老史趾高气扬象只斗胜了的大公鸡,格格的在老麦面前神气活现地走来走去。他的得意也是有道理的:不光下次谈条约他占了上手,华纳兄弟,索尼豆开始向Pixar暗送秋波。再往下发生的就是两位老总之间的直接相撞了争风吃醋,针尖对麦芒。

老麦看老史不顺眼不是一天两天了,媒介就喜欢这小子,你凭什么又上<<时代>>封面,又<<华尔街报>>头版专文吹捧的。我多年辛辛苦苦,不就是运气不好吗,净是负面报道,迪斯尼老头本人死就死了,他老弟还整天在董事会里和我捣乱作对。总之是一肚子的嫉妒怨恨。

气归气,老麦还是专门飞到硅谷,找了家印度餐馆请老史撮了一顿。别人问起来,老史毫不领情:"我只能说我们吃了一顿"。老麦还请他看了世界杯棒球赛,老史还是不咸不淡:"有时嘛,看场球就是看场球"。

谈判前,老史特地请了位高参,高参指示:"在沙子地上划条线,守着这条线绝不退过去".Jobs玩硬的,他要92%的利润 :"我们只是租用一下DISNEY的市场发行机器,是租赁关系不是伙伴关系。条件极其苛刻,Eisner 一口回绝:DISNEY恕不出租!,总之一僵局。

这时前付总统AL GORE见有好戏,也想漏一手给老史瞧瞧。他老兄那时刚进了APPLE的董事会,想着当年他还当付总统时,夫妻二人参加万圣节PARTY,DISNEY捐给他们一套"美女和野兽"的服装,和老麦有点交情。电话打过去,Eisner根本不买他的帐,他和老史结的私仇不是一天两天了。

倒麦运动,JOBS是始作蛹者

JOBS是最早想把EISNER推下DISNEY 总裁宝座的发起人。

早在2003年,老史就冲DISNEY 的不少高级主管放出风来:有EISNER在,我是很难和你们公司继续相处的。于是在董事会上WALT DISNEY的侄子ROY DISNEY开始发起倒麦运动。这之前ROY亲自飞到老史硅谷PALO ALTO的家中晚宴,老史花了一晚上表达感情。当时ROY就很紧张:他感觉老史的Pixar和DISNEY的关系危在旦夕。

2004年一月,老史以受害人的姿态宣布:经过10个月和DISNEY的谈判,我们被DISNEY搞得筋疲力尽十分困扰一个头两个大,只好彻底终止谈判。

再往下双方纯枪舌剑对骂一番

老史:"一想到DISNEY要用我们创造出的动画人物制作续集,我就感觉'SICK',他们市场推销能力还行,但制作能力剧臭,谁都知道行销能力再强也没法把一部臭片子卖热了"

DISNEY舔舔伤口一口咬回去:"看到老史因为买卖不成就这么指名道姓的骂人是既不幸又令人伤心的事情,我们再没想到他会这么差劲"
 
老麦最近找了个接班人,准备真的退下来。但在选接班人的过程中把电子湾的女老总梅格涮了一把,ROY  DISNEY正在诉老麦,这是另一个故事了......

发表于 hangwire 阅读(2119) | |  


--------------------next---------------------

荣耀/刘未鹏 译

荣耀: Herb Sutter和Stan Lippman目前正在微软主持C++/CLI的设计工作,意图将动态的、基于组件的.NET编程模型和ISO C++集成在一起。您对此有何评价?您认为C++需要.NET吗?您认为C++/CLI会取得成功吗?

Bjarne: 不,C++根本不需要.NET,C++只需要最小限度的运行时支持,用于new/delete、异常处理以及RTTI等,而且仅当你使用这些特性时才需要。C++程序通常可以使用每一分可用的资源,在硬件上直接跑。C++的这些能力使其非常适合于系统级编程以及嵌入式系统任务。当然,也有些C++应用需要.NET,比如那些为了和微软.NET框架和服务紧密集成而专门设计的应用。然而,C++语言和标准库的宗旨是远离这些平台相关性的纠缠。另一方面,许多.NET设施都依赖于C++,因为除了C++之外,再也找不到更通用、更高效的语言来很好地完成这个任务,从这个意义上说,.NET需要C++。

从“很多人将会使用它”这个意义上来说,C++/CLI是会成功的。使用.NET CLI,开发者选择甚少,而C++则是最佳选择之一,而且很明显在Windows上也是,因为微软给予C++最好的支持。话虽如此,我仍然倾向于在设计系统时保持良好的移植性,而将对平台相关或专有特性的使用限制在特定的代码块中,并使用以ISO标准C++所表达的接口去访问它们。

荣耀: 尽管我现在相信这是一个毫无意义的问题,不过我想我最好还是澄清一下。当我说“C++需要.NET吗?”,我的意思是想问“我们需要.NET来使C++更普及吗?”。这就好比问“世界和平需要美国吗?”,或者,“我们需要美国来维护世界和平吗?”。当然了,我们都不喜欢*性话题,也许这个比方很不合适。

Bjarne: 政治关乎可行性。从这个意义上来说,我们必须考虑政治,而你的问题当然也是合理的。鉴于微软在软件领域的地位以及它对.NET强大而完全的支持(将.NET的系统接口以CLI来表达),.NET的地位会变得很重要。要想在微软的世界里玩得转的话,C++必须很好地绑定到.NET。事实上这种绑定(C++/CLI)已经建立了,微软还为之申请了ECMA标准。.NET跟我理想中的尚有些差距,而C++/CLI如果让我来设计的话可能也不会是这个样子,然而不可否认的是,C++/CLI在.NET上的确是能力非常强的语言,也是迄今为止为.NET设计的语言中能力最强的。如果微软未考虑将C++作为.NET上的关键语言之一,或者.NET平台上的应用创建者没有坚持对C++提供第一流支持的话,情况会糟很多。

所以,为了能够在微软的世界里流行,C++需要一个良好的CLI绑定。我仍然鼓励人们将C++/CLI仅仅视作一个绑定物。这就是说,把对C++/CLI特性的使用隔离到一些特定的区域里,并且通过ISO标准C++设施去访问它们。C++/CLI的一些设施使其成为一门具有吸引力的语言,然而和标准C++却相去甚远,所以如果你在代码中到处使用这些C++/CLI设施的话,那么你将失去平台无关性,并有损失性能优势的潜在危险。

荣耀: 鉴于Herb Sutter的双重身份:ISO C++标准委员会主席和微软软件架构师,C++/CLI对C++0x标准会产生什么样的影响?这种可能的影响是您希望看到的吗?

Bjarne: C++/CLI会在一些领域对C++产生影响,因为将会有许多人使用它。显而易见,在使用中人们将会建议加入一些新的设施,以便和ISO C++平滑地互操作。在确保ISO C++平台中立的前提下,这些建议会依据其优点而被评估。我并不认为Herb的双重身份会带来任何负面影响。请注意,ISO委员会的会议召集人的角色属于管理方面的。我认为微软将Herb的才能贡献到标准化进程中是一个积极的信号。一如往常,微软在实践着其“拥抱并扩展”策略,但至少他们拥抱的是ISO C++而非某种C++方言。

荣耀: C++0x标准大概可于哪一年颁布?目前标准化工作进展如何?我们在这个新标准中预期可以看到哪些新特性?

Bjarne: 我希望三、四年内能够颁布,不过目前我们还没有一个明确的进度表。

我们打算在语言的扩展上持保守态度,并在与C++98的兼容性方面仔细斟酌。改进的关键可能会落在对泛型编程更好的支持以及对新手更易学习上。我们期望一个关于模板实参的类型系统“concepts”能成为泛型编程的基石。

在标准库的扩展方面我们打算胆子更大一些。新标准库技术报告也许会使你对它的发展方向有一些认识。我们的关键目标是使标准库成为一个更广泛的系统编程平台!

荣耀: 一个冒昧的问题。为什么C++标准委员会主席是Herb Sutter而不是您?我记得您是进化工作组主席,我们都很有兴趣知道您在目前标准化过程中具体从事什么工作。

Bjarne: 我并不想担当会议召集人的职务。Herb和他的前任们在那个职位上比我所能做到的要出色得多。会议召集人主要负责管理性和组织性的事务。我的(非正式的)角色在于努力维持语言一致性的方向。我是语言进化工作组的主席,这个工作组负责处理所有语言扩展方面的提议。这个职位意味着绝大部分定义语言改变的文本都是我写出来的,而这些文本最终形成了标准文档。

作为进化工作组的主席,目前我正致力于三件事情:“concept”,改进的初始化设施,以及对C++新手的更好支持。你可以从我的主页上以下链接看到人们对标准下一个修订版(即“C++0x”)建议的期望特性列表:。简单的数一下你就会发现这些特性根本不能全部塞到标准中去,所以,我们需要一些优先级上的考虑。此外,我们还需要把注意力集中到一些相互关的问题上,而不是每次单独处理这些个体提议。如果把每个特性都单独考虑的话,你无论如何也不能得到一个内在一致且易教学的语言。正如语言本身一样,特性必须是为解决问题而设计的,而不仅仅是一个一个地“看上去很美”。

让我扼要介绍一下我眼下正以高优先级进行的三个语言扩展:concepts,初始化,以及“消除一些令人不愉快的瑕疵”:

在《C++语言的设计与演化》(D&E)中对模板的讨论部分,我花了整整三页来讨论模板实参的约束。很明显,我觉得它需要一个更好的解决方案。在使用模板(例如标准库算法)时哪怕出一丁点儿差错都可能招致极其“壮观”而无用的错误信息。问题在于,模板代码对其模板实参的“期望”是隐式的。让我们考虑一下find_if():

template<class In, class Pred>
In find_if(In first, In last, Pred pred)
{
    while (first!=last && !pred(*first)) ++first;
    return first;
}

这里,我们对类型In和Predicate作了若干假设。从代码中我们可以看出,In必须支持!=、*和++,并且这些操作符还必须具有恰当的语义。另外,我们必须能够拷贝In类型的对象作为实参和返回值。类似地还可以看出,我们可以“以*作用在In对象上所返回的值”作为实参来调用Pred,并且把“!”运用到该调用返回的结果上,从而得到一个可以在语义上看成是布尔值的东西。然而,这些约束在代码中都是隐式表达的。标准库为前向迭代器(此处为In)以及谓词(此处为Pred)小心翼翼地记录了各自要求的条件,但编译器可不会阅读文档!试试以下错误的代码,看看你的编译器会有什么反应:

find_if(1,5,3.14); // 错误!

我以前的想法提供了一个不完备、但相当高效的解决方案,即使用一个构造函数来检查对于模板实参的假定条件(见D&E 15.4.2),这个解决方案现在得到了广泛运用,被称为“concepts(概念)”或“constraints classes(约束类)”。你可以从我的主页上的技术FAQ中找到一些例子:。

然而,我们真正想要告诉编译器的是“我们期望模板实参是什么样子的”或者“我们期望模板实参满足哪些要求”,例如:

template<Forward_iterator In, Predicate Pred>
In find_if(In first, In last, Pred pred);

假设我们可以表达Forward_iterator和Predicate是什么,编译器就能够在不用查看find_if()定义的情况下检查对它的调用是否正确。这里我们所要做的就是为模板实参构建一个类型系统。在现代C++中,这种“类型的类型”被称为“concepts”。有多种方式可以用于表达concepts,眼下我们暂且把它们看成一些受到直接的语言支持并具有优雅语法的“约束类”。一个concept表明了一个类型必须提供哪些能力,但并不强制规定它们如何提供这些能力。理想的concept(例如<Forward_iterator In>)应该非常类似于数学抽象(对于任意的In,它必须可被递增(++)、解引用(*)以及拷贝),就像原来的形式“<class T>”从数学上来说是“针对所有的类型T”那样。

这样一来,在仅仅给出find_if()的声明的情况下,我们可以写:

int x = find_if(1,2,Less_than<int>(7));

这将会失败,因为int并不支持解引用(*)。换句话说,这个调用将不能通过编译,因为int并不是一个Forward_iterator。很重要的一点是,这将会使编译器更容易在该调用首次被看到的那一点上报告用户所犯的错误。

遗憾的是,仅仅知道iterator实参是Forward_iterator以及predicate实参是Predicate还不足以保证对find_if()的调用能够成功编译。这两个实参类型之间是有着交互作用的。说得详细一点就是,predicate所接受的实参是一个被解引用的iterator (pred(*first))。我们的目标在于对模板进行“和调用相分离”的完全检查以及无需查看模板定义就能对每次调用进行的完全检查,所以,concept必须具有足够强的表达力,以便处理这种模板实参之间的交互关系。方式之一是对concept本身也进行参数化,就像模板本身的参数化那样。例如:

template<Value_type T,
Forward_iterator<T> In,  // 对一个T序列进行迭代
Predicate<bool,T> Pred>  // 接受一个T并返回一个bool
In find_if(In first, In last, Pred pred);

在这儿,我们要求Forward_iterator必须指向一个T类型的元素,而该元素的类型必须和Predicate的实参类型一样(译注:实际上只要类型兼容即可)。

这方面的工作正在进行中。你可以从C++委员会的文件、学术文献以及有关C++0x的讨论中找到这方面更多的信息,在这里我没有太多的时间或地方进行更详细地阐述。“concept”的目标是提供模板使用和模板定义的完美的分离式检查,同时不引入任何运行期负担(译注:在C#的所谓的泛型中,concept只不过是间接函数调用的语法糖而已,运行期额外负担仍然存在。)以及不必要的concept耦合(译注:在C#所谓的泛型中,concept要求模板实参继承自一个公共基类,因此耦合仍然存在。)。

换句话说,我们想要把静态类型检查的好处引入到C++中的高度抽象的层面上去,同时不损及目前的模板技术所提供的灵活性和效率。

C++的基本思想之一是“对用户定义类型提供和内建类型一样良好的支持”(见D&E4.4)。但考虑下面这个例子:

double vd[ ] = { 1.2, 2.3, 3.4, 4.5, 5.6 };
vector<double> v(vd, vd+5);

我们可以直接使用“初始化列表”来直接初始化数组,而对于vector,最好的情况是我们可以先创建一个内建数组然后再用它来初始化vector。如果只有很少的几个初始化值,我可能会倾向于使用push_back()以避免将初始值的数目显式“写死”在代码中(上面例子中的初值是5个):

vector<double> v;
v.push_back(1.2);
v.push_back(2.3);
v.push_back(3.4);
v.push_back(4.5);
v.push_back(5.6);

我想任何人都不会认为这两种解决方案有任何“优雅”可言。要想得到可维护性更好的代码并且让vector比内建(具有固有的危险性)数组更“讨人喜欢”的话,我们需要这样的能力:

vector<double> v = { 1.2, 2.3, 3.4, 4.5, 5.6 }; 

或者:

vector<double> v ({ 1.2, 2.3, 3.4, 4.5, 5.6 });

由于实参传递是依据初始化来定义的,因此这对接受vector为参数的函数同样奏效:

void f(const vector<double>& r);
// …
f({ 1.2, 2.3, 3.4, 4.5, 5.6 });

(译注:这里即是说,实参传递和初始化的语义是一样的,例如:

void f(T a);
f(x); 

这里“把x作为实参传递给a”的过程等同于

T a = x;

这是个初始化表达式。)

我相信这种初始化器(initializers)的一般形式将会成为C++0x的一部分,这不过是将成为对构造函数进行全面检修的一部分,因为人们已经发现了有关构造函数的不少弱点,这些弱点看起来可以通过对构造函数进行一些修整来解决,例如“转发构造函数(forwarding constructor)”、“有保障的编译期构造函数(guaranteed compile-time constructors)”以及“继承的构造函数(inherited constructors)”等。

第三件事是“剔除语言里的一些令人不愉快的瑕疵”,也就是说,修整一些细小的不合常规或不方便的东西,它们对有经验的C++老手不会产生什么影响,然而却可能严重打击C++新手。一个非常简单的例子就是:

vector<vector<double>> v;

在C++98中,这里有一个语法错误,因为“>>”被看成一个单独的词汇标记,而不是两个“>”。正确的写法如下:

vector< vector<double> > v;

对于C++98这样一个“不近人情”的规则,虽然有足够技术上的理由,但这不应该强加给任何背景的新手(包括其它语言的专家)。如果编译器不接受前一种最为明显的v的声明形式的话,那么C++用户和教师都会在这上面浪费大量的时间。我希望这个“>>问题”以及其它一些瑕疵都会在C++0x中消失。事实上,在和Francis Glassborow以及其他一些人的工作中,我一直努力去系统地消除出现频率最高的此类语言瑕疵。

荣耀: 和大多数人一样,我认为C++缺乏一个大一统的库是阻碍C++更为广泛地使用的关键原因,您认为现在C++社群有足够的资源来开发一个像Java或.NET那般规模的库了吗?如果没有,我们该怎么做?我发现使用形形色色的第三方库非常不方便(一个插曲。我在使用微软Visual C++时,有时希望使用STL组件,例如vector,但由于我大幅使用了MFC,而MFC中也有类似的容器,所以,虽然vector更好用,但为了避免因链接两个不同的库而导致文件体积增大,我最终往往放弃使用标准库。不过,倘若标准库提供了MFC所提供的所有功能,我将肯定全部改用标准库)。

Bjarne: 毫无疑问,MFC是迄今为止被广泛运用的最糟糕的基础库。它违反了一个好的C++设计应该遵循的大多数原则。它严重地扭曲了许多程序员对于“什么是C++”的看法!

当然,我也认为缺乏全面且标准的基础库是C++社群的一个主要问题。对于个体程序员来说,这也许是他们面对的最困难的问题。我在《C++语言的设计与演化》中谈到了这一点,至今我仍然坚持这一点。

C++社群没有一个有钱的公司来支持“平台中立的”标准库的开发 — 从来没有,跟其它专有语言(以及它们的“标准”库)相比,这一直是阻碍C++发展的一道藩篱。和专有的基础库的扩展速度相比,我们对标准库的扩展是很慢的(不过和其他ISO标准库相比,我们的扩展速度应该算是比较快的)。我们还期望能够和新兴的非标准库(译注:如Boost)逐渐达成更为平滑的整合。别忘了,当年MFC以及其它“后80年代”风格的库被设计出来投放市场之际,尚无任何标准库可作它们的构建基础。因此,我希望今后的专有库和开源库都能充分尊重标准库,以便使它们之间的互操作变得容易 — 至少容易一点点。

C++社群并不是为大规模设计和实现而组织的。C++社群中也没有什么传统或惯例。和其它社群相比,我们缺少一个“统帅”,他可以有效地激励新库的创建,否决或“保佑”我们的努力和成果。然而,我对“统帅模式”是否可行心里没底 — 除非你所做的事情只是基本的模仿而已。Boost()是一个优秀的成果,它的某些方面已经超出了模仿的范畴,然而它仍然缺乏一个明确的目标以及用于维持自身发展的权威机构或权威人物。

在以下三个相关的领域中,大规模的合作努力对于C++社群而言是必需且有意义的:基本的并发编程库(包括线程、锁和lock-free算法等);平台无关的操作系统服务库(目录和文件操纵以及套接字等);以及GUI编程库。前两个看起来是可行的,但要想建立一个标准的GUI库,也许从技术上、经济上尤其是政治上都显得太困难了。

荣耀: 是的,我相信对于许多C++程序员而言,一个标准的GUI库是极其重要的。许多人以为GUI库不是一个太复杂的问题,但我却认为这可能是最棘手的问题。为了解决它,我们可能需要难以置信的大量的资源。同时我认为政治问题可能是其他问题的根源。举个例子,我们知道Windows的GUI风格和Java的GUI风格是不一样的,甚至不同版本的Windows的GUI风格也不一样。而且我们知道GUI风格很不稳定,它发展演化得非常快,而且很容易被微软这样的大公司所引导和操纵。

Bjarne: 在这个问题上,资源(包括财力和人力)是一个关键问题,与“保持设计蓝图的一致性”同样重要。另外,即使我们已经有了这三样东西:蓝图、人力(数打甚至更多)、以及财力(至少要担负得起一些优秀的人在这个项目上的全职工作),这仍然会是个需要N年才能完成的项目。而SUN、微软、苹果以及其他主要竞争对手将会做些什么呢?毕竟包含了一个工业强度的GUI库的ISO标准C++对于它们的专有系统可不啻一记重击啊!我的猜测是它们大多会通过强大的市场手段来保护既得利益,标准委员会可不是为了在这种市场环境中呼风唤雨而组织起来的,我们至少还需要一个工业社团的支持以及和开源社群主力军的联盟。

荣耀: 在您看来,C++要想继续向前发展,除了开发一个更为广泛、更具威力的库以外,我们还应该做些什么?

Bjarne: 我认为库方面的工作是关键。标准委员会没有足够的资源去创建一个全新的库,而且无论如何“让委员会设计”都不是个好主意。如果人们创建了新的库,在紧密相关的领域把它们的努力融合起来以达到冲突最小,并且文献记录良好(并非只记录细节,还有设计原则),那么他们也许可以把这些东西带到委员会来,并有希望让它们成为标准。如果没有成为标准的话,至少他们的努力有最大的机会成为“准”标准。有此打算的人应该把C++真正当作“C++”(使用继承、模板以及异常等)来看待,而不是从其它特性不是那么丰富的语言中抄袭设计而来。如果一个库的设计被发现没有用C++最佳地表达出来,那么它被接受为标准的几率微乎其微。

另一个可作贡献的领域是对技术的开发和推广。C++往往被以“很不理想”的方式使用着,MFC就是一个典型的例子,它甚至还达不到80年代中期对一个良好的OO设计的看法!我所说的“不理想”,是指没有达到它所能达到的可维护性的设计(通常这是由于对设计决策的糟糕的分解、低劣的封装以及对概念的拙劣表达而造成的),而并非指在外部压力下要尽快把项目赶出来的个体程序员或团队的“不理想”。通常,一个较好的设计和现有的实践是背道而驰的,后者往往需要立即付出代价(往往在很短时间内)。显然,任何显著的改进都需要在“一切照常”的基础上,并且至少追加学习所需的代价以及时间上的延迟。

这就把我们带到了最重要并且也许是最明显的改进实践的途径面前:教育。我们对编程和设计的教育必须比当前做得更好。新的语言特性、新技术以及新库碰到了不能理解并使用它们的人仍然是无用之刃。遗憾的是,我们恰恰缺乏优秀的C++入门书籍。Francis Glassborow的新书《You Can Do It》(译注:中文版《C++编程你也行》即将由人民邮电出版社出版)和Koenig & Moo的《Accelerated C++》是打破旧式而令人厌烦的教育方式的例子。那种教育方式把C++当作一个“稍微好一点的C”或者一门在实现“真正的面向对象”方面失败的语言。前者倾向于用一大堆语言技术细节来迷糊和恼怒读者,偏离了学习好的编程及设计技术的正确道路。后者通常除了存在这些问题之外,还没能够教会在性能攸关的领域里编程的必要技术,而且没有让人感受到静态类型系统的价值。尤其遗憾的是,Glassborow和Koenig & Moo的书的风格都不是编程入门教材的传统风格,这也阻碍了它们的广泛普及。

我自己的两本书《C++程序设计语言》和《C++语言的设计与演化》的目标读者则是已经知道如何去编程然而不知道如何使用C++的人。这两本书确实满足了这部分读者,但我们要做的还不止这些。

任何时候只要有可能,程序员都可以通过将程序的主要部分用ISO C++来写,并将系统依赖性封装起来,从而来支持标准。也就是说,把系统依赖性限定到特定的区域,并通过以标准C++表达的接口去访问它们。通常这并不容易做到,因为厂商总是怂恿程序员在代码中使用专有的、排他性的特性,但这就影响了可移植性,从而使程序移植到其他系统上非常困难。然而,站在应用构建者的立场来说,从长远来看,挣脱厂商的束缚、维持可移植性是一件好事,这种隔离系统依赖性的努力终将从经济和技术两方面都得到回报。

荣耀
2005年1月
南京师范大学

发表于 hangwire 阅读(2206) | |  


--------------------next---------------------

by Lionel B. Dyck

1. Availability and Customer service come first.
2. Problems will be resolved as quickly and accurately as possible.
3. We will not place blame, we will solve problems together.
4. My team must be successful for me to be successful.
5. I will do what I can to make my team successful, including education and opportunities for promotion.
6. I will respect my team as I expect respect in return.
7. I will always be honest with my team and I expect honesty in return.
8. I will set clear priorities.
9. I will always be available to my team, and when I’m otherwise occupied I will make every effort to get back to my team as soon as is possible.
10. I will reward my team when appropriate in public, and will correct when appropriate in private.
11. I expect to be notified of any problems reaching severity 2 or severity 1 status as soon as possible and to be kept informed of the progress in problem identification and resolution.
12. I expect to be notified of any severity 3 or 4 problems that have the potential to reach severity 2 or 1 level as soon as possible.
13. I expect my team to make appropriate recommendations for additional resources to resolve problems. When in doubt – escalate.
14. I will be open to suggestions and criticisms from my peers and my team, as the only way to improve is to know what needs improving. In return I will provide the same feedback to my team in a private and respectful manner.
15. My team knows their job and I will not micro manage them. I expect my team to let me know when they need additional skill training and/or resources to do their job.
16. My team should enjoy what they are doing and if they are not then I will work with them to change things where possible. This may include additional training or more challenging job assignments that might lead to a promotion or a position in another group.

发表于 hangwire 阅读(1763) | |  


--------------------next---------------------

A.I.    人工智能
A2A integration  A2A整合       
abstract   抽象的        
abstract base class (ABC)抽象基类
abstract class 抽象类
abstraction 抽象、抽象物、抽象性
access 存取、访问
access function  访问函数
access level访问级别
account  账户
action   动作
activate 激活
active   活动的
actual parameter  实参
adapter 适配器
add-in  插件
address 地址
address space     地址空间
address-of operator 取地址操作符
ADL (argument-dependent lookup)
ADO(ActiveX Data Object)ActiveX数据对象
advanced    高级的
aggregation 聚合、聚集
algorithm 算法
alias 别名
align 排列、对齐
allocate 分配、配置
allocator分配器、配置器
angle bracket 尖括号
annotation   注解、评注
API (Application Programming Interface) 应用(程序)编程接口
app domain (application domain)应用域
appearance 外观
append     附加
application  应用、应用程序
application framework 应用程序框架
Approximate String Matching 模糊匹配
Arbitrary Precision Arithmetic 高精度计算
architecture 架构、体系结构
archive file 归档文件、存档文件
argument引数(传给函式的值)。参见parameter          
array   数组
arrow operator  箭头操作符
ASP(Active Server Page)活动服务器页面
ASP.NET worker process ASP.NET工作者进程
assembly     装配件、配件
assembly language   汇编语言
assembly manifest   装配件清单
assert(ion) 断言
assign      赋值
assignment  赋值、分配
assignment operator 赋值操作符
associated  相关的、相关联的
associative container 关联式容器(对应sequential container)        
asynchronous  异步的
atomic    原子的
atomic operation   原子操作
attribute   特性、属性
audio   音频
authentication service 验证服务
authorization  授权
B2B integration  B2B整合、B2B集成(business-to-business integration)        
background   背景、后台(进程)
backup   备份
backup device备份设备
backup file  备份文件
backward compatible    向后兼容、向下兼容
bandwidth  带宽
Bandwidth Reduction 带宽压缩
base class 基类
base type  基类型
batch   批处理
BCL (base class library)基类库
Bin Packing 装箱问题
binary  二进制  
binary function  双参函数
binary large object二进制大对象
binary operator 二元操作符
binary search 二分查找
binary tree 二叉树
binding 绑定
bit 位
bitmap  位图
bitwise 按位...
bitwise copy       为单元进行复制;位元逐一复制,按位拷
bitwise operation  按位运算
block  块、区块、语句块
bookkeeping  簿记
boolean 布林值(真假值,true或false)                 
border  边框
bounds checking 边界检查
boxing  装箱、装箱转换
brace (curly brace) 大括号、花括号
bracket (square brakcet) 中括号、方括号
breakpoint 断点
browser applications  浏览器应用(程序)
browser-accessible application  可经由浏览器访问的应用程序
bug  臭虫
build  编连(专指编译和连接
built-in  内建、内置
bus  总线
business  业务、商务(看场合)
business Logic 业务逻辑
business rules 业务规则
buttons  按钮
by/through 通过
byte  位元组(由8 bits组成)   
cache 高速缓存
calendar 日历
Calendrical Calculations 日期
call 调用
call operator 调用操作符
call-level interface (CLI)调用级接口(CLI)
callback  回调
candidate key 候选键 (for database)
cascading delete 级联删除 (for database)
cascading update 级联更新 (for database)
casting   转型、造型转换
catalog   目录
chain     链(function calls)
character 字符
character format  字符格式
character set     字符集
check box  复选框
check button 复选按钮
CHECK constraints CHECK约束 (for database)
checkpoint 检查点 (for database)
child class  子类
CIL (common intermediate language)通用中间语言、通用中介语言
class    类
class declaration  类声明
class definition   类定义
class derivation list 类继承列表
class factory    类厂
class hierarchy  类层次结构
class library    类库
class loader     类装载器
class template   类模板
class template partial specializations 类模板部分特化
class template specializations         类模板特化
classification  分类
clause  子句
cleanup   清理、清除
CLI (Common Language Infrastructure)   通用语言基础设施
client 客户、客户端
client application  客户端应用程序
client area  客户区
client cursor  客户端游标 (for database)
client-server 客户机/服务器、客户端/服务器
clipboard 剪贴板
Clique 最大团
clone  克隆
CLS (common language specification) 通用语言规范
code access security  代码访问安全
code page 代码页
COFF (Common Object File Format)    通用对象文件格式
collection  集合
COM (Component Object Model)  组件对象模型
Combinatorial Problems 组合问题
combo box 组合框
command line 命令行
comment  注释
commit   提交 (for database)
communication  通讯
compatible 兼容
compile time 编译期、编译时
compiler 编译器
component组件
composite index 复合索引、组合索引 (for database)
composite key 复合键、组合键 (for database)
composition   复合、组合
Computational Geometry 计算几何
concept 概念
concrete具体的
concrete class  具体类
concurrency 并发、并发机制
configuration 配置、组态
Connected Components 连通分支
connection    连接 (for database)
connection pooling 连接池
console    控制台
constant   常量
Constrained and Unconstrained Optimization 最值问题
constraint  约束 (for database)
construct  构件、成分、概念、构造(for language)
constructor (ctor) 构造函数、构造器
container  容器
containment包容
context 环境、上下文
control 控件
Convex Hull 凸包
cookie  (不译)
copy    拷贝
CORBA   通用对象请求中介架构(Common Object Request Broker Architecture)
cover   覆盖、涵盖
create/creation    创建、生成
crosstab query     交叉表查询 (for database)
CRTP (curiously recurring template pattern)
Cryptography 密码
CTS (common type system)通用类型系统
cube   多维数据集 (for database)
cursor 光标
cursor 游标 (for database)
custom 定制、自定义
data   数据
data connection   数据连接 (for database)
Data Control Language (DCL)  数据控制语言(DCL) (for database)
Data Definition Language (DDL) 数据定义语言(DDL) (for database)
data dictionary 数据字典 (for database)
data dictionary view  数据字典视图 (for database)
data file  数据文件 (for database)
data integrity  数据完整性 (for database)
data manipulation language (DML)数据操作语言(DML) (for database)
data mart  数据集市 (for database)
data member   数据成员、成员变量
data pump  数据抽取 (for database)
data scrubbing  数据清理 (for database)
data source   数据源 (for database)
data source     数据源 (for database)
Data source name (DSN) 数据源名称(DSN) (for database)
data structure数据结构
Data Structures 基本数据结构
data table    数据表 (for database)
data warehouse    数据仓库 (for database)
data-aware control数据感知控件 (for database)
data-bound       数据绑定 (for database)
database  数据库 (for database)
database catalog  数据库目录 (for database)
database diagram  数据关系图 (for database)
database file     数据库文件 (for database)
database object   数据库对象 (for database)
database owner    数据库所有者 (for database)
database project  数据库工程 (for database)
database role     数据库角色 (for database)
database schema  数据库模式、数据库架构 (for database)
database script  数据库脚本 (for database)
datagram    数据报文
dataset   数据集 (for database)
dataset       数据集 (for database)
DBMS (database management system)数据库管理系统 (for database)
DCOM (distributed COM)分布式COM
dead lock  死锁 (for database)
deallocate 归还
debug      调试
debugger   调试器
decay      退化
decision support 决策支持
declaration 声明
declarative referential integrity (DRI)声明引用完整性(DRI) (for database)
deduction  推导
default     缺省、默认值
DEFAULT constraint默认约束 (for database)
default database  默认数据库 (for database)
default instance  默认实例 (for database)
default result set 默认结果集 (for database)
defer       推迟
definition  定义
delegate    委托
Delegates 一般译法为"委托",微软没有对这个术语进行正式解释或翻译。
delegation  委托
dependent name      
deploy       部署
dereference  解引用
dereference operator (提领)运算子                     
derived class  派生类
design by contract 契约式设计
design pattern  设计模式
destroy   销毁
destructor(dtor)析构函数、析构器
Determinants and Permanents 行列式
device   设备
DHTML (dynamic HyperText Markup Language)动态超文本标记语言
dialog   对话框
Dictionaries 字典
digest   摘要
digital  数字的
DIME (Direct Internet Message Encapsulation)直接Internet消息封装
directive  (编译)指示符
directory  目录
dirty pages脏页 (for database)
dirty read 脏读 (for database)
disassembler 反汇编器
DISCO (Discovery of Web Services)Web Services的查找
Discrete Fourier Transform 离散Fourier变换
disk  盘
dispatch 调度、分派、派发(我喜欢“调度”)
DISPID (Dispatch Identifier)分派标识符
distributed computing 分布式计算
distributed query     分布式查询 (for database)
DNA (Distributed interNet Application) 分布式网间应用程序
document 文档
DOM (Document Object Model)文档对象模型
dot operator  (圆)点操作符
double-byte character set (DBCS)双字节字符集(DBCS)
DP——Dynamic Programming——动态规划
Drawing Graphs Nicely 图的描绘
Drawing Trees 树的描绘
driver 驱动(程序)
DTD (document type definition)  文档类型定义
dump       转储
dump file  转储文件
dynamic assembly 动态装配件、动态配件
dynamic binding  动态绑定
dynamic cursor    动态游标 (for database)
dynamic filter    动态筛选 (for database)
dynamic locking   动态锁定 (for database)
dynamic recovery  动态恢复 (for database)
dynamic snapshot  动态快照 (for database)
dynamic SQL statements 动态SQL语句 (for database)
e-business   电子商务
EAI (enterprise application integration)企业应用程序集成(整合)
EBCO (empty base class optimization)   空基类优化(机制)
Edge and Vertex Connectivity 割边/割点
Edge Coloring 边染色
EDI (Dlectronic Data Interchange)电子数据交换
efficiency 效率
efficient  高效
encapsulation   封装
enclosing class 外围类别(与巢状类别 nested class有关)
end user 最终用户
end-to-end authentication 端对端身份验证
engine   引擎
entity  实体
enum (enumeration) 枚举
enumerators 枚举成员、枚举器
equal       相等
equality    相等性
equality operator  等号操作符
error log   错误日志 (for database)
escape character 转义符、转义字符
escape code 转义码
Eulerian Cycle / Chinese Postman Euler回路/中国邮路
evaluate 评估
event    事件
event driven  事件驱动的
event handler 事件处理器
evidence  证据
exception 异常
exception declaration 异常声明
exception handling 异常处理、异常处理机制
exception specification 异常规范
exception-safe 异常安全的
exclusive lock   排它锁 (for database)
exit     退出
explicit 显式
explicit specialization  显式特化
explicit transaction 显式事务 (for database)
export      导出
expression  表达式
facility    设施、设备
Factoring and Primality Testing 因子分解/质数判定
fat client  胖客户端
feature     特性、特征
Feedback Edge/Vertex Set 最大无环子图
fetch 提取
field 字段 (for database)
field 字段(java)
field length 字段长度 (for database)
file   文件
filter 筛选 (for database)
finalization 终结
finalizer 终结器
Finite State Machine Minimization 有穷自动机简化
firewall  防火墙
firmware 固件
flag     标记
flash memory 闪存
flush 刷新
font  字体
For GUI  界面
foreign key (FK)  外键(FK) (for database)
form   窗体
formal parameter  形参
forward declaration  前置声明
forward-only  只向前的
forward-only cursor  只向前游标 (for database)
fragmentation 碎片 (for database)
framework  框架
full specialization  完全特化
function  函数
function call operator (即operator ()) 函数调用操作符
function object 函数对象
function overloaded resolution函数重载决议
function template函数模板
functionality    功能
functor  仿函数
GAC (global assembly cache) 全局装配件缓存、全局配件缓存
game     游戏
GC (Garbage collection)     垃圾回收(机制)、垃圾收集(机制)
generate 生成
Generating Graphs 图的生成
Generating Partitions 划分生成
Generating Permutations 排列生成
Generating Subsets 子集生成
generic  泛化的、一般化的、通用的
generic algorithm通用算法
genericity 泛型
getter (相对于 setter)取值函数
global        全局的
global object 全局对象
global scope resolution operator 全局范围解析操作符
grant       授权 (for database)
granularity 粒度
Graph Data Structures 图
Graph Isomorphism 同构
Graph Partition 图的划分
Graph Problems -- hard 图论-NP问题
Graph Problems -- polynomial 图论-多项式算法
group       组、群
group box   分组框
GUI   图形界面
GUID (Globally Unique Identifier) 全球唯一标识符
Hamiltonian Cycle Hamilton回路
hand shaking   握手
handle     句柄
handler    处理器
hard disk  硬盘
hard-coded 硬编码的
hard-copy  截屏图
hardware   硬件
hash table 散列表、哈希表
header file头文件
heap       堆
help file  帮助文件
hierarchical data 阶层式数据、层次式数据
hierarchy  层次结构、继承体系
high level 高阶、高层
hook   钩子
Host (application)宿主(应用程序)
hot key   热键
HTML (HyperText Markup Language) 超文本标记语言
HTTP (HyperText Transfer Protocol) 超文本传输协议
HTTP pipeline  HTTP管道
hyperlink 超链接
icon   图标
IDE (Integrated Development Environment)集成开发环境
identifier 标识符
IDL (Interface Definition Language)    接口定义语言
idle time  空闲时间
if and only if当且仅当
IL (Intermediate Language) 中间语言、中介语言
image 图象
IME   输入法
immediate base      直接基类
immediate derived   直接派生类
immediate updating  即时更新 (for database)
implement      实现
implementation 实现、实现品
implicit       隐式
implicit transaction隐式事务 (for database)
import         导入
in-place active 现场激活
increment operator  增加操作符
incremental update  增量更新 (for database)
Independent Set 独立集
index          索引 (for database)
infinite loop       无限循环
infinite recursive  无限递归
information      信息
infrastructure   基础设施
inheritance      继承、继承机制
initialization   初始化
initialization list 初始化列表、初始值列表
initialize      初始化
inline           内联
inline expansion 内联展开
inner join      内联接 (for database)
instance        实例
instantiated    具现化、实体化(常应用于template)            
instantiation   具现体、具现化实体(常应用于template)        
integrate       集成、整合
integrity       完整性、一致性
integrity constraint完整性约束 (for database)
interacts  交互
interface  接口
interoperability 互操作性、互操作能力
interpreter   解释器
interprocess communication (IPC)进程间通讯(IPC)
Intersection Detection 碰撞测试
introspection 自省
invariants    不变性
invoke        调用
isolation level  隔离级别 (for database)
item      项、条款、项目
iterate   迭代
iteration 迭代(回圈每次轮回称为一个iteration)         
iterative 反复的、迭代的
iterator  迭代器
JIT compilation  JIT编译 即时编译
Job Scheduling 工程安排
Kd-Trees 线段树
key          键 (for database)
key column   键列 (for database)
Knapsack Problem 背包问题
laser        激光
late binding 迟绑定
left outer join  左向外联接 (for database)
level      阶、层例
library    库
lifetime   生命期、寿命
Linear Programming 线性规划
link       连接、链接
linkage    连接、链接
linker     连接器、链接器
list   列表、表、链表
list box 列表框
literal constant 字面常数
livelock 活锁 (for database)
load   装载、加载
load balancing  负载平衡
loader 装载器、载入器
local  局部的
local object    局部对象
lock  锁
log   日志
login 登录
login security mode登录安全模式 (for database)
Longest Common Substring 最长公共子串
lookup table   查找表 (for database)
loop           循环
loose coupling 松散耦合
lvalue         左值
machine code   机器码、机器代码
macro        宏
maintain     维护
Maintaining Line Arrangements 平面分割
managed code 受控代码、托管代码
Managed Extensions 受控扩充件、托管扩展
managed object 受控对象、托管对象
mangled name      
manifest     清单
manipulator  操纵器(iostream预先定义的一种东西)           
many-to-many relationship 多对多关系 (for database)
many-to-one relationship  多对一关系 (for database)
marshal  列集
Matching 匹配
Matrix Multiplication 矩阵乘法
Medial-Axis Transformation 中轴变换
Median and Selection 中位数
member   成员
member access operator    成员取用运算子(有dot和arrow两种)            
member function           成员函数
member initialization list成员初始值列表
memberwise  以member为单元…、members 逐一…           
memberwise copy 
memory      内存
memory leak 内存泄漏
menu     菜单
message  消息
message based  基于消息的
message loop   消息环
message queuing消息队列
metadata 元数据
metaprogramming元编程
method 方法
micro  微
middle tier 中间层
middleware  中间件
MIME Multipurpose Internet Mail Extension 多用途 Internet 邮件扩展
Minimum Spanning Tree 最小生成树
Minkowski Sum Minkowski和
modeling    建模
modeling language 建模语言
modem     调制解调器
modifier  修饰字、修饰符
module    模块
most derived class最底层的派生类
Motion Planning 运动规划
mouse   鼠标
multi-tasking   多任务
multi-thread    多线程
multicast delegate 组播委托、多点委托
multidimensional OLAP (MOLAP)    多维OLAP(MOLAP) (for database)
multithreaded server application 多线程服务器应用程序
multiuser       多用户
mutable 可变的
mutex   互斥元、互斥体
named parameter    命名参数
named pipe  命名管道
namespace   名字空间、命名空间
native      原生的、本地的
native code 本地码、本机码
Native Image Generator (NGEN)本地映像生成器
Nearest Neighbor Search 最近点对查询
nested class  嵌套类
nested query  嵌套查询 (for database)
nested table  嵌套表 (for database)
network       网络
network card  网卡
Network Flow 网络流
nondependent name
Numerical Problems 数值问题
object        对象
object based  基于对象的
object file   目标文件
object model  对象模型
object oriented 面向对象的
object pooling  对象池化
ODBC data source ODBC数据源 (for database)
ODBC driver      ODBC驱动程序 (for database)
ODR (one-definition rule)
OLE Automation objects   OLE自动化对象 (for database)
OLE Automation server    OLE自动化服务器 (for database)
OLE DB consumer  OLE DB使用者 (for database)
OLE DB for OLAP  用于OLAP的OLE DB (for database)
OLE DB provider  OLE DB提供者 (for database)
one-to-many relationship 一对多关系 (for database)
one-to-one relationship  一对一关系 (for database)
online analytical processing (OLAP)    联机分析处理(OLAP) (for database)
online redo log     联机重做日志 (for database)
online transaction processing (OLTP)   联机事务处理(OLTP) (for database)
Open Data Services (ODS)   开放式数据服务(ODS) (for database)
Open Database Connectivity (ODBC) 开放式数据库连接(ODBC) (for database)
operand   操作数
operating system (OS) 操作系统
operation  操作
operator   操作符、运算符
optimizer  优化器
option     选项
outer join 外联接 (for database)
overflow   上限溢位(相对于underflow)                   
overhead   额外开销
overload   重载
overload resolution   重载决议
overloaded function   重载的函数
overloaded operator  被重载的操作符
override   覆写、重载、重新定义
package    包
packaging  打包
palette    调色板
parallel   并行
parameter  参数、形式参数、形参
parameter list 参数列表
parameterize   参数化
parent class   父类
parentheses    圆括弧、圆括号
parse    解析
parser   解析器
part     零件、部件
partial specialization 局部特化
pass by address   传址(函式引数的传递方式)(非正式用语)        
pass by reference 传地址、按引用传递
pass by value 按值传递
pattern       模式
PDA (personal digital assistant)个人数字助理
PE (Portable Executable) file   可移植可执行文件
performance   性能
persistence   持久性
PInvoke (platform invoke service) 平台调用服务
pixel  像素
placeholder 占位符
placement delete
placement new   
Planarity Detection and Embedding 平面性检测和嵌入
platform    平台
POD (plain old data (type))        
POI (point of instantiation)                
Point Location 位置查询
pointer  指针
poll     轮询
Polygon Partitioning 多边形分割
polymorphism  多态
pooling  池化
pop up     弹出式
port       端口
postfix    后缀
precedence 优先序(通常用于运算子的优先执行次序)        
prefix     前缀
preprocessor    预处理器
primary key (PK)主键(PK)  (for database)
primary table   主表 (for database)
primary template原始模板
primitive type  原始类型
print      打印
printer    打印机
Priority Queues 堆
procedural 过程式的、过程化的
procedure  过程
process    进程
profile    评测
profiler   效能(性能)评测器
program    程序
programmer 程序员
programming编程、程序设计
progress bar 进度指示器
project    项目、工程
property   属性
protocol   协议
pseudo code伪码
qualified  经过资格修饰(例如加上scope运算子)           
qualified name
qualifier 修饰符
quality   质量
queue     队列
race condition 竞争条件(多线程环境常用语)
radian         弧度
radio button   单选按钮
raise          引发(常用来表示发出一个exception)           
random number  随机数
Random Number Generation 随机数生成
range   范围、区间
Range Search 范围查询
rank    等级
raw     未经处理的
re-direction  重定向
readOnly只读
record  记录 (for database)
recordset  记录集 (for database
recursion —— 递归
recursive  递归
refactoring   重构
refer     引用、参考
reference 引用、参考
reference counting引用计数
referential integrity (RI)引用完整性(RI) (for database)
reflection   反射
refresh data 刷新数据 (for database)
register     寄存器
regular expression  正则表达式
relational database 关系数据库
remote         远程
remote request 远程请求
represent      表述,表现
resolution     解析过程
resolve        解析、决议        
result set     结果集 (for database)
retrieve data  检索数据  
return         返回
return type    返回类型
return value   返回值
revoke       撤销
right outer join  右向外联接 (for database)
robust       健壮
robustness   健壮性
roll back    回滚 (for database)
roll forward 前滚 (for database)
routine      例程
row          行 (for database)
row lock     行锁 (for database)
rowset       行集 (for database)
RPC (remote procedure call)RPC(远程过程调用)
runtime 执行期、运行期、执行时、运行时
rvalue  右值
Satisfiability 可满足性
save    保存
savepoint  保存点 (for database)
SAX (Simple API for XML)
scalable  可伸缩的、可扩展的
schedule  调度
scheduler 调度程序
schema    模式、纲目结构
scope     作用域、生存空间
scope operator 生存空间操作符
scope resolution operator 生存空间解析操作符
screen   屏幕
scroll bar滚动条
SDK (Software Development Kit)软件开发包
sealed class 密封类
search    查找
Searching 查找
semantics 语义
semaphore 信号量
sequential container序列式容器
serial    串行
serialization/serialize 序列化
server    服务器、服务端
server cursor服务端游标、服务器游标 (for database)
session      会话 (for database)
Set and String Problems 集合与串的问题
Set Cover 集合覆盖
Set Data Structures 集合
Set Packing 集合配置
setter       设值函数
Shape Similarity 相似多边形
shared lock  共享锁 (for database)
Shortest Common Superstring 最短公共父串
Shortest Path 最短路径
sibling      同级
side effect  副作用
signature    签名
Simplifying Polygons 多边形化简
single-threaded  单线程
slider滑块
slot  槽
smart pointer 智能指针
SMTP (Simple Mail Transfer Protocol)   简单邮件传输协议
snapshot       截屏图
snapshot       快照 (for database)
SOAP (simple object access protocol)   简单对象访问协议
software      软件
Solving Linear Equations 线性方程组
Sorting 排序
source code   源码、源代码
specialization 特化
specification  规范、规格
splitter       切分窗口
SQL (Structured Query Language)  结构化查询语言 (for database)
stack  栈、堆栈
stack unwinding   叠辗转开解(此词用于exception主题)         
standard library  标准库       
standard template library 标准模板库
stateless 无状态的
statement 语句、声明
static cursor 静态游标 (for database)
static SQL statements 静态SQL语句 (for database)
status bar 状态条
Steiner Tree Steiner树
stored procedure 存储过程 (for database)
stream   流
string   字符串
String Matching 模式匹配
stub     存根
subobject子对象
subquery 子查询 (for database)
subroutine  子例程
subscript operator 下标操作符
subset   子集
subtype  子类型
support  支持
suspend  挂起
symbol   记号
syntax   语法
system databases   系统数据库 (for database)
system tables      系统表 (for database)
table       表 (for database)
table lock  表锁 (for database)
table-level constraint 表级约束 (for database)
tape backup  磁带备份 (for database)
target  标的,目标
task switch  工作切换             
TCP (Transport Control Protocol)       传输控制协议
template       模板
template argument deduction      模板参数推导
template explicit specialization 模板显式特化
template parameter   模板参数
template template parameter
template-id
temporary object 临时对象
temporary table  临时表 (for database)
text 文本
Text Compression 压缩
text file   文本文件
thin client 瘦客户端
third-party 第三方
thread      线程
thread-safe 线程安全的
throw 抛出、引发(常指发出一个exception)      
token 符号、标记、令牌(看场合)
Topological Sorting 拓扑排序
trace 跟踪
transaction 事务 (for database)
transaction log  事务日志 (for database)
transaction rollback  事务回滚 (for database)
transactional replication  事务复制 (for database)
Transitive Closure and Reduction 传递闭包
translation unit 翻译单元
Traveling Salesman Problem 旅行商问题
traverse 遍历
Triangulation 三角剖分
trigger  触发器 (for database)
tuple
two-phase commit 两阶段提交 (for database)
two-phase lookup 两阶段查找
type  类型
UDDI(Universary Description, Discovery and Integration)统一描述、查询与集成
UML (unified modeling language)统一建模语言
unary function 单参函数
unary operator 一元操作符
unboxing       拆箱、拆箱转换
underflow      下限溢位(相对于overflow)
Unicode 统一字符编码标准,采用双字节对字符进行编码
Union query    联合查询 (for database)
UNIQUE constraints  UNIQUE约束 (for database)
unique index   唯一索引 (for database)
unmanaged code 非受控代码、非托管代码
unmarshal      散集
unqualified     未经限定的、未经修饰的
URI (Uniform Resource identifier) 统一资源标识符
URL (Uniform Resource Locator)    统一资源定位器
user            用户
user interface  用户界面
value types 值类型
variable 变量
vector   向量(一种容器,有点类似array)               
VEE (Virtual Execution Engine)虚拟执行引擎
vendor  厂商
Vertex Coloring 点染色
Vertex Cover 点覆盖
viable   可行的
video    视频
view    视图 (for database)
view     视图
virtual function  虚函数
virtual machine   虚拟机
virtual memory    虚拟内存
Voronoi Diagrams Voronoi图
vowel          元音字母
Web Services   web服务     
WHERE clause   WHERE子句 (for database)
wildcard characters 通配符字符 (for database)
wildcard search     通配符搜索 (for database)
window              窗口
window function     窗口函数
window procedure    窗口过程
Windows authentication Windows身份验证
wizard  向导
word    单词
word processor  字处理器
wrapper      包装、包装器
write enable 写启用 (for database)
write-ahead log 预写日志 (for database)
write-only      只写
WSDL (Web Service Description Language)Web Service描述语言
XML (eXtensible Markup Language)  可扩展标记语言
XML Message Interface (XMI)       XML消息接口
XSD (XML Schema Definition)       XML模式定义语言
XSL (eXtensible Stylesheet Language) 可扩展样式表语言
XSLT (eXtensible Stylesheet Language Transformation)可扩展样式表语言转换
xxx based     基于xxx的
xxx oriented  面向xxx

发表于 hangwire 阅读(5099) | |  


--------------------next---------------------

abstract data type 抽象数据类型
activity on edge AOE网
activity on vertex AOV网
adjacency list 邻接表
adjacency matrix 邻接矩阵
adjacency multilist 邻接多重表
adjacent edge 相邻边
adjacent vertex 相邻顶点
ancestor 祖先
arc 弧
array 数组
articulation point 连接点
atomic data type 基本数据类型
augmenting path 增广路径
augmenting path graph 增广路径图
average search length 平均查找长度
balance merging sort 平衡归并排序
balance two-way merging 二路平衡归并排序
banlanced binary tree 平衡二叉树
biconnected graph 重连通图
binary search 二分查找
binary search tree 二叉查找树
binary sort tree 二叉排序树
binary tree 二叉树
bipartite graph 二部图
blank string 空白(空格)串
block search 分块查找
bottom 栈底
brother 兄弟
children 孩子
circular linked list 循环链表
cirular queue 循环队列
column major order 以列为主的顺序分配
complete binary tree 完全二叉树
complete graph 完全图
connected component 连通分量
connected graph 连通图
critical path 关键路径
cycle 回路(环)
data abstraction 数据抽象
data element 数据元素
data item 数据项
data object 数据对象
data type 数据类型
decision tree 判定树
deletion 删除
dense graph 稠密图
depth 深度
deque(double-ended queue) 双端列表
descentdant 子孙
destination 终点
digital analysis method 数字分析法
digital search tree 数字查找树
digraph(directed graph) 有向图
diminishing increment sort 随小增量排序
direct access file 直接存取文件
directed acyclic graph 有向无环图
directory structure 目录结构
division method 除法
doubly linked list 双向链表
doubly linked tree 双链树
edge 边
external sort 外部排序
file 文件
first-out list 先进先出表(队列)first-in
first-out list 后进先出表(队列)last-in
fixed-aggregate data type 固定聚合数据类型
folding method 折叠法
forest 森林
front 队头
full binary tree 满二叉树
generalized list 广义表
grabh 图
hash funticion 散列函数
hash search 散列查找
hash table 散列表
head 弧头
head node 头结点
head pointer 头指针
heap sort 堆排序
Huffman tree 哈夫曼树
immediate predecessor 直接前趋
immediate successor 直接后继
immediately allocating method 直接定址法
incident edge 关联边
indegree 入度
indexed file 索引文件
indexed non-sequential file 索引非顺序文件
indexed sequential file 索引顺序文件
initial node 初始结点
inorder traversal 中序遍历
insertion 插入
insertion sort 插入排序
internal sort 内部排序
inverted file 倒排文件
leaf 叶子
level 层次
linear linked list 线性链表
linear list 线性表
linear structure 线性结构
link 链
link field 链域
linked list 链表
logical structure 逻辑结构
master file 主文件
matching 匹配
matrix 矩阵
maximum matching 最大匹配
merge sort 归并排序
mid-square method 平方取中法
minimum(cost)spanning tree 最小(代价)生成树
multi-dimentional array 多维数组
multilinked list 多重链表
multilist file 多重链表文件
node 结点
nonlinear structure 非线性结构
ordered pair 有序对
ordered tree 有序数
orthogonal list 十字链表
outdegree 出度
overflow 上溢
parents 双亲
partical order 偏序
path 路径
phyical structure 物理结构
ployphase merging sort 多步归并排序
pointer 指针
pointer field 指针域
pop 弹出
postorder traversal 后序遍历
predecessor 前趋
preorder traversal 先序遍历
push 压入
queue 队列
quick sort 快速排序
radix sort 基数排序
random number method 随机数法
rear 队尾
replacement selection sort 置换选择排序
root 根
row major order 以行为主的顺序分配
search (sequential search) 线性查找(顺序查找)linear
searching 查找,线索
searching 查找
selection sort 选择排序
sequential file 顺序文件
shortest path 最短路径
simple cycle 简单回路
simple path 简单路径
single linked list 单链表
sink 汇点
sort 排序
sorting 排序(分类)
source 源点
spanning forest 生成森林
spanning tree 生成树
spares graph 稀疏图
sparse matrix 稀疏矩阵
stack 栈
string 空串(零串)null
string 串
string 串
strongly connected graph 强连通图
subgraph 子图
substring 子串
subtree 子树
successor 后继
symmetric matrix 对称矩阵
tail 弧尾
tail pointer 尾指针
terminal node 终端结点
threaded binary tree 线索二叉树
top 栈定
topological order 拓扑有序
topological sort 拓扑排序
transposed matrix 转置矩阵
traversal of tree 树的遍历
traversing binary tree 遍历二叉树
traversing graph 遍历图
tree 树
tree index 树型索引
truangular matrix 三角矩阵
unconnected graph 非连通图
underflow 下溢
undigraph(undirected graph) 无向图
unordered pair 无序对
unordered tree 无序数
updating 更新
variable-aggregate data type 可变聚合数据类型
vertex 顶点
weakly connected graph 弱连通图
weight 权
weighted graph 加权图

发表于 hangwire 阅读(3680) | |  


--------------------next---------------------

Approximate String Matching 模糊匹配
Arbitrary Precision Arithmetic 高精度计算
Bandwidth Reduction 带宽压缩
Bin Packing 装箱问题
Calendrical Calculations 日期
Clique 最大团
Combinatorial Problems 组合问题
Computational Geometry 计算几何
Connected Components 连通分支
Constrained and Unconstrained Optimization 最值问题
Convex Hull 凸包
Cryptography 密码
Data Structures 基本数据结构
Determinants and Permanents 行列式
Dictionaries 字典
Discrete Fourier Transform 离散Fourier变换
Drawing Graphs Nicely 图的描绘
Drawing Trees 树的描绘
Edge and Vertex Connectivity 割边/割点
Edge Coloring 边染色
Eulerian Cycle / Chinese Postman Euler回路/中国邮路
Factoring and Primality Testing 因子分解/质数判定
Feedback Edge/Vertex Set 最大无环子图
Finite State Machine Minimization 有穷自动机简化
Generating Graphs 图的生成
Generating Partitions 划分生成
Generating Permutations 排列生成
Generating Subsets 子集生成
Graph Data Structures 图
Graph Isomorphism 同构
Graph Partition 图的划分
Graph Problems -- hard 图论-NP问题
Graph Problems -- polynomial 图论-多项式算法
Hamiltonian Cycle Hamilton回路
Independent Set 独立集
Intersection Detection 碰撞测试
Job Scheduling 工程安排
Kd-Trees 线段树
Knapsack Problem 背包问题
Linear Programming 线性规划
Longest Common Substring 最长公共子串
Maintaining Line Arrangements 平面分割
Matching 匹配
Matrix Multiplication 矩阵乘法
Medial-Axis Transformation 中轴变换
Median and Selection 中位数
Minimum Spanning Tree 最小生成树
Minkowski Sum Minkowski和
Motion Planning 运动规划
Nearest Neighbor Search 最近点对查询
Network Flow 网络流
Numerical Problems 数值问题
Planarity Detection and Embedding 平面性检测和嵌入
Point Location 位置查询
Polygon Partitioning 多边形分割
Priority Queues 优先队列
Random Number Generation 随机数生成
Range Search 范围查询
rate of convergence  收敛速度
robustness  鲁棒性
Satisfiability 可满足性
Searching 查找
Set and String Problems 集合与串的问题
Set Cover 集合覆盖
Set Data Structures 集合
Set Packing 集合配置
Shape Similarity 相似多边形
Shortest Common Superstring 最短公共父串
Shortest Path 最短路径
Simplifying Polygons 多边形化简
Solving Linear Equations 线性方程组
Sorting 排序
Steiner Tree Steiner树
String Matching 模式匹配
Text Compression 压缩
Topological Sorting 拓扑排序
Transitive Closure and Reduction 传递闭包
Traveling Salesman Problem 旅行商问题
Triangulation 三角剖分
Vertex Coloring 点染色
Vertex Cover 点覆盖
Voronoi Diagrams Voronoi图

发表于 hangwire 阅读(5267) | |  


--------------------next---------------------

VI高级命令集锦

鉴于大家在使用VI 的时候有一定的陌生,在这里借花献佛,从兄弟版[SHELL]中整理出以下关于VI编程的高级技巧,希望对大家学习UNIX有所帮助,并希望大家能结合使用HPUX的心得体会对这些经验进行进一步的扩展。

1.交换两个字符位置

xp
2.上下两行调换
ddp
3.把文件内容反转
:g/^/m0/       (未通过)

4.上下两行合并
J
5.删除所有行
dG
6.从当前位置删除到行尾
d$
7.从当前位置复制到行尾
y$ 如果要粘贴到其他地方 p 就可以了

由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态
8.
:ab string strings
例如 ":ab usa United States of America" ,
当你在文见里插入 usa 时
United States of America 就蹦出来了
9.
:map keys new_seq
定义你当前 键盘命令
10.
:set [all]
vi or ex  的编辑状态
如 显示每行 :set nu
11.
在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的
下面。

12.
单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S

13.

 :%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串 
 
14.光标控制

k:上移 nk 上移n行
j:下移 nj 下移n行

将光标移到第n行,按下 mk
将光标移到第m行,按下 "ay'k
即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等

这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用

想粘贴到某处,直接将光标移到某地,按下 ‘ap 即可,以此类推,b,c........寄存器等

在当前屏幕中
H 跳到第一行
M 跳到中间一行
L 跳到最后一行

15.
表8-2 删除命令
删除命令操作
d l 删除当前字符(与x命令功能相同)
d 0 删除到某一行的开始位置
d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
d w 删除到某个单词的结尾位置
d 3 w 删除到第三个单词的结尾位置
d b 删除到某个单词的开始位置
d W 删除到某个以空格作为分隔符的单词的结尾位置
d B 删除到某个以空格作为分隔符的单词的开始位置
d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d 4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d } 删除到某个段落的结尾位置
d { 删除到某个段落的开始位置
d 7 { 删除到当前段落起始位置之前的第7个段落位置
d d 删除当前行
d /t e x t 删除从文本中出现“ t e x t”中所指定字样的位置,一直向前直到下一个该字样所出现的
位置(但不包括该字样)之间的内容
d fc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括
该字符)之间的内容
d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容
D 删除到某一行的结尾
d $ 删除到某一行的结尾
5 d d 删除从当前行所开始的5行内容
d L 删除直到屏幕上最后一行的内容
d H 删除直到屏幕上第一行的内容
d G 删除直到工作缓存区结尾的内容
d 1 G 删除直到工作缓存区开始的内容

修改命令操作
c l 更改当前字符
c w 修改到某个单词的结尾位置
c 3 w 修改到第三个单词的结尾位置
c b 修改到某个单词的开始位置
c W 修改到某个以空格作为分隔符的单词的结尾位置
c B 修改到某个以空格作为分隔符的单词的开始位置
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
c 0 修改到某行的结尾位置
c) 修改到某个语句的结尾位置
c 4) 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c } 修改到某个段落的结尾位置
c { 修改到某个段落的开始位置
c 7 { 修改到当前段落起始位置之前的第7个段落位置
c tc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
c c 修改当前行
5 c c 修改从当前行所开始的5行内容

 .重复上一次修改! 

表8-4 替换命令
替换命令操作
s 将当前字符替换为一个或多个字符
S 将当前行替换为一个或多个字符
5 s 将从当前字符开始的5个字符替换为一个或多个字符

vi替换使用规则:
:g/s1/s/s2/s3/g
第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换
s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串

16.

fx
往右移动到 x 字符上
Fx
往左移动到 x 字符上
tx
往右移动到 x 字符前
Tx
往左移动到 x 字符后
(注意:以上四个命令中,其中x是键入的字符)
;
分号,配合 f 和 t 使用,重复一次
,
逗号,配合 f 和 t 使用,反方向重复一次

17. vi 环境选项  Solaris ksh

noautoindent            nomodelines                     noshowmode
autoprint               nonumber                        noslowopen
noautowrite             nonovice                        tabstop=8
nobeautify              nooptimize                      taglength=0
directory=/var/tmp      paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags
noedcompatible          prompt                          tagstack
noerrorbells            noreadonly                      term=vt100
noexrc                  redraw                          noterse
flash                   remap                           timeout
hardtabs=8              report=5                        ttytype=vt100
noignorecase            scroll=11                       warn
nolisp                  sections=NHSHH HUuhsh+c         window=23
nolist                  shell=/bin/ksh                  wrapscan
magic                   shiftwidth=8                    wrapmargin=0
mesg                    noshowmatch                     nowriteany
 

For C-Shell:
setenv EXINIT "set nu"
For Bourne or Korn Shell:
EXINIT="set nu"; export EXINIT
For Korn Shell Only (alternate method):
typeset -x EXINIT="set nu"
在 .profile 里设置 vi 的环境选项 , 以上均测试过

18.标记文本

  mchar   用字母char标记当前光标的位置
  `char   移至char所标记处
  'char   移至char标记所在行的开头处
  "     移至当前行上一次所在位置(在光标移动之后)――一个双引号
  ''    移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号

19.
同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。
但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,
屏幕底部仍然显示目前vi的是刚才的文件。
(在HP-UX,Solaris,AIX上通过)

也可以使用:
:e#
进行切换

20.
sco 下VI 要在文本前同样的字符加用
%s/^/要加的内容/g      要在文本后同样的字符加
%s/$/要加的内容/g 

21.
如何去掉文本中的 ^M 硬回车?不必用binary传回去再ascii传回来的方式,用shell或者unix语句实现。

cat filename |tr -d '/015' >newfile
不同的unix系统还存在一些其他不同的命令,如:doscp
sed 也可以实现这个功能.

dos2unix filename filename2
反之
unix2dos filename filename2

在vi 中用:$s/^M//g
^是crtl-V crtl-M 

22.如何在“unix命令行”下将一个文件的某字符串用另一个串换掉

 sed 's/string1/string2/gp' file1 > file2
 
23.将/etc/hosts下所有的地址都ping 2次

    1  #/usr/bin/sh
    2  #grad /etc/hosts and ping each address
    3  cat /etc/hosts|grep -v '^#' | while read LINE
    4  do
    5   ADDR=`awk '{print $1}'`
    6  for MACHINE in $ADDR
    7   do
    8     ping  $MACHINE -n 2
    9   done
   10  done

发表于 hangwire 阅读(4530) | |  


--------------------next---------------------

  如果技术可以作为见证,如果程序员的生涯可以稍作驻留,那么时间的消逝便不会如此令人无限惆怅……。在漫长的时间河流中,技术仅仅是一个瞬间,直到今天为止,还没有人能看穿隐藏在时间背后的迷,唉!一切都发生得如此之快。在我们身后,是谁编写着无以计数的代码,是谁丢失在时间迷宫之中不知白天黑夜,我们从哪里来?我们要到哪里去?我们是这星球上的寂寞高手……
  2004,VCKBASE的风景线是如此炫目,从 MSDN MTT 到博客园地;从五周年精华版到高校开发大赛;从GUN/LINUX到EMBEDDED SYSTEM;从技术英语到……——我们正在进行不懈的努力——技术——就要拒绝平庸。
  听说北方连续几日大雪纷飞,飘飘洒洒,如果这是一个辞旧时刻,那么肯定更是一个好的迎新兆头,可惜身在南国却没有这么幸运能感受到飞雪,真的好多年都没有体验过下雪的滋味了。感谢所有关心和热爱VCKBASE 的朋友们,我每天都能在BBS中体会到你们的其乐融融,你们的嘻笑怒骂……,我真的好开心,因为 VCKBASE 不仅仅是技术,这里还有许许多多各种各样版本的感情故事,我不知道2004 在VCKBASE BBS里成就了几对有情人,但我真心祝福你们和和睦睦,幸福美满。愿所有 VCKBASE 有情人终成眷属。
  技术所具有的生命力常常体现在当你忽视它时,你就会因此而被人忽视。技术需要保持强烈的好奇心,把握住属于自己的一切,脚踏实地,不断学习,勤奋努力,只有经过炼狱的人,才能从平庸中升华。其实,我们的创造性活动与我们期望的生活方式一样,无论开发什么应用系统,无论采用何种设计模式,无论使用哪种体系结构,无论借助何种编程语言,都应该选择适合自己的,而不要盲目跟随潮流。
  感谢一直以来喜欢我,关心我甚至是和我交心的朋友,感谢你们给我带来的快乐。你们就像我生活中的朋友,那样的真实而亲切!此时此刻,对于一个喜欢怀旧的人来说,过去好像总比现在更美,我愿意与你们一起分享我2004 年所有的快乐以及2005年所有的喜悦,如果你也愿意与我分享快乐和喜悦,那么请来吧,在这里,一起说一声:2004,让我再看你一眼!!

 

 

原文:http://blog.chinaunix.net/u2/85974/showart_1428918.html