编辑推荐

适读人群:所有IT人士,程序设计/C++开发
对于严肃的C++程序员来说,《C++语义和性能分析》是一部推荐之作!《C++语义和性能分析》作者有20多年的C++开发经验,在微软公司总部工作期间,用C++参与开发过包括WindowsXP系统在内的许多知名商用软件系统,在C++语言上有着深厚的功底。他在书中力求以新的视角,给读者展现C++语言的基本理念和发展主线,读者如果能够理解《C++语义和性能分析》的精髓,会大大提升对C++的掌握程度,更不会为C++11以来的新的思想和新的语言构造而感到惊讶和力不从心。
在《C++语义和性能分析》即将出版之际,C++17也在2017年年初得到C++委员会的通过,并且即将正式颁布。深入理解书中相关内容,对理解C++11以来的一系列新思想,会有“似曾相识”的感受。C++11到C++17的新构造,都没有脱离C++类型系统的主体思想。熟读《C++语义和性能分析》可以作为学习C++17的前奏。

内容简介

C++语义和性能分析》从C++的发展历史、类型系统、语义以及性能的视角,给读者展现了C++语言的基本理念和发展主线。一方面用抽象的理论框架,比如集合论、有限自动机、类型和类型系统等诠释了C++的理论方面;另一方面又从语义着手,从底层操作剖析了C++的实现方法。使读者既能站得高、看得远,又能把握C++的实质,从而全面掌握C++语言。
C++语义和性能分析》作者有20多年的C++开发经验,在微软总部工作期间,用C++参与开发过包括WindowsXP系统在内的许多知名商用软件系统,在C++语言上有着深厚的功底。在《C++语义和性能分析》作者看来,理解C++的精髓和灵魂,必须从C++类型系统着手,这样才能写出性能优异而又易于维护的系统。另外,从C++11到C++17的新构造,都没有脱离C++类型系统的主体思想。熟读《C++语义和性能分析》可以作为学习C++17的前奏。

作者简介

杨镰,1985年毕业于华中工学院计算机系。1988年赴美留学,获波特兰州立大学计算机科学硕士学位。1995年加盟微软总部,在微软研究院从事软件安全和性能研发方面的工作。在微软工作的15年里,他先后参加了WindowsVista、WindowsServer2008、MSN以及Bing的研发,在软件工程、软件性能优化、软件安全等领域有很深厚的功底和实践。他在不同的国际会议上发表了多篇论文,内容涉及软件工程、机器学习和高级语言。在繁忙的工作之余,他是滑雪高手,对如何提高滑雪板的性能也颇有研究。

精彩书评

——这是一本很特别的书,特别在于这是由一个有多年从事计算机开发的工程师,带着对生活和哲学的思考写出的专业书,具有努力实践科学和人文融合的味道;同时作者又兼具中国和美国的计算机高等教育及工业界工作的背景,使此书又有了努力实践中西文化融合的味道。
——作者对机器、程序、程序语言和语言理论的内在关系看得比较清楚,能够在这么多的层次之间跨越很不容易,这使《C++语义和性能分析》具有一定的哲学上的广度和逻辑上的一致性,相信此书会对有心的中国IT人士带来启发!

目录

目录



