什么是高级C++?


 
——软件工业化时代的C++价值观
    孟岩
《程序员》杂志社


开门见山
主要论点:
    1. C++本质上是一种重“立异”而轻“生产”的语言,到目前为止仍然是支流语言中最适开技术立异的一个;
    2. 1995年之前,整个软件财产处于“立异为王”的阶段,C++是最适开这个阶段的语言,这是C++红极一时的大背景战根本原果。
    3. 1995年发生了一系列影响深远的事件,软件财产整体上转向工业化,为了支持工业化,立异的重点由技术立异转向体系立异。然而C++没有可以迅速适应这一变化。
   4. 今天,C++应当准确定位,弥补没有足,有针对性地发展,它将仍然是最重要的几种工业级语言之一。

从一本书说起
James Coplien,Advanced C++ Programming Styles and Idioms, Addison Wesley, 1991
—— 市里上唯逐一本名副其实的“高级”C++书(Scott Meyers)
●里向对象特性的运用战把握
●里向对象的程序气概
●静态特征的运用战超越
●符号语言模拟
●设计模式
   这本书代表了当时专家们对于“高级C++”的理解,换句话说代表了当时C++社群的一个审美价值取向。我们看到了什么?技术、技巧、气概、模式,但没有与工程相关的东西。更有意义的事情是,这本书的中文版12年后被剽窃出版,此时书中对于C++里向对象能力发挥到了我当时没有想到的程度。这阐明纵然在 template被普遍应用之前,C++语言的技巧性就达到了如此的高度。然而耐人寻味的是,书中最高深的技巧从来就没有在C++实践中流行过。
另一本书...
Scott Meyers, Effective C++ ,1991年第1版,1998年第二版,2005年第三版。
●来自教学经验
●最初想开发一个代码扫描工具
●包含实际工程建议
●历史上最重要的C++著作之一
    这本书出版的同时,还有一本在C++历史上影响更大的书问世——Scott Meyers的Effective C++。这本书并没有过多地探索语言技巧,而是探讨实践中应当遵循的规则,或者换句话说,探讨怎样在应用这种语言的同时保持软件的质量,提高开发效率。这本书的内容被整个C++社群熟知并吸收,至今仍在翻新,影响着更多的人。
照样在1991年...
●“按照1991年3月C++程序员增长的速度计算,到1996年5月,全天下每一个人都将成为C++程序员。此后我们将没有得没有教外星人学习C++。”
●问题:当时人们为何如此疯狂地学习一种新语言?
   答案很有趣:大部分人是盲从。但他们所跟随的人并非轻易之辈,几乎所有在AT&T Bell Labs、Sun、Borland、IBM、Microsoft的C语言大师都转向C++(Brain Kernighan,Jon Bentley,Peter van der Linden)。而这些人转向C++,没有是果为他们知道Effective C++,而是果为他们知道Advanced C++。什么意义呢?就是说人们转向C++,是果为C++布满了使人兴奋的新技巧战未知的立异空间。

1991年...
●5000行C代码可以写一个完整的应用程序,取得数万$的回报;
●一个TSR式的Help程序可以以shareware的体例通过磁盘发行,开发者银行户头里会收到大量汇款;
●John Carmark战Michael Abrash正在各自擅长的方向上赓续立异。Doom发行后,id取得收入一度超过微软销售额。
C++历史选择中“立异”压服“生产”
“相信程序员”;
Be an enable language;
Zero overhead;
STL投票的通过;
偏特化的引入
多继承
Generic/Generated/Meta
IOStream库的设计
Loki/Boost

