立足现实 与时俱进:C++ 1991-2006 partII

 

3、   1991时的C++世界

1991年,我的《C++程序设计语言》第二版出版,作为对1989年定义的《C++注解参考手册》(“ARM”)[35]的补充。这两本书设置了C++编译器的标准并且从某种程度上说设置了多年后的编程技术的标准。因此,1991被认为是C++为进入主流所做的准备的最后阶段。从那时起,团结就是主要问题,那一年,有5个编译器可供选择(AT&TBorlandGNUOregonZortech),在1992年还出现了另外三个(IBMDEC和微软)。199110月,AT&TCfront3.0发布(我原来的编译器[121])是第一个支持模板的。DECIBM的编译器都支持模板和异常,但微软的不支持,因而使鼓励程序员使用更现代化的风格的工作受挫。C++标准化的工作,开始于1989年,并在ISO的主办下正式转变成国际化的工作。然而,这跟1989年的由许多非美国人参与的组织会议并没有实质上的不同。主要的不同在于我们现在是指ISO C++而不是ANSI C++C++程序员—还有将成为C++程序员的人们—现在可以从100多种不同目标、不同范围和不同质量的书中进行选择。

基本上,1991年对于C++社区来说是普通的、成功的一年。它跟其它年份并没有什么不同。我强调1991年的理由是因为我的HOPL-II[120]对年份的描述到1991年就停止了。

3.1 ISO C++标准进程

对于C++社团,ISO标准进程是主要的:总体上,C++社团没有其它正式的中心,没有其它论坛去驱动语言的演化,没有其它组织关心语言和关心社团。C++没有自己的公司去决定语言的轨迹,从经济上支持它的发展和提供市场营销。因此,C++标准委员会成了认真考虑语言和标准库演化的地方。从更大的范围说,从1991-2006C++的演化是由委员会中的自愿者们所能够做的工作和避免令人畏惧的“由委员会设计”的程度所决定的。

1989年,ANSI C++ANSI J16)成立;它现在仍在INCITSInterNational Committee for Information Technology Standards,一个美国组织)的主办下运行。在1991年,在ISO的帮助下它成为国际化工作的一部分。其它几个国家(如法国、日本和英国)有他们自己的国家委员会主持他们自己的会议(亲自或电子化的)并派代表参加ANSI/ISO会议。直到1997C++98标准[63]的最后投票为止,委员会每年开三次为时一周的会议。现在,它每年开两次,在会议之间更依赖于通过网络交流。委员会在北美洲和欧洲或其它地方轮流召开会议,但大部分还是在欧洲召开。

J16委员会的成员是自愿者,他们必须付钱(一年大约800美元)去获得做这些工作的荣幸。因此,大部分的成员代表公司,公司愿意支付会费和旅行开销,但总有一小部分人得为自己买单。每个参加的公司都有一票,正如每一个个体,因此一个公司无法向委员会插入它的许多员工。在ISOWG21)中,代表自己国家的人们和加入国家C++小组的人们是否能获得报酬取决于他们国家的标准组织的规定。J16召集人主持技术会议和正式投票。投票过程是非常民主的。首先是在工作组中进行一次或多次的“民意调查”,作为改进提议和争取达到一致性的进程的一部分。然后是在所有委员中进行更加正式的J16投票,只有授权的成员才能投票。最后(ISO)的投票是在在每个国家的基础上完成的(per-nation basis)。目标是一致性通过,一致性的定义是大多数,因此最终的标准对于每个人都很好,但不是精确到每一个成员都喜欢。对于1997/1998的最后标准投票,ANSI投票是43-0ISO22-0。我们真的达到了一致性,甚至是全体通过。我被告知这样明确的投票是很不寻常的。

会议倾向于变得象大学组织,但是当必须对重要和有争议的决定做出抉择时,也会有紧张的时刻。例如,为export投票做准备的辩论就使得委员会很紧张(§5.2)。共同掌权对于C++来说是十分重要的。委员会是惟一的真正的开放的论坛,在这里,实现者和使用者来自不同的并且常常是朝气蓬勃的相互竞争的组织能够聚在一起并交换意见。如果没有一个由专家、个人和组织组成的密集的网状的委员会,C++将会分裂成许多方言。参加会议的人数在40120之间。显然,参加会议的人会随着会议地点中C++使用者人数(比如硅谷)或对重要事情要做出抉择(比如我们是否要采纳STL?)而增加。在1996Santa Cruz会议上,当时有105人在那个房间参加会议。

