有人說C++20變得越來越陌生,從顏值派到理性派,淺談對C++的看法!


背景

之前看到了一篇很有意思的帖子“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編程、游戲編程、數據結構與算以及數據庫......

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM