背景
之前看到了一篇很有意思的帖子“C++20會變得陌生”,樓主貼出了分別用C++11 和 C++20撰寫的代碼,如下:

以上代碼實作了資料操作:
● 從向量v里篩選出偶數的元素
● 將以上得到的每個元素分別乘以2
● 將以上得到的每個元素分別列印出來
C++11 通過使用algorithm里的幾個函式按步驟實作;而C++20 通過使用新的ranges擴展實作了相同的效果,通過使用|將資料連接了起來,類似于Unix shell的管道,
我猜作者的意思應該是想表達C++20變化大,會讓一些人感到陌生,但下面的評論就很有意思了,大體有以下幾類:
1.“顏值派”:這語法可真丑
2.“保守派”:C++在函式式編程上路越來越作死
3.“逃離派”:建議使用Rust或Go替代越來越臃腫的C++
4.“現實派”:C++真是越來越復雜了,連語法都看不懂,哪一天會撐爆
5.“理性派”:C++的一些痛點必須解決,而目前看來也只能這樣解決

幾點看法
近幾年,C++的演進進入了快車道,之前C++98到C++11,歷時13年;現在C++11、C++14、C++17、C++20,每3年一版,帶來了改進的同時,也引起了眾多的吐槽,比如上面的評論,
現在是我的一些看法,為了避免發散,針對上面的代碼做討論,
? 關于語法
美丑永遠是相對的,得看你跟誰比,比如,如果簡潔是一種美,那跟純函式式語言Haskell比,肯定要丑了,下面是Haskell等價的代碼,很明顯要簡潔的多,

跟C語言比呢?如果抽象是一種美,我覺得C++要美觀的多,比如C中只能通過回圈來實作遍歷,而現代C++中已經有了很多結構控制函式,比如foreach、filter等,這種函式望文生義,你很明白就能知道代碼在干什么,而回圈陳述句則需要你進到回圈內部才能明白在做什么,
我是從C轉向C++的,起初寫C++代碼的時候,根本就不用參考、namespace這些東東,而是用指標和命名前綴代替,當時也覺得不美,
久而久之發現,指標傳參的時候要判斷指標是否為空,這樣的代碼真的很丑,那么長的識別符號也很丑,而參考和名字空間恰好解決了這些問題,反倒是覺得好看了,
C++20 跟 C++11比呢?C++ 20美,因為上文的代碼既簡潔,又清晰了表達了代碼意圖,
C++語法是有巨大的歷史包袱的,想進步很難,但C++在語法上面是在進步的,比如使用{}統一初始化陳述句,雖然初看起來比較別扭,但一旦統一了,代碼看起來是比較漂亮的,代碼一致性也是美的一種,
? 關于函式式
函式式編程已經成了編程語言的必備特性,不光C++引入了,其他語言,比如Java等等都包含了某些函式式語言的特性,
從某種程度上來說,函式式編程是趨勢,比如,匿名函式在某些情況下是很方便的,避免每次都要去定義一些僅用一次的函式,
C++20可能要引入的concepts也來源于函式式編程語言,包括Rust的trait,都跟haskell的typeclass有關,一旦編譯器支持了,對模板編程絕對是一大利好,
C++既然是多泛型語言,再多支持一個函式式,也就不奇怪了,
? 關于C++的替代語言
這方面,Rust和Go的呼聲最高,
在我看來,C++不會被替代,但Rust是一種比C++更好的選擇,而Go可能是Java的替代,
簡要說下兩門語言的對比:Rust和Go的語言設計是兩個方向,前者從學識訓出發,兼顧實用化,后者從實用化出發,慢慢引入其他高級特性,
1.從整體上看,Rust語言要完整,后期出現坑的可能性要小,Go通過簡單吸引了大量的開發者,在1.0版泛型都沒有,而且例外處理極其單薄,從語言一致性上看,Rust較好,
2.從語言效率看,Rust跟C++都沒有GC,速度相當;Go有Gc,速度是優于Java的,但離C++還有一段距離,而且這個距離很難再減了,
有一點要提,Go入門實在是太快了,稍微看一下語法,在ide里就可以寫代碼了;而Rust的所有權、borrow機制,尤其是生命期就攔住了不少人,
如果沒有特殊需求,優選新語言,因為新語言歷史包袱少,能剪掉很多學習成本,
? 關于C++的體量
這幾年,C++加快了演進速度,越來越多的特性加入到了語言當中,相對地,C++做減法的速度卻沒快起來,這導致了一種結果,就是C++語法膨脹的太快了,而且C++還要兼容C語言,最后語言規范刷刷的漲,
關于對策,語言的標準我們是沒有可操縱空間的,但我們可以選擇自己的“個人標準”,如,你是做應用開發的,用到底層特性的可能性不大,這個時候,你就完全可以不用原始指標、不用宏、僅使用{}初始化,,,這樣是完全可以的,

總結
現代C++是在進步的,后續文章開始寫一些現代C++的語言或庫的特性了,大部分都是老工具很好的替代,

最后,不管你是轉行也好,初學也罷,進階也可,如果你想學編程~
——【值得關注】我的 C/C++編程學習交流俱樂部!——
涉及:C語言、C++、windows編程、網路編程、QT圖形界面開發、Linux編程、游戲編程、資料結構與算以及資料庫......
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/236876.html
標籤:C++
下一篇:C++ 時間 & 日期