大多数的技术工作是由个体在会议之间完成或者是由工作组完成。这些工作组官方称之为“ad hoc”,并且不是常设机构。然而,有些持续了多年并一直专注于某项工作,成为委员会制度上的回忆。主要的长命的工作组有:

·核心主席:Andrew KoenigJosée LajoieBill GibbonsMike MillerSteve Adamczyk

·演化(原来的扩展)—主席Bjarne Stroustrup

·主席Mike VilotBeman DawesMattAusternHoward Hinnant

当工作特别紧张时,这些组会分成更小的专注于特定的主题的工作组。目标是提高这个过程的并行程度和更好地利用许多人所展现出来的技能。

整个委员会的官方的“主席”的主要工作是确保所有的正式的规则都被遵守和向SC22报告,他被称之为召集人。原来的召集人是Steve CarterBellCore),然后是Sam HarbinsonTartan LabsTexas Instrucments),Tom PlumPlum Hall)和Herb Sutter(微软)担任。

当整个委员会集合在一起的时候由J16的主席管理会议,Dmitri LenkovHewlett-Packard)是第一任,Steve ClamageSun)是第二任。

标准文档的草稿维护是由工程编辑者完成,第一任工程编辑者是Jonathan ShopiroAT&T)。然后1992-2004年是Andrew KoenigAT&T),而后是Pete BeckerDinkumware)。

委员会由许多具有不同兴趣、不同关注点和不同背景的人组成。有些代表他们自己,有些代表大公司;有些使用PC机,有些使用UNIX盒子,有些使用大型机;有些想让C++变得更象面向对象的语言(根据各种不同的对面向对象的定义),有些想让ANSI C成为C演化的终点。有些人有C的背景,有些则没有。有些有标准化工作的背景,而大部分人则没有。有些有计算机科学背景,有些则没有。大多数人是程序员,有些则不是。有些是语言学专家,有些则不是。有些是为终端用户服务,有些是工具提供者。有些喜欢参与大项目,有些则不喜欢;有些喜欢与C兼容,有些则不喜欢。很难找到一个能概括他们的东西。

