上一篇簡單介紹 C++ 前半段歷史,我沒有參與,接下來談下半段。我是在 2000 年左右認真學習 C++,當時的版本是 C++98,那個時期,C++ 已經被廣泛應用在各種領域,也是程式語言熱門排行榜的前段班。
不過,許多相對較新的程式語言冒出頭,例如 Java(我最討厭的程式語言之一),以及後來出現的 C#。C++ 因為學習曲線陡,進入門檻高,再加上記憶體管理不易導致安全性問題層出不窮。人們開始擁抱具備「垃圾回收(Garbage Collection)」機制的程式語言。C# 一飛衝天。
即使如此,憑藉著優異的執行效能,且支援 Multi-paradigm(這個詞中文不好翻,原文照呈),Procedure、Object-Oritend、Template (Generic, Metaprogramming),C++ 依然是許多軟體專案的首選,特別是關鍵的「資訊基礎建設」,如瀏覽器(Chrome, Firefox)、資料庫、作業系統、遊戲引擎,還有一些 High Frequency Trading 專案以 C++ 或者 C 寫就。
不過,C++ 確實存在不少缺點,特別是指標以及記憶體管理,還有不同編譯器之間實作的落差,使得 C++ 對程式設計師來說是相對不友善的語言。這些問題 C++ 社群以及標準委員會相當清楚(罵久了,誰不知道)。但礙於種種原因,新的 C++ 標準規格進展緩慢,C++03 發佈後的幾年,只有一些小改。但這一切,都在西元二零一一年產生了變化...
C++ 這個年紀跟山姆差不多的「老」程式語言,於西元二零一一年正式通過並且發佈了讓這個老語言「回春」的新標準-C++11。同年,C++ 標準委員會達成共識,未來將「每三年」發佈一個新規格,替這個老語言續命注入新活水。
要在往前相容的前提下,持續強化這個「老」語言,著實不易。C++ 委員會集合了許多不同領域的 C++ 專家,每年齊聚一堂討論、審查,投票表決各方的「提案」。
人們習慣以 C++11 表示 2011 年發佈的標準規格,「11」是西元年後兩碼。C++14 是 2014 年發佈的新版規格,以此類推。最新版是 C++20,預計明年二零二零正式成為 ISO 標準。
三年一版的進程,有人看好,有人認為不妥。反對者認為更新太頻繁,會造成更高的學習門檻。我認為只要方向正確,持續添加新功能是正確的決定。三年,目前為止的兩個版本(C++ 11⁄14)皆照這個時程走。
早在 C++11 正式發佈前,就有社群發起的專案,加入許多有用的組件,最有名的當屬 Boost 專案。該專案有許多委員會成員,而且程式碼經過嚴格的同儕審查(Peer Review),能進入 Boost 的專案,幾乎可以說是「準」標準(事後證明確實如此)。
由於 C++11 帶來的新功能,大幅度地改變了撰寫 C++ 程式碼的思維以及風格。人們開始探索新的寫法,發展最佳實務。老語言彷佛又青春了起來。因此,單看程式語言規格的話,C++11 前面的「那個」叫做 Classical C++,C++11 以後則是 Modern C++。
新規格只是個開始,Modern C++ 的意義不只於此。在 C++ 界頗為知名的播客節目 CppCast,主持人之一的 Json Turner 整理了一份 C++ Best Practices,列舉如何利用新規格帶的新功能撰寫 C++ 程式碼,以符合 Modern C++ 精神。
接下來的文章,我將從 C++ 11/14/17 挑出幾個我認為現代人學 C++ 不能放過的新功能。不論老手或新手,應當掌握這些新功能,以 Modern C++ 的思維撰寫更穩定,而且更有表達力的程式碼。
最後,跟讀者推薦 Herb Sutter 的支影片——(Not Your Father’s) C++。
看到最討厭的語言是JAVA,心有戚戚焉;勾起我剛學JAVA的感受XD。 我曾經是JAVA為主力語言的軟體開發人員,但身為一個以母語是C/C++的人,我永遠忘不了那種覺得又蠢又幹的感覺:JVM抓著我的記憶體管理機制讓我難以介入,最後只好自己用OFF-HEAP處理,但我明明就是用JAVA...
GC is hard, very hard. Hard to use, hard to implement.
好一個母語是 C/C++ 的人,還不趕快回歸!