counted_ptr被否决
可选GC方案被否决
参加类似delegate的对象方法指针提议未引起关注;
virtual环节字
exception机制
缺乏Thread, Network, Regex, DB...等标准库
没有ABI规范
孱弱的RTTI
    并没有是事后诸葛亮式的谴责,这就是C++的历史选择,无所谓对错。
   C++重立异轻生产,重技巧轻规范,语言上的立异试验直到1996年ANSI C++标准草案落地才结束。直到2001年Modern C++ Design出版,人们还赓续地发现新的语言运用技巧。我们每个人都经历过这个阶段,在实践中发现一个问题,千方百计用尽各种语言技巧来克服它,成则欣喜,败没有气馁。我们都曾相信,C++中一切问题都可以优雅地解决,只有想没有到,没有做没有到。问题是,从Advanced C++到Modern C++ Design,许许多多使人第一眼看上往无比惊喜的技术,最后在实践中被大范围推广运用的少之又少。C++大师们说这是教育问题,真的是如许吗?
C++社群的价值观
●用优雅的技巧解决复杂问题
●自己动手,丰衣足食
●决没有让运行时效率蒙受半点损失
●妙者为王
   “管理一群C++程序员就像放牧一群骄傲的猫。”——B. Moo
   “C++程序员是高速公路上穿着短皮茄克,带着墨镜,抽着雪茄,挥舞着铁链的英勇无畏的摩托骑士。” ——VC产物经理
1995年:转折点
●Windows 95问世:GUI时代、保护模式操作系统时代、多线程时代的到来,是推动软硬件规模迅速膨胀;
●Netscape Navigator vs. Internet Explorer: Web的兴起将人类一下子拖入互联网时代, 个人与企业应用软件网络化;
●Java诞生:提供了网络时代、跨平台时代优于C++的企业应用软件开发语言;
●COM时代到来
●Delphi诞生:立异与工程原则平衡的典范;

1995年:C++全盛时代
●C++标准草案接近完成,语言根基稳定;
●C++工具大战结束:来自商业竞争的动力消失,MFC获胜;
●很多支流软件厂商转向C++,C++起头在大范围内被用于大规模软件开发;
●一切迹象表明,软件财产的重点将有立异转向生产。但是:C++社群在指导思想上并没有发生相应的变化。

我们的历史失误
●C++社群从来没有联开起来支持任何一个跨平台的二进制组件标准(如COM/SOM/CCM)战基础库(如Apache APR、ACE OS Wrapper);
●C++社群从来没有联开起来支持任何一个跨平台的C++虚拟机、解释器、内存检测工具战错误录像工具,也从来没有促成过一个安全的库;
●Boost出现于1999-2000年,而在此之前的跨平台C++库都没有取得普遍的支持;
●钟情于用C++语法(没有管多么复杂战稀奇古怪)完成所有的任务,却丢掉了老祖宗C语言的看家法宝——Little Language;
●对于气概争论没有休,对于明显的技术进步拒没有接受,对于很多后来被证明并没有实用的技巧趋之若鹜。
    没有跨平台的基础库,就没有跨平台的静态模块加载机制;
    John Spencer夭折的书《The Art of C Programming》,GoF的Interpreter模式;Little Language实际上具有反应计算机本质的一些东西,此刻却成了很少为C++程序员所采用战熟悉的工具。

2005年,C++的理想处境
●在系统编程领域仍然强势;
●套装软件支流开发语言之一;
●嵌入式开发领域进展较快;
●游戏引擎开发主力;
●科学计算方里略有一席之地
●遗留项目的维护;
●在企业应用开发领域快速收缩;
●Web开发中的影子语言;
●从高校支流教学中退潮;
●整体水平仍然没有高,很多企业急于摆脱;
●最致命的:真正认识战熟练掌握C++的人太少;
案例:1. 国外一家公司花高薪聘人,要么能维护目前百万行规模的代码,要么把它转成Java;
          2. IBM Workplace,项目一起头C++/Java并重,之后C++比重越来越小;
          3. 微软与中国电信开作一个项目,客户端软件本来要用C++写,后来赶到产物化周期太长,改用C#,后发先至。

问题何在
●当前的软件财产发展的主要矛盾——各行各业对软件生产标准化、规模化、高质量要求与慢节奏、低效率、低质量的软件开发之间的矛盾。
●解决这个矛盾的环节:组件化体系,成熟的软件生产工具战环境,赓续的立异精神。
●C++在外部环境已经发生根本变化的近十年时间里,没有捉住这个主要矛盾。

