官术网_书友最值得收藏!

“C++是一門復雜的語言?!边@是C++在數十年的應用中所獲得的評價,但該評價也并非總是正確的。通常,這是人們用來勸退他人學習C++的理由,也是人們認為另一門編程語言更好的原因。這些論點很難得到論證,因為基本前提是錯誤的,也就是說C++并不是一門復雜的語言。C++最大的問題是人們對它的評價,第二大問題是沒有針對它的高質量教材。

該語言從C語言發展而來。它最初只是C語言的一個分支(只增加了一些小功能),對應的編譯器是一個叫作Cfront的預編譯器。Cfront將早期的C++代碼編譯成C代碼,然后由C編譯器進行處理,這便是其名稱的由來。經過幾年的開發之后,人們發現這種方式限制了語言的發展,于是開始著手創建真正的編譯器。這個編譯器由Bjarne Stroustrup(該語言的最初發明者)編寫,可以獨立編譯C++程序。其他公司也對擴展基本的C語言感興趣,各自開發了自己的C++編譯器,這些編譯器大多與Cfront或較新的編譯器兼容。

后來這被證明是難以持續的,因為這門語言難以跨平臺移植,而且不同的編譯器之間嚴重不兼容,更不用說所有的決定和方向都控制在一個人手里。制定一個跨越具體公司的國際標準——一門有標準過程的語言,并且讓某些組織去管理它顯然更為合理。因此,C++開始成為ISO標準。經過若干年的發展,第一個正式的C++標準于1998年問世,人們對此歡欣鼓舞。

但人們只高興了一陣子,因為雖然C++98是一個很好的標準,但它包括了一些人們沒有預料到的新功能,而且有一些功能的交互方式很奇怪。在某些情況下,這些功能本身很好,卻無法與其他功能交互——例如將std::string作為文件名打開文件時。

另一個較晚增加的功能是模板,這是支持標準模板庫的底層技術,標準模板庫是當今C++非常重要的部分之一。在它發布之后,人們才發現它本身居然是圖靈完備的,許多高級結構可以通過編譯時計算獲得。這大大增強了庫作者編寫能夠處理任意復雜的推理的泛型代碼的能力,這與當時的其他語言非常不同。

最后一個編譯問題是,雖然C++98很好,但許多編譯器難以實現模板。當時的兩個主要編譯器,即GCC 2.7和Microsoft Visual C++ 6.0,都不能進行模板所需的兩階段名稱查找。要完全解決這個問題,唯一的辦法是對編譯器進行全面重寫……

GNU試圖繼續在現有的代碼庫中增加新功能,但最終在GCC 2.95時打算重寫。這意味著在多年的時間里不會有新的功能或版本,許多人對此感到不滿。一些公司利用這個代碼庫并試圖繼續開發,創建了2.95.2、2.95.3和2.96版本——這三個版本都因為缺乏穩定性而被大家記住。最后,完成重寫的GCC 3.0終于問世。它最初并不是很成功,因為盡管它能比2.95版本更好地編譯模板和C++代碼,但不能將Linux內核編譯成可運行的二進制文件。Linux社區明確反對修改其代碼以適應新的編譯器,堅持認為是該編譯器的問題。最終,在3.2版本的時候,Linux社區才開始改變,重新圍繞GCC 3.2及以后的版本展開開發工作。

微軟也試圖盡可能地避免重寫編譯器。它增加了一個又一個特殊補丁,并采用啟發式方法來猜測某些東西是否應該在第一階段或第二階段的模板名稱查找中解決。這幾乎是有效的,但21世紀10年代初期編寫的庫程序顯示,已經沒有辦法使所有的程序都工作了——即使修改源代碼也不行。微軟最終重寫了解析器,并在2018年發布了更新版本——但許多人沒有啟用新的解析器。到了2019年,新的解析器才終于被默認在新項目中啟用。

