12月4日,C++之父Bjarne Stroustrup參加了全球C++及系統軟體技術大會。會議上,他發表了“C++20 與C++的持續演化”的主題演講,詳細闡述了C++20的主要特性、未來標準以及C++23的規劃。
早在9月份,C++20國際標準草案獲得一致透過,C++之父Bjarne Stroustrup就表示:“C++ 20是自C++11以來最大的發行版,它將是C++發展史上的里程碑。”這一發言引起了開發者們對C++20的廣泛關注。
從正式版來看,像 Concepts/Ranges/Modules/Coroutines 這些新特性將會對開發者及 C++ 生態產生不小的影響,業界都相信C++ 20必將為系統級軟體的開發、構建、設計帶來更多的驚喜。
即便如此,Bjarne依然覺得C++還不夠完美。“對必須工作幾十年的語言來說,穩定性是一種重要的特徵。我從一開始就知道,我不可能構建理想的語言,因此我必須以漸進式發展為目標:改進。說真的,我並不相信完美語言的想法:要怎樣就算是完美呢?對誰來說(是完美的)?”
因此,為了應對行業的挑戰,Bjarne一直活躍在C++開發的前線,認真對待開發者們的使用反饋。他曾說:“為了應對不斷變化的世界的挑戰,融入新思想,改進是必須的。”
別拿C++和其他語言做比較
C++的強大不僅在於對各行業系統的支撐,更在於其發展至今近40年來一直名列前茅,扛住了一波又一波新興程式語言如Java、C#、Python等的攻勢。
因此,不少人希望Bjarne做一些C++語言與其他語言的比較。但Bjarne拒絕了。他反覆重申自己長期且強烈持有的一個觀點:語言的比較很少是有意義的,也是有失公平的。
1.獨特規則與語義之下的C++
“C++是一種通用的程式設計語言,應該讓認真的程式設計師感覺到程式設計的快樂。”與其花費精力去和別的語言比較,Bjarne更關注C++本身對開發者的影響,他認為C++應該具有簡單、平衡、自由、友好這四大目標。
簡單:在不要犧牲效能的情況下,讓簡單的事情保持簡單,不要去複雜化本來的困難,使之成為可能。平衡:C++試圖找到「抽象」和效能的平衡點,並將選擇的自由留給程式設計師。自由:世界是多樣性的,C++的多正規化設計思維賦予了程式設計師極大的自由度和靈活性。友好:C++變得越來越友好,專家和學者對於這種友好性感觸將更加深刻。要成為真正有用而且人們樂於使用的東西,一個程式設計語言的設計就必須有一種全域性觀,用於指導語言中各種特徵的設計。
對於C++,這種全域性觀由一組規則和約束構成,Bjarne稱其為C++的規則。Bjarne認為把原理這個詞用在一個真正的科學原理非常貧乏的領域,顯得過於自命不凡,而程式設計語言設計就是這樣一個領域。
此外,對許多人而言,術語原理隱含著一個不太實際的推論,也就是說,任何例外都是不可接受的。而Bjarne的有關C++設計的規則幾乎可以保證都有例外情況。實際上,如果一條規則與某個實際試驗發生衝突,這個規則就應該靠邊站。
這樣說,看起來似乎有些粗魯,但是它不過是一條一般性原則的變形:理論必須與試驗資料相吻合,否則就應該被更好的理論取代。
一般性規則;設計支援規則;語言的技術性規則;低階程式支援規則。這些規則絕不能不假思索地使用,也不能用幾條膚淺的口號取代。Bjarne作為一個語言設計者,他的工作是決定對付C++語言裡出現的問題,決定在C++的框架裡能夠處理的是哪些問題,並在實際語言特徵設計的各種規則之間保持一種平衡。
談及C++的成功因素時,Bjarne認為這些“設計規則和語義”功不可沒。
2.C++不僅僅是一座橋樑
“C++最初的設計目標:高效地使用硬體,再加上強大的抽象機制,並在實際使用反饋的基礎上謹慎地改進。”Bjarne對C++的期望是其能作為一座橋樑,以便讓程式設計師能夠藉助於它,從傳統的程式設計過渡到基於資料抽象和麵向物件的程式設計。
C++僅僅是一座橋樑嗎?
一旦跨到某個世界,在那裡資料抽象和麵向物件的程式設計並不是那麼自然,C++所提供的那些特徵還有其本身的價值嗎?
還有,假定上面問題得到的都是正面回答,那麼在今後的十年裡,程式設計師們為那些並不關心C相容性的使用者所做的任何事情,都不會對那些始終關心這個問題的人們造成損害嗎?
語言的存在就是為了幫助開發者們解決問題。如果一種語言開始很成功,只要人們繼續面臨這個語言能幫助解決的同一類問題,它就會繼續生存下去。進一步說,只要沒有其他語言能在同類問題上提供明顯優於它的解,它就應該還能繁榮興旺。這樣,問題就變成:
C++幫助我們解決的問題仍然是實在的嗎?明顯優於它的解出現了嗎?C++能為新的問題提供良好的解嗎?對此,Bjarne回答是“許多還將是”“慢慢地”和“是的”。
C++的長處,更多在於它對許多問題都是很好的解決途徑,而不在於它對某個特定問題是最好的解決途徑。
例如,與C語言類似,C++ 對於低層系統也是一個絕好的語言,對於這類工作,C++ 效能通常超過其他任何高階語言。當然,對多數機器系統結構,一個好的彙編程式設計師總能做出比很好的C++ 編譯器還要小許多、快許多的程式碼。但這通常並不重要,因為在一個複雜系統裡,這種存在顯著差異的部分所佔的比例非常小,而如果整個系統都用匯編語言寫,那將是無法負擔的,也是無法維護的。
Bjarne發現,要設想出一個應用領域,在那裡人們不可能構造出某種優於C++,同時也能優於任何通用的程式設計語言的特殊語言,是一件極其困難的事情。這樣,大部分通用程式設計語言最希望做的就是成為“每個人的第二選擇”。
因此,Bjarne開始考察一些領域,在這些領域裡C++有著根本的優勢:
低層系統程式設計;高層系統程式設計;嵌入式程式碼;數值/科學計算;一般應用程式設計。這些類別並不是相互分離的,它們也沒有已經被廣泛接受的定義。C++ 將繼續是所有這些領域中的一個很好選擇。進一步說,任何語言要想成為一個好選擇,那麼在所提供的基本服務的層面上,它看起來應該很像C++,當然,或許不是在語法或者語義細節的層面上。
一直以來,Bjarne對C++的定位有著清晰的認知,也為C++能更好地適應環境變化而傾注心血研究,因此,像做比較這種需要消耗大量時間精力的事情,Bjarne是拒絕的,他更願意和創造團隊一起研究,讓C++對開發者們更有效。
C++如何更高效
得益於Bjarne為C++設計的規則,讓C++這門語言在許多領域得到了廣泛的應用。
在軟體開發的世界裡,絕對沒有驕傲自滿的位置。在這些年裡,人們期望的增長總是大大地超過硬體和軟體的令人難以置信的增長。Bjarne表示他目前看不到有任何跡象說這些情況會很快改變。
“讓 C++ 保持連貫性,並作為一個穩定的開發平臺,這一點至關重要。”相比於期待C++能迅速改變,Bjarne更注重C++的連貫性。
在保持連貫性的基礎之上,Bjarne開始為開發者們考慮一些更實際的東西,比如學好C++、高效運用C++等。雖然C++11的確讓C++相較於之前變得簡單快速了很多,但不可否認,C++仍然是開發者們很難掌握的語言之一。
“C++ 確實很複雜,要想學好、用好它,需要付出很多努力。不幸的是,人們不只是想要簡單,他們還想要某種不可能的東西:一種更簡單的語言,擁有更多的特性,並且還不會破壞他們現有的程式碼。” Bjarne承認C++的複雜難學,併為開發者們提供了兩個重要的支援。
穩定性和標準
語言定義,關鍵性的庫和介面的穩定性,應該列在未來進步的需求表裡的最高位置。ANSI/ISO C++標準將提供前者,許多組織和公司在後一方向上工作,在各種領域中,例如作業系統介面、動態連線庫、資料庫介面等。在不久的將來,C++語言將成為在各種重要平臺上都可以使用的東西,那將會大大地推動庫和工具工業的發展。
Bjarne認為:“人們當然還會繼續要求新特徵,但我已經可以在這裡描述的C++中生活了。我想,大部分產品程式碼的程式設計師也應該可以。特別值得提醒的是,沒有任何單獨的特徵對於生產好程式碼而言是無可替代的東西——無論你怎樣給出“好”的定義。”
教育和技術
對C++及其所有的應用領域而言,Bjarne認為對進步最有潛力的事情就是學習新的設計技術和程式設計技術。從原則上說,更有效地使用C++是最容易獲得的進步,也最廉價。昂貴的工具並不是必需的。
在另一方面,改變思維習慣也不是很容易做的事情。對於大多數程式設計師而言,所需要的並不是簡單的有關新語法的訓練,而是有關新概念的教育。他預計,在今後幾年裡,我們將看到設計和程式設計技術方面的重大進步,這些方面當然沒有拖延的理由。
開發者中的大多數已經在一個或幾個領域裡大大地落後於現狀了,他們可以從一些閱讀和試驗中得到重要的收穫,戰鬥在標準和工具的前沿上將更加樂趣無窮。
Bjarne認為,C++ 最有實力的地方並不是它的某個獨到之處特別偉大,而在於它在事物的大範圍變化中的表現都很不錯。與此類似,從根本上說,C++發展也不是來自某個孤立的進步,而是來自在不同領域中的大量的各種各樣的進步。更好的庫、更好的設計技術、接受過更好教育的程式設計師和設計師、語言標準、可選擇的廢料收集、物件通訊標準、資料庫、基於非正文形式的環境、更好的工具、更快的編譯等,都將會對此有所貢獻。
因此,Bjarne認為,目前C++只是剛剛開始有所成效。基礎已經建立,但也只不過是一個基礎。面向未來,Bjarne期望能看到最主要的活動和進步能夠從語言本身——這是一個基礎——轉移到依賴於它,在它上面構造起來的工具、環境、庫、應用等方面去。
如何學習C++
C++是C語言的繼承,它既可以進行C語言的過程化程式設計,又可以進行以抽象資料型別為特點的基於物件的程式設計,還可以進行以繼承和多型為特點的面向物件的程式設計。
C++擅長面向物件程式設計的同時,還可以進行基於過程的程式設計,因而C++就適應的問題規模而論,大小由之。C++不僅擁有計算機高效執行的實用性特徵,同時還致力於提高大規模程式的程式設計質量與程式設計語言的問題描述能力。
對初學者來說,學習C++首選斯蒂芬·普拉塔的《C++ Primer Plus 中文版 第6版》作為入門圖書。這本暢銷近40年,豆瓣評分9.6,堪稱C++程式設計師的“引路人”。從第一版出版至今已經升級到了第六版,作者堅持初心——致力於編寫一本指導性強、條理清晰而且有用的C語言教程。所以,書中大量完整的、可執行的程式及詳細的註釋有助於理解程式碼和概念。
C++ Primer Plus(第6版)中文版
譯者: 張海龍 ,袁國忠
京東
內容簡介:
史上暢銷的重量級C++大百科全書,C++入門的首選圖書,累計銷量近百萬冊。
本書分18章,分別介紹了C++程式的執行方式、基本資料型別、複合資料型別、迴圈和關係表示式、分支語句和邏輯運算子、函式過載和函式模板、記憶體模型和名稱空間、類的設計和使用、多型、虛擬函式、動態記憶體分配、繼承、程式碼重用、友元、異常處理技術、string類和標準模板庫、輸入/輸出、C++11新增功能等內容。
本書針對C++初學者,從C語言基礎知識開始介紹,然後在此基礎上詳細闡述C++新增的特性,因此不要求讀者有C語言方面的背景知識。
對已經對C++有所瞭解的開發者們來說,不妨讀讀C++之父Bjarne關於C++設計規則的圖書《C++語言的設計和演化》。
C++語言的設計和演化
譯者: 裘宗燕
京東
在這本書中,Bjarne Stroustrup全面論述了C++ 的歷史和發展,C++中各種重要機制的本質、意義和設計背景,這些機制的基本用途和使用方法,討論了C++ 所適合的應用領域和未來發展前景。本書在幫助人們深入理解C++ 語言方面的地位無可替代,值得每個關心、學習和使用C++ 語言的專業工作者、科研人員、教師和學生閱讀。