重新评估我们的C++价值取向
    重新评估“高级C++”的理想含义:
        - 简洁有效优于惊世骇俗;
        - 开放灵活优于保守固执;
        - 帮忙他人优于凸现自己;
        - 领域立异优于卖弄技巧;

六个建议
●学会与理想战谐共处;
●尽快里向没有同领域建立跨平台构件标准;
●支持各领域已经形成的基础库赓续完善;
●支持相关工具厂商,迅速完善工具链;
●支持静态语言的发展;
●里向财产挑战立异发展;

与理想战谐共处
●承认C++只适开这个天下的一部分工作,快乐地与其他语言共同协作;
●辞行妄自尊大战保守傲慢;
●尊重其他社群的专业能力战成绩;
●坦率承认C++在很多场开并非理想选择;
●在C++擅长的领域保持锐意。

跨平台构件标准
●C++迈向未来的环节技术步骤;
●尽可以支持现有的成熟方案;
●在没有同标准的平台上可以需要没有同的标准;

支持成熟的基础库
●根基组件:STL战Boost(部分)
●网络战系统编程:ACE
●分布式计算:ICE
●GUI:Qt
●Windows:MFC/ATL/WTL
●科学计算:MTL

完善工具链
●C++用的GC;
●Code Review工具;
●内存错误排查工具;
●测试工具;
●MDA工具;
●文档工具;
●持续集成工具;
●运行录像工具。

支持静态语言
●静态语言是软件技术发展的一个重要方向,几年后会成为支流。
●目前几个流动作态语言天生与C/C++具有亲缘关系;
●加强对静态语言的友好性,是C++未来发展的一项重要任务;
●从这个角度来看待C++/CLI,我们应该持积极态度;
●Little Language问题;
bilibili
迎接财产新挑战
●多核CPU带来根本性挑战,C++有责任挺身而出,为其他语言铺平前进道路;
●安全性问题,C/C++实际上是给整个财产拖了后腿,对此我们应当充分关注,积极改进;
●将STL思想精华发扬光大。

在国际象棋中,学会如何移动棋子只能算是入门:要想掌控整个棋局,我们必须了解自己所下的每一步棋后的策略和战术。在C++中也同样如此。掌握正确的策略可以帮助我们避免常见的陷阱,并提高我们的工作效率。在本书中,C++专家Rob Murray就与我们分享了他宝贵的经验和建议,以帮助初中级C++程序员得到进一步的提高。  在本书中,作者大量采用了实际开发中的代码来作为示例,向读者展示了那些有用的编程策略,并对那些有害的做法进行了警示。为了帮助读者更好地理解,在书中的每一章结束前,在该章中被介绍过的主要内容都被放到了一个列表中,此外,书中还给出了一些问题来激励读者们进行更多的思考和讨论。 本书在一开始就向我们讲解了如何为我们的设计选择正确的抽象,提示我们注意抽象和现实之间的区别。然后,我们就将学到如何将已得到的抽象转化成一个(或多个)C++中的类,期间进行的讨论所涵盖的范围上至高层的设计策略,下至底层的接口和实现细节。   接下来本书对单继承和多重继承进行了深入的探索。一开始书中会给出一个关于它们应该用在设计的什么地方的讨论,然后就是一些详细的示例代码,用来向我们演示如何在实践中使用这些概念。对于“如何构建可派生出其他类的类”以及“这么做的好处何在”,书中还专门抽出了一章来讨论它们。   对于C++中新增的模板特性,通过从基础开始到逐步地接触实际应用中的示例,Rob Murray向我们展示了其空前的洞察力。作者同时也向我们展示了多种特定的技巧,以使我们的程序更快、重用性更高,并且更健壮。异常是C++中另外一个新增的特性,对于何时该使用它,何时不该使用它,Murray也向我们给出了他的建议。在本书的最后,我们还可以学到如何将一个项目从C移植到C++之上,书中对该过程的讨论不但包括了其中可能出现的技术问题,也包括了使用技术的“人”的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值