編輯推薦
適讀人群 :所有IT人士,程序設計/C++開發 對於嚴肅的C++程序員來說,本書是一部推薦之作!本書作者有20多年的C++開發經驗,在微軟公司總部工作期間,用C++參與開發過包括Windows XP係統在內的許多知名商用軟件係統,在C++語言上有著深厚的功底。他在書中力求以新的視角,給讀者展現C++語言的基本理念和發展主綫,讀者如果能夠理解本書的精髓,會大大提升對C++的掌握程度,更不會為C++11以來的新的思想和新的語言構造而感到驚訝和力不從心。
在本書即將齣版之際,C++ 17也在2017年年初得到C++委員會的通過,並且即將正式頒布。深入理解書中相關內容,對理解C++ 11以來的一係列新思想,會有“似曾相識”的感受。C++11到C++17的新構造,都沒有脫離C++類型係統的主體思想。熟讀本書可以作為學習C++17的前奏。
內容簡介
本書從C++的發展曆史、類型係統、語義以及性能的視角,給讀者展現瞭C++語言的基本理念和發展主綫。一方麵用抽象的理論框架,比如集閤論、有限自動機、類型和類型係統等詮釋瞭C++的理論方麵;另一方麵又從語義著手,從底層操作剖析瞭C++的實現方法。使讀者既能站得高、看得遠,又能把握C++的實質,從而全麵掌握C++語言。
本書作者有20多年的C++開發經驗,在微軟總部工作期間,用C++參與開發過包括Windows XP係統在內的許多知名商用軟件係統,在C++語言上有著深厚的功底。在本書作者看來,理解C++的精髓和靈魂,必須從C++類型係統著手,這樣纔能寫齣性能優異而又易於維護的係統。另外,從C++11到C++17的新構造,都沒有脫離C++類型係統的主體思想。熟讀本書可以作為學習C++17的前奏。
作者簡介
楊鐮,1985年畢業於華中工學院計算機係。1988年赴美留學,獲波特蘭州立大學計算機科學碩士學位。1995年加盟微軟總部,在微軟研究院從事軟件安全和性能研發方麵的工作。在微軟工作的15年裏,他先後參加瞭Windows Vista、Windows Server 2008、 MSN以及Bing的研發,在軟件工程、軟件性能優化、軟件安全等領域有很深厚的功底和實踐。他在不同的國際會議上發錶瞭多篇論文,內容涉及軟件工程、機器學習和高級語言。在繁忙的工作之餘,他是滑雪高手,對如何提高滑雪闆的性能也頗有研究。
精彩書評
——這是一本很特彆的書,特彆在於這是由一個有多年從事計算機開發的工程師,帶著對生活和哲學的思考寫齣的專業書,具有努力實踐科學和人文融閤的味道;同時作者又兼具中國和美國的計算機高等教育及工業界工作的背景,使此書又有瞭努力實踐中西文化融閤的味道。
——作者對機器、程序、程序語言和語言理論的內在關係看得比較清楚,能夠在這麼多的層次之間跨越很不容易,這使本書具有一定的哲學上的廣度和邏輯上的一緻性,相信此書會對有心的中國IT人士帶來啓發!
目錄
目錄
第1章 C++簡史 1
1.1 C++ 的曆史背景 1
1.2 C++大事記 5
1.2.1 1979年:C with classes誕生 5
1.2.2 1983年8月:C++正式命名 6
1.2.3 1986年:《The C++ Programming Language》齣版 7
1.2.4 1987年:C++2.0發布 7
1.2.5 1990年:《The Annotated C++ Reference Manual》齣版 8
1.2.6 1994年:STL誕生 8
1.2.7 1998年:ISO C++ 正式通過 9
1.2.8 2011年:C++11頒布 9
1.3 C++的進化和改進理念 10
1.4 C++的曆史貢獻及未來 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.1 context 33
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.5 C++類型係統的特徵 39
3.5.1 特徵 1:支持OOP 39
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:指針和REF 53
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.2 C++變量的屬性 68
4.2.1 C++變量的存儲屬性 68
4.2.2 C++ 變量的值語義 95
4.2.3 C++變量的自洽性 106
4.2.4 C++變量的總分性 109
4.2.5 C++變量的多態性 112
4.3 臨時變量 113
第5章 C++對OOP的支持 116
5.1 object的內存布局 117
5.2 繼承 119
5.2.1 繼承object的內存布局 123
5.2.2 多繼承 128
5.2.3 繼承類object的語義規則 130
5.3 多態類和多態變量 137
5.4 C++對抽象的支持 139
第6章 C++ 性能分析 141
6.1 性能分析原理 141
6.2 算法的重要性 149
6.3 RAM內存讀取的性能 153
6.3.1 單綫程heap管理器 154
6.3.2 定製化heap管理係統 157
6.4 關於緩存 164
6.5 關於I/O 175
6.6 C++的特殊性能問題 176
6.6.1 臨時變量的性能問題 176
6.6.2 STL 容器 180
6.6.3 Type Erasure 185
6.6.4 異常處理 187
6.6.5 繼承的性能問題 194
6.6.6 直接函數、間接函數、內聯函數 200
參考文獻 204
精彩書摘
C++ 的現狀
C++從1979年的開始構思到本書的寫作(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/IEC 14882:1998)之後,10多年沒有新版本齣現。直到2011年,C++11的推齣又給瞭這門“古老”的語言以年輕的麵孔。C++11不是一個權宜之計的“麵部拉皮”,而是繼續沿著C++先哲們的既定路綫,在新的程序設計環境下的革新。C++11在語法、功能和程序設計新範式的支持上,突破瞭自己的局限,讓C++這門強大的語言更顯得生機盎然。
在這個背景下,我們欣慰地見證瞭許多新一代程序員對C++語言興趣的增長,這些新生代程序員的激情也激發瞭我撰寫本書的熱情。
本書不是一本C++的入門讀物,更不想窮盡C++的特徵和編程技巧。我們試圖從C++的曆史和哲學入手,詮釋它的一些重要設計決定,以及隨之而來的操作語義和性能後果。本書也並非一本OOP方法論的著作,也不涉及C++設計範式,而是嘗試著從哲理及其語義這兩個一高一低的層麵來理解OOP,理解C++對OOP的獨特貢獻。
近,在參考文獻[8]中,Robert Hundt通過對loop recognition圖論算法的實現,比較瞭C++、Java、Scala和GO語言的性能後指齣:
在性能上,C++語言遙遙領先對手。但是,它也需要十分細緻的調試工作,這其中的一些工作十分老練、精緻,非一般程序員所能掌握。
從以上分析可知,C++語言在高性能計算的領域裏仍獨占鰲頭。其簡單明瞭的結論是:C++語言不但沒有過時,而且會在GPU、大數據、人工智能等領域發揮更大的作用。
許多C++新手沒有受過嚴格的訓練,也不瞭解C++語言的語義和實質,這是妨礙C++語言應用更上一層樓的主要因素。因此,本書的一個主要任務就是幫助讀者從C++語言的曆史、哲學和語義層麵上深入理解C++,它的重點是從C++的類型係統入手,告訴你C++的精髓和進化路徑,而不是教你熟悉它的語法規則。
水到渠成之後,本書會在後一章分析C++語言的性能特徵,以及一些常用的性能提升途徑給齣的一些可以復製的方案。希望這種分析能夠提升C++“一般”程序員的實際工作能力,突破Robert Hundt在上麵提到的一般程序員所麵臨的瓶頸,並且令其盡快從“一般”上升為“專傢”。
書中多數問題的論證和結論都是通過實例來闡述的。大多數實例都是筆者自己編寫,並且在自己的Dell Precision M6700 Laptop上運行、測試過的。這些實例都是用VC++ 2012 版本編寫的。如果需要本書中實例的源代碼,可以通過華中科技大學齣版社與筆者聯係。
前言/序言
我與C++
1988年,我在美國波特蘭州立大學(PSU)攻讀計算機科學碩士學位時,第yi次接觸到C++語言。當時,我的導師是波蘭裔,名叫博卡斯基(Marek Perkowski,http://www.pdx.edu/profile/marek-perkowski)。他研究機器人和設計自動化(design automation)理論,喜歡“人工智能”領域裏頗受青睞的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++的實用性和強大的性能保障,也讓我終選擇瞭用它來做畢業論文項目。
離開學校後不久,我就進入微軟公司總部的微軟研究院工作,從事Windows NT的性能研究。去微軟公司麵試的時間是1995年8月17日,距離Windows 95的轟動性發布隻有一周時間。記得麵試的一個C++問題是論述“多態性(polymorphism)”是否意味著“動態綁定”。我的麵試官告訴我:“C++沒有動態綁定,隻有靜態綁定,而COM(component object model)裏纔有真正的動態綁定。”我十分認真、激動地爭辯道:“C++的polymorphism就是動態綁定。”兩人從會議室爭論到咖啡廳,然後又爭論到坐落在美麗的“華盛頓湖畔”的一傢意大利餐廳。晚上,當人事部門宣布麵試結果時,我以為一定沒戲,後悔自己太認真,不知道天高地厚。沒想到我被那位麵試官所在的團隊——微軟公司總部的微軟研究院“軟件性能研究中心(PPRC)”錄用,而且我們一直是閤作良好的同事。直到今天,我還認為我對瞭,他錯瞭。但在微軟公司當時的氛圍裏,“對”“錯”並不是重要的,重要的是“激情”和“執著”。而正是這種精神和文化,將20世紀90年代的微軟和世界區分開來,讓軟件世界的“微軟時代”降臨。我也有幸加入到這個世界一流公司的研發隊伍中,在幾個重要的産品組裏,貢獻瞭自己的青春,實現瞭讀研時的理想。20世紀90年代,微軟公司是充滿活力和朝氣的崛起的巨人。
記得有個朋友的兒子在美國東部一所大學讀書,一次去他傢過聖誕節,吃飯時他問我:“你怎麼就能進微軟,而我的許多朋友都進不去呢?”其實,我的真實答案是兩個字:“運氣”。但是我當時的迴答是:“你必須每天花至少20分鍾時間,讀一些具體的計算機科學著作;然後至少花10分鍾時間,想一些抽象的問題,比如宇宙爆炸理論的邏輯錯誤和量子疊加的荒謬性等,隻要和技術無關就好。”因為我一直以為:如果你對哲學沒有興趣,你不可能成為一個優秀的程序員;而做一個平庸的程序員太纍瞭,不值得!
加入微軟公司後,我有機會參與到多個大型的C++項目的開發中。從Windows NT性能測試工具到Windows Vista的安全性,以及後來的Windows 2008服務器,C++都在實戰中給我驚喜,但有時它也會給我帶來噩夢。然而,我體會深的,就是幾乎每天我都會慶幸自己又學到瞭新的技能和思想,這種新東西可能是技術上的,也可能是方法學上的,這種體會持續瞭我在微軟公司工作的5000多個日日夜夜。
我發現,C++並不是一門簡單、平庸的語言。正因為它的定位,它是植根於C以及VNA係統的,因此一個對VNA不清楚的程序員,是不可能掌握C++語言的。C++也並非一門在數學上有深厚根基的語言,很難像Lisp語言那樣用Lambda錶達式和高階函數等概念錶達C++。這其實是C++程序不容易編寫好的深層原因。
在微軟公司工作10多年,我接觸過許多C++資深程序員,比如《深度探索C++對象模型》的作者Stan Lippman。我是作為VC++組的架構師,通過“發現”VC++在實現C++ SPEC方麵的一些錯誤而結識瞭他,並數次就C++的曆史、哲學和設計模闆問題與他交流。
然而,我接觸更多的是C++新手,比如我帶領的多個美國常春藤名校的“實習生”,現在也早已成為各部門的高級主管。即使在這樣一個世界一流的軟件公司裏,他們中間一些人對C++語言的精神,尤其是它的語義層麵上的規則,仍存在諸多的誤解。一些通俗但並不精確的觀點在業內長期流行:比如C++的後門很多,C++的性能較C有較大差距等。造成這些誤解,一方麵是由於缺乏係統性的教育和簡明易懂的著作,另一方麵是C++語言本身缺乏嚴格的數學、邏輯框架。
C++語義和性能分析 下載 mobi epub pdf txt 電子書