第1章C++简史1
1.1C++的历史背景1
1.2C++大事记5
1.2.11979年:Cwithclasses诞生5
1.2.21983年8月:C++正式命名6
1.2.31986年:《TheC++ProgrammingLanguage》出版7
1.2.41987年:C++2.0发布7
1.2.51990年:《TheAnnotatedC++ReferenceManual》出版8
1.2.61994年:STL诞生8
1.2.71998年:ISOC++正式通过9
1.2.82011年:C++11颁布9
1.3C++的进化和改进理念10
1.4C++的历史贡献及未来11
第2章程序设计语言的语义14
2.1哲学基础14
2.2语义的形式化描述14
2.3操作性语义16
2.4语义描述涉及的主要元素17
第3章C++类型系统19
3.1类型系统简介19
3.2数据类型的表达规则21
3.2.1基本数据类型的表达规则22
3.2.2用户自定义类型的表达规则23
3.3类型实例的构造规则25
3.3.1类型和类型实例25
3.3.2类型实例的构造和析构27
3.4类型的操作规则33
3.4.1context33
3.4.2函数34
3.4.3过程35
3.4.4过程函数35
3.4.5方法36
3.4.6特别讨论:过程方法的自动机诠释37
3.4.7运算符38
3.5C++类型系统的特征39
3.5.1特征1:支持OOP39
3.5.2特征2:强静态类型40
3.5.3特征3:UDT是一等公民41
3.5.4特征4:类型清除45
3.5.5特征5:支持模板49
3.5.6特征6:指针和REF53
3.5.7特征7:类型修正符60
3.6其他(非C++)类型系统62
3.7类型系统的意义和用途62
3.7.1程序的精确性保障62
3.7.2性能的可保障性64
第4章C++变量语义66
4.1变量简介66
4.2C++变量的属性68
4.2.1C++变量的存储属性68
4.2.2C++变量的值语义95
4.2.3C++变量的自洽性106
4.2.4C++变量的总分性109
4.2.5C++变量的多态性112
4.3临时变量113
第5章C++对OOP的支持116
5.1object的内存布局117
5.2继承119
5.2.1继承object的内存布局123
5.2.2多继承128
5.2.3继承类object的语义规则130
5.3多态类和多态变量137
5.4C++对抽象的支持139

第6章C++性能分析141
6.1性能分析原理141
6.2算法的重要性149
6.3RAM内存读取的性能153
6.3.1单线程heap管理器154
6.3.2定制化heap管理系统157
6.4关于缓存164
6.5关于I/O175
6.6C++的特殊性能问题176
6.6.1临时变量的性能问题176
6.6.2STL容器180
6.6.3TypeErasure185
6.6.4异常处理187
6.6.5继承的性能问题194
6.6.6直接函数、间接函数、内联函数200
参考文献204

精彩书摘