但在2011年有一個重大事件:C++11發布了。在C++98發布之后,人們陸續提出了很多重要的新功能并持續推動其發展。但是,由于一個特別的功能沒有達到預期的效果,新C++版本的發布從2006年左右被推遲到2009年左右。在那段時間里,人們試圖讓它像新功能一樣工作。2009年,它最終被去掉了,其余功能也被重新修復一番,這樣1998年版的C++終于得到了更新。新版本包含大量的新功能,并增強了庫功能。編譯器再次緩慢地跟上,大多數編譯器直到2013年年底才可以編譯大部分的C++11代碼。

C++委員會從先前的失敗中吸取了教訓,制定了一個每三年發布一個新版本的計劃。該計劃是在第一年創造和測試新的功能,在第二年將其很好地整合,在第三年使其穩定下來并正式發布,每三年重復這一過程。C++11是第一個成果,而2014年版C++是第二個成果。值得稱贊的是,委員會完全按照承諾做了,在C++11的基礎上進行了重大更新,并使C++11的功能比以前更好用。雖然在很多地方包含了一些限制,但是這些有限制的地方后來也逐步完善到大家能接受的程度——特別是constexpr相關的功能。

仍在努力追趕所有C++11新功能的編譯器作者們終于意識到,他們需要調整自己的步伐,否則就會被甩在后面。到2015年,所有的編譯器支持幾乎所有C++14的功能——鑒于之前C++98和C++11的情況,這是一個了不起的成就。所有主要的編譯器作者也重新加入了C++委員會——如果編譯器作者在某個功能發布之前就知道它,那么相應編譯器就可以成為支持該功能的主要編譯器。如果編譯器作者發現某個功能與自己的編譯器設計不匹配,那么可以影響C++委員會對功能進行調整,使其更容易得到支持,從而使人們更早地使用它。

現在,C++正在經歷一個重生期。這一時期大約始于2011年,當時C++11被引入,它所倡導的“現代C++”編程風格逐漸被大家采用。但是直到最近這些改進才更為顯著,因為C++11的所有理念都在C++14和C++17中得到了微調,而且現在所有的編譯器都完全支持人們所期望的所有功能。更棒的是,C++20標準已發布,所有編譯器的最新版本已經支持該標準的大部分功能。

現代C++允許開發者不用走之前的學習老路了,即不用先學習C,然后學習C++98,再學習C++11,最后摒棄C和C++98中所有已得到改進的部分。大多數課程過去都從C++歷史開始介紹,因為有必要了解為什么有些東西會這么奇怪。不過對于本書,我在這里加入了這些信息,因為Josh完全忽略了這一點。

因此,讀者在學習C++時不需要再了解這些歷史了?,F代C++風格允許讀者完全跳過它,只需知道C++的基本原則就可以寫出設計良好的程序?,F在就是學習C++最好的時機。

現在我們回到先前的問題——沒有針對C++的高質量教材。如今,C++委員會內部也提供了高質量的C++教學——有一個研究小組專門負責C++的教學!在我看來,這個問題已經被這本書完全解決了。

與我讀過的所有其他C++書籍不同,這本書介紹基礎知識和原理。它教讀者如何分析,然后讓讀者通過標準模板庫提供的東西進行分析。獲得回報可能需要更長的時間,但當你完全理解C++的工作原理,看到第一個結果被編譯和運行時,你會感到非常滿足。本書甚至包含了大多數C++書籍都回避的話題:在運行完整的程序之前設置環境并測試代碼。

享受閱讀本書之旅并嘗試所有的練習吧!祝你在C++的道路上好運!

Peter Bindels

To m To m首席軟件工程師

主站蜘蛛池模板: 江都市| 彩票| 乐山市| 花莲市| 永城市| 岳阳县| 大埔县| 商丘市| 曲阜市| 上饶县| 苍南县| 巴彦淖尔市| 徐州市| 根河市| 库尔勒市| 平和县| 津市市| 五大连池市| 苗栗县| 保山市| 长宁区| 永德县| 静乐县| 齐齐哈尔市| 大英县| 德清县| 凤凰县| 察雅县| 临沭县| 贺州市| 商城县| 济源市| 安多县| 哈尔滨市| 兰州市| 吉安市| 无锡市| 日照市| 宝应县| 杭锦后旗| 磐石市|