背景的多样性有利于C++,只有多样化的组才能代表C++社团中的不同的利益。而最终的结果是比如1998年标准和技术报告(§6.1§6.2对每个人都是足够的好。而不是只是某一个小社团的理想的体现。然而,成员的多样性和规模为有建设性的讨论设置了困难并延缓了进程。特别地,这个非常开放的进程很容易被那些技术水平不够或不能理解或尊重他人观点的人破坏,部分上说,对提议的考虑就是对委员会成员的一种教育过程。有些成员宣称不完全是开玩笑他们参加讨论就是想要得到教育。我对C++使用者(C++应用程序的编程人员和设计者)的意见可能被语言专家的声音所淹没表示担忧,也可能是在语言设计者、标准委员会、编译器实现者和工具构造者等。

为获得有哪些组织出席相关的会议,下面给出1991-2005的成名名单:AppleAT&TBellcoreBorlandDECDinkumwareEdison Design Group (EDG)EricssonFujitsuHewlett-PackardIBMIndiana UniversityLos Alamos National LabsMentor GraphicsMicrosoftNECObject DesignPlum HallSiemens NixdorfSilicon GraphicsSun MicrosystemsTexas InstrumentsZortech

改变已经被广泛使用的语言定义与从第一原则开始的简单设计是非常不同的。无论何时,当我们有一个“好的想法”时,无论或大或小,我们必须牢记:

·已经有百万行代码存在大部分不会重写,不管重写能够获得多大的好处

·已经有百万的程序员存在大部分不会花时间学习新的东西除非他们认为这是必不可少的

·有些十年前的编译器仍在工作许多程序员不会使用在他们所支持的平台上编译器不支持的语言特征

·已经有数以百万的旧的教科书存在许多在未来的五年内仍将被使用

委员会考虑了这些因素,明显地给出了一个保守的倾向。除了其它东西,委员会的成员间接地对超过100百万行的代码负责(也代表了他们的组织)。许多委员会的成员促进改变,但几乎所有人都非常小心和负责任。有些成员觉得,他们的作用是避免不必要和危险的不稳定性。对于大多数成员来说,与C++的早期版本(ARM C++[35])兼容,与C的早期版本(K&R C[76])兼容和公司的各种方言兼容是一个严重的事件。我们(委员会的成员们)尝试面对将来的挑战,比如并发,但我们真的牢记C++是许多工具链的基础。破坏C++,那么JavaC#的主要编译器也会被破坏。显然地,委员会不能通过不兼容性来“破坏C++”,尽管不兼容性会破坏C++。工业界会简单地忽视一个严重的带有不兼容的标准,同时开始偏离C++

3.2 年表

1991年向前看,我们通过列出一些重要的决定(投票)可以获得某些想法:

1993       接纳运行时类型信息Porland,Oregon§ 5.1.2 ;接纳名字空间(Munich ,Germany§5.1.1

1994       string(由字符类型模板化)(圣地亚哥,加利福尼亚)

1994       STL(圣地亚哥,加利福尼亚)§4.1

1996       exportStockholmSweden§5.2

1997       对完整标准的最后一次投票(Morristown,新泽西州)

1998       ISO C++标准[63]通过

2003       技术勘误表(“中期bug修复发布”)[66]C++0x的工作开始

2004       性能技术报告[67]§6.1;库技术报告(散列表,正则表达式,智能指针等)[68]§6.2

2005       第一次关于C++0x特征的投票(Lillehammer,挪威);原则上接纳autostatic_assert和右值引用§ 8.3.2

2006       C++0x特征的第一次委员会(官方的)投票(柏林,德国)

城市名反映了会议的地点,决定是在那里做出的。他们给参与者另一种风味。当委员会在一个城市出现时,通常会有许多来自周边城市和国家的参与者。而举办者都会利用C++专家们的影响力许多是国际有名的安排演讲,增加对C++的理解和社区的标准化。第一个这样安排的是在1991年的Lund,当时瑞典代表团与Lund University合作举办了一个为期两天的专题研讨会。

这个列表给出了解决主要问题的过程的提示,尝试产生一个一致的语言和库,而不是一组无关的“巧妙的特征”。在任何时候,工作集中在许多弱联系的特定主题,比如“undefined”的定义,异常发生后是否有可能继续运行(不可以),string应该提供什么函数等。让委员会完全认可是极端困难的。

3.3 为什么改变?

察看列表上的决定并牢记委员会的内在的保守偏向,一个显然的问题是:“为什么要改变某些东西?”有些人认为 “标准化就是把已经存在的实践进行文档化”,这些人只是委员会成员的中的极少数,并且不能代表C++委员会的声音。尽管人们说他们不想要“改变“,只想要“一两个改进”。在这一点上,C++委员跟其它语言的标准化工作组非常象。

基本上,我们(委员会的成员们)想要改变是因为我们有乐观的观点,即更好的语言特征和更好的库会导致更好的代码。这里“更好”意味着“代码更可维护”、“代码更容易被阅读”、“能捕获更多的错误”、“程序运行更快”、“程序更小”、“更容易移植”等。人们的标准是不同的,有时甚至是戏剧性的不同。这种观点是乐观,因为有足够多的证据显示人们可以并且做到了在每种语言里面写非常糟糕的代码。不管怎么样,大多数程序员群体包括C++委员会都是由乐观主义所主宰。特别地,大部分C++委员们相信高质量的C++代码可能通过提供更好的语言特征和标准库设施得以改进。做这样的工作需要时间:在某些情况下也许我们必须等到新一代的程序员得到教育。然而,委员会从根本上是由乐观主义和理想主义驱动的受大量经验所节制而不是俗世的观点,只一味地给人们所要求的或提供一些“可以卖钱”的东西。

另一种观点是世界是在变化的,因此一个活的语言也是变化的每一个委员会的委员都这么说。因此,我们能够在改进上进行工作或者让其它人去做。当世界改变时,C++必须演化以面对新的挑战。另一个最明显的选择不会是“死亡”,而是但被公司所拥有,正如PascalObjective C那样,分别变成BorlandApple的公司语言。

1991年的Lund(瑞典)会议后,下面的警戒性的传说在C++社团中流行起来:

我们常常提醒自己关于轮船Vasa的故事,那时它是瑞典海军的骄傲,计划建造成有史以来最大和最漂亮的战舰。不幸的是,为了装载足够的雕像和大炮,它在建造过程中经历了重大的重新设计和扩展。结果是它在跨Stockholm港湾的途中,一阵风过后它就沉了,大约有50人遇难。这艘船已经被打捞上来,你可以从Stockholm的博物馆里看到它。它看起来非常漂亮—比它第一次扩展重新设计前漂亮得多。也比那些17世纪的战舰漂亮得多但那不能成为它的设计者、建造者和预期的使用者的安慰。

这个故事经常被提起,作为反对增加特征的预警(那就是我告诉委员会的场景)。不管怎么样,对于复杂的事物,总有另一面:如果Vasa已经完成原来的设计,当首次遇到“现代的两层甲板”的战舰,它也同样会被打得满身是洞,沉到海底。忽视世界中的改变也不是选择。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值