C++的现状
C++从1979年的开始构思到《C++语义和性能分析》的写作(2016年)之时,已经有37年的历史。有趣的是,C++的历史和中国改革开放的历史非常吻合,都是从20世纪70年代末开始谋划和实施的。今天,计算机硬件的能力和20世纪80年代的相比,已经不是一个数量级了,同时,计算机软件的格局,较之20世纪80年代,也发生了惊人的变化。今天的云计算、分布式计算和大数据计算的百花齐放,也预示着真正的软件革命已经悄悄来临。
和C++语言同时代的程序设计语言,如Basic、Cobol、Pascal等,基本上已经进入程序设计历史博物馆。而在今天的系统程序设计、并行计算、服务程序、机器学习和嵌入式设备领域,C++语言仍然占有一席重要地位。这主要是因为它在性能上仍称雄于拥有诸多语言新秀的程序设计语言之林。
C++也面临着自身的问题和竞争对手的强烈挑战,其用户群在Java和JavaScript的压力下有缩小的趋势。除了特殊领域要求特殊的程序设计语言这一现实外,C++语言的复杂性和学习难度也会喧宾夺主地掩盖其强大的设计理念和语言功能。
从程序设计的发展来看,正是由于C++语言的强大和复杂这对矛盾,才催生了后来的Java、JavaScript和C#等“类C++语言”。这些语言的共性就是简化了C++语言中的复杂性,这样做虽然从某种程度上牺牲了性能和灵活性,但是推动了程序设计在普通程序员中的技能熟练度和普及度。而这些新生代计算机语言,对21世纪开启的互联网应用、移动应用、云计算等软件工程新领域做出了巨大贡献。
那么是不是可以说C++语言已经不适应今天的程序设计需求了呢?C++语言是不是已经发展到尽头了呢?
C++语言在这样强大的竞争环境里,也在1998年的标准化(ISO/IEC14882:1998)之后,10多年没有新版本出现。直到2011年,C++11的推出又给了这门“古老”的语言以年轻的面孔。C++11不是一个权宜之计的“面部拉皮”,而是继续沿着C++先哲们的既定路线,在新的程序设计环境下的革新。C++11在语法、功能和程序设计新范式的支持上,突破了自己的局限,让C++这门强大的语言更显得生机盎然。
在这个背景下,我们欣慰地见证了许多新一代程序员对C++语言兴趣的增长,这些新生代程序员的激情也激发了我撰写《C++语义和性能分析》的热情。
C++语义和性能分析》不是一本C++的入门读物,更不想穷尽C++的特征和编程技巧。我们试图从C++的历史和哲学入手,诠释它的一些重要设计决定,以及随之而来的操作语义和性能后果。《C++语义和性能分析》也并非一本OOP方法论的著作,也不涉及C++设计范式,而是尝试着从哲理及其语义这两个一高一低的层面来理解OOP,理解C++对OOP的独特贡献。
近,在参考文献[8]中,RobertHundt通过对looprecognition图论算法的实现,比较了C++、Java、Scala和GO语言的性能后指出:
在性能上,C++语言遥遥领先对手。但是,它也需要十分细致的调试工作,这其中的一些工作十分老练、精致,非一般程序员所能掌握。
从以上分析可知,C++语言在高性能计算的领域里仍独占鳌头。其简单明了的结论是:C++语言不但没有过时,而且会在GPU、大数据、人工智能等领域发挥更大的作用。
许多C++新手没有受过严格的训练,也不了解C++语言的语义和实质,这是妨碍C++语言应用更上一层楼的主要因素。因此,《C++语义和性能分析》的一个主要任务就是帮助读者从C++语言的历史、哲学和语义层面上深入理解C++,它的重点是从C++的类型系统入手,告诉你C++的精髓和进化路径,而不是教你熟悉它的语法规则。
水到渠成之后,《C++语义和性能分析》会在后一章分析C++语言的性能特征,以及一些常用的性能提升途径给出的一些可以复制的方案。希望这种分析能够提升C++“一般”程序员的实际工作能力,突破RobertHundt在上面提到的一般程序员所面临的瓶颈,并且令其尽快从“一般”上升为“专家”。
书中多数问题的论证和结论都是通过实例来阐述的。大多数实例都是笔者自己编写,并且在自己的DellPrecisionM6700Laptop上运行、测试过的。这些实例都是用VC++2012版本编写的。如果需要《C++语义和性能分析》中实例的源代码,可以通过华中科技大学出版社与笔者联系。

前言/序言

我与C++
1988年,我在美国波特兰州立大学(PSU)攻读计算机科学硕士学位时,第yi次接触到C++语言。当时,我的导师是波兰裔,名叫博卡斯基(MarekPerkowski,http://www.pdx.edu/profile/marek-perkowski)。他研究机器人和设计自动化(designautomation)理论,喜欢“人工智能”领域里颇受青睐的Lisp程序设计语言,因此他也把对Lisp这种优美、简洁的语言的欣赏传递给了他的研究生们。我也开始使用Lisp语言,常常能感受到这种语言的数学美和惊人的抽象能力。
在PSU那种松散的学术氛围中,不同的声音是一件平常的事情:博士候选人大卫?史密斯在一次讨论时说:
OOP方法才是今后的方向;Functional语言(如Lisp)只能待在象牙塔里;数风流语言,还要看C++语言。
这大概是我第yi次听说C++语言,我还将信将疑。不过,不久之后发生的一件事使我终身难忘,也证实了他的观点。在计算机系举办的一次“软件五角棋”大赛中,我使用Lisp语言编写了一个五角棋程序,自认为它非常优美、智慧且简洁,所以信心百倍。可是,第yi轮就惨败给了我的对手。而对手的程序是使用C++语言编写的!惨败的原因是,相比对手的程序,我的程序反应速度实在很慢,所以失分于超时。
这件事加深了我对C++语言的印象,我决定尝试使用C++语言和OOP方法!于是在1988年的冬季,我一学期同时选了Smalltalk语言和C++语言两门课程。
从Smalltalk语言中,我认识到OOP方法的精髓。同时我也认识到Smalltalk语言在性能和实用性上的局限性;从C++语言中,我体会到OOP方法中沉淀的哲学思想与实际应用的结合,以及程序设计的艺术性和工艺性。在学习C++语言之前,我对于计算机科学的兴趣完全停留在表面。学习了C++语言之后,我惊喜地发现:C++语言让我这个不喜欢烦琐、复杂系统的计算机科学新手看到了一个充满哲理性的表达工具,能够帮助我清晰地表达自己的逻辑思维和创造性。另一方面,C++的实用性和强大的性能保障,也让我终选择了用它来做毕业论文项目。
离开学校后不久,我就进入微软公司总部的微软研究院工作,从事WindowsNT的性能研究。去微软公司面试的时间是1995年8月17日,距离Windows95的轰动性发布只有一周时间。记得面试的一个C++问题是论述“多态性(polymorphism)”是否意味着“动态绑定”。我的面试官告诉我:“C++没有动态绑定,只有静态绑定,而COM(componentobjectmodel)里才有真正的动态绑定。”我十分认真、激动地争辩道:“C++的polymorphism就是动态绑定。”两人从会议室争论到咖啡厅,然后又争论到坐落在美丽的“华盛顿湖畔”的一家意大利餐厅。晚上,当人事部门宣布面试结果时,我以为一定没戏,后悔自己太认真,不知道天高地厚。没想到我被那位面试官所在的团队——微软公司总部的微软研究院“软件性能研究中心(PPRC)”录用,而且我们一直是合作良好的同事。直到今天,我还认为我对了,他错了。但在微软公司当时的氛围里,“对”“错”并不是重要的,重要的是“激情”和“执着”。而正是这种精神和文化,将20世纪90年代的微软和世界区分开来,让软件世界的“微软时代”降临。我也有幸加入到这个世界一流公司的研发队伍中,在几个重要的产品组里,贡献了自己的青春,实现了读研时的理想。20世纪90年代,微软公司是充满活力和朝气的崛起的巨人。
记得有个朋友的儿子在美国东部一所大学读书,一次去他家过圣诞节,吃饭时他问我:“你怎么就能进微软,而我的许多朋友都进不去呢?”其实,我的真实答案是两个字:“运气”。但是我当时的回答是:“你必须每天花至少20分钟时间,读一些具体的计算机科学著作;然后至少花10分钟时间,想一些抽象的问题,比如宇宙爆炸理论的逻辑错误和量子叠加的荒谬性等,只要和技术无关就好。”因为我一直以为:如果你对哲学没有兴趣,你不可能成为一个优秀的程序员;而做一个平庸的程序员太累了,不值得!
加入微软公司后,我有机会参与到多个大型的C++项目的开发中。从WindowsNT性能测试工具到WindowsVista的安全性,以及后来的Windows2008服务器,C++都在实战中给我惊喜,但有时它也会给我带来噩梦。然而,我体会深的,就是几乎每天我都会庆幸自己又学到了新的技能和思想,这种新东西可能是技术上的,也可能是方法学上的,这种体会持续了我在微软公司工作的5000多个日日夜夜。
我发现,C++并不是一门简单、平庸的语言。正因为它的定位,它是植根于C以及VNA系统的,因此一个对VNA不清楚的程序员,是不可能掌握C++语言的。C++也并非一门在数学上有深厚根基的语言,很难像Lisp语言那样用Lambda表达式和高阶函数等概念表达C++。这其实是C++程序不容易编写好的深层原因。
在微软公司工作10多年,我接触过许多C++资深程序员,比如《深度探索C++对象模型》的作者StanLippman。我是作为VC++组的架构师,通过“发现”VC++在实现C++SPEC方面的一些错误而结识了他,并数次就C++的历史、哲学和设计模板问题与他交流。
然而,我接触更多的是C++新手,比如我带领的多个美国常春藤名校的“实习生”,现在也早已成为各部门的高级主管。即使在这样一个世界一流的软件公司里,他们中间一些人对C++语言的精神,尤其是它的语义层面上的规则,仍存在诸多的误解。一些通俗但并不精确的观点在业内长期流行:比如C++的后门很多,C++的性能较C有较大差距等。造成这些误解,一方面是由于缺乏系统性的教育和简明易懂的著作,另一方面是C++语言本身缺乏严格的数学、逻辑框架。

其他推荐