原文:http://aras-p.info/blog/2018/12/28/Modern-C-Lamentations/

譯文:C++ 20的悲哀,還未出世就被群嘲「勸退」


暫時只能對第二點說些不成體系的東西:

C++ 各種小工具、各種自定義語法糖( in other words, C++-style Zero Overhead Abstraction )基本是無法擺脫函數的。

(目前看來 Rust 標準庫的處理也類似,雖然 Rust 的宏強大很多)

而既然選用函數來進行抽象,使之為零開銷就需要各種函數內聯。相對地,一旦內聯掉了,二進位文件中原有的函數調用關係就蕩然無存,調試時就看不到原來的東西了。

可是——調試和優化本來就存在矛盾。留給調試的信息越多,能進行的優化就越少。

如果採用宏在預處理階段解決抽象,則 debug 的性能會「保證」比較好,相應地調試時看到的東西會「保證」比較少。

MSVC 的 STL 實現甚至把 debug 這個需求推向極致—— debug 模式下加入額外的數據結構,保證盡量把錯誤操作檢查出來。

由於不同人有不同的需求,想「解決」這種問題恐怕只能讓實現多做幾個 debug level (但這樣仍然無法根治)。

不過話說回頭,經由函數的抽象本來就有一定問題:

如果想把底下的操作通透地 (transparently) 轉發出去,介面的實現複雜度要上天了。

(具體可以搜下 "C++ 17轉發一個函數調用的完美實現" ,原文發在知乎但現在無法打開)

至於編譯時間的問題,如果沒有 Modules 的話,可以說:

沒救了。 C++ 身為從 C 添加內容得到的 C++ ,註定會有這個下場。

而這個作者感受到的心智負擔,不知是不是因為我太年輕太簡單的關係,我是沒感受到……


致module

-------------------這麼好的配圖,居然給我摺疊-------------------------------------------


所以為了避免這種黑暗的未來,我們還是要穿越回 1972 年炸掉貝爾實驗室(笑

C++ 現在用的人太多了,Office 源碼都要超過 1TB,誰有這個精力把它移植一遍……


都8012年了,都吐槽C++多少年了,碼農們還不是 只能繼續 真香!!!

沒辦法啊,操作系統給的介面要麼是C 要麼是C++。

能咋辦。只要主流操作系統 不放棄 頭文件那種 C-style的OSABI介面 ,寫C++就有飯吃。

C++就能很好地活下去。

如果三大OS 立馬能夠直接支持Rust,D語言之類的介面,寫驅動之類基建設施。

我估計C++壽終正寢也就差不多了。到時候萬人唾棄。

但是這事前提:就得問問 谷歌 微軟和蘋果了 。如果他們沒有plan,沒有步調一致,就別想太多了


如果你問我什麼語言我最喜歡,我會說C++。但如果問我C++還有前途嗎?我會誠實而又明確的說:完全沒有了。而且誠實的講,現在是開始考慮什麼時候停用C++的一個好機會了。

就C++20談C++是沒有意義的,真正恐怖的在下面:

C++26都出來了,而C++26也才給你點networking/reflection這種東西!

稍微回想一下,C++11大家是什麼時候在公司能放開隨便用的?2013/2014年能公司項目鋪開用C++11算快的吧,那好,恭喜你,按照這個規律,在2030年你就能愉快的在公司項目里用C++ networking和reflection庫了!

再告訴你個更讓你激動的,等到了2030年,屆時你兒子都可能已經可以和你一起pair programmingu 一起愉快的用C++ networking/reflection庫了!明白了嗎?networking/reflection這種最基本最基本的東西,居然甚至都根本不是給你準備的,是給你兒子那代人準備的。

這就是C++標準委員會不要臉的程度!慢工出細活對吧?那好,你認為標準庫里那點單薄的東西,是細活嗎?對比一下別的語言的標準庫吧。

標準委員會的那群有懶心又毒滿腦政治鬥爭的老爺是悠閑的加州辦公室里resting and vesting什麼也不做就一年好幾百萬人民幣股票進帳的。沒有這個底氣,幾個做軟體的敢告訴用戶networking/reflection庫還要等12年?你有種去和自己公司的項目主管甚至公司主管說說看,說你計劃某個非核心功能在8年以後發布,大約12年以後會被大家普遍採用,你看看有什麼結果。

C++標準委員會這已經不是博傻了,他們是在糟蹋C++用戶的未來

以前,C++尚有一塊遮羞布,可以說自己是C以外離開硬體最近的語言。很遺憾了,NVM, NUMA, GPU,FPGA,超大規模分散式系統橫行的今天,這C++對標的硬體模型千萬別搞糊塗,是30年前那套古董。當然,C++標準委員會不會認為30年前那套硬體古董模型過時,不然他們也沒有勇氣告訴你12年以後你就能愉快的用networking/reflection了。

至於有人說networking之類的功能早在內部某某庫里就有很好實現了,不會等標準庫。拜託,造火車的連火車都造出來了,軌距為什麼要標準化,而不是自己定一個尺寸就完了?貴司內部的某某網路庫是很好,大家各不相同的網路庫全都很好,但這和語言缺乏一個統一的networking庫有矛盾嗎?沒有。大家都在擼networking庫,為啥啊?因為C++標準庫居然未來8年都不會有networking支持!5G無線網到時候都淘汰了,它都不肯支持最基本的,就是這麼霸道。還不贊同的話,不如你去問問標準委員會thread,filesystem甚至coroutine這種已經有各有眾多良好實現的庫,他們幹嘛一個個加。按照上述思維,都無關緊要啊。

還有人說networking加了也不會用,所以無關。真是很歡樂的說法。去看下chromium里C++語言和庫的各種閹割規定,然後再思考一下各個C++項目各有各的閹割刀法,有的不準用exception、有的不準用boost、有的不準用某某C++11新增的庫等等,是不是各自分裂各自胡鬧?這裡再包含一下你的項目里你新提出的要閹割了networking庫這事。你覺得這不是C++的最大失敗之一嗎?請誠實的問問自己,golang/rust的等等語言,會有這種硬性的某某語言功能某某標準庫部分不準用的奇葩嗎?哦對了,和golang/rust比真的對golang/rust不公平,因為golang/rust不會不要臉到說8年以後出networking庫。

C++20被勸退?被當前這種巨爛的C++標準委員會把持的C++,才是應該被勸退的主體。用個networking庫,還要等12年,你C++標準委員會的又懶又肥不顧用戶死活,反正一個個是這12年里什麼也不幹就可以vesting出幾千萬人民幣股票,躺倒了玩,怎麼高興怎麼玩,可咱普通用戶真耗不起啊。

網上對C++的評價已經很客氣了,客氣到都基本不怎麼罵標準委員會的那幫滿腦子政治鬥爭凌駕於技術的孫子了。對比一下別的語言,Golang的module已經全部做好,1.12 beta 1里有完整呈現,接下來就修bug加強穩定可靠就可以了。結果,Golang因為至今才剛有module支持而依舊被人狂罵。對比C++,標準委員會的孫子曾保證C++17搞定module,結果一推遲就推遲3年,到C++20才標準化。標準化以後得編譯器實現、測試、編譯器升級發布推廣,等各位公司能放開用,估計2023年,也就是要等5年!網上有人狂罵C++這點罵?沒有,C++用戶太善良太老實,每天被C++標準委員會的地痞無賴壓地上揍,可依舊默默承受。去犯傻學什麼C++20,就是繼續不反抗,就是繼續支持標準委員會躺到了不幹活還耍橫的孫子胡作非為。

本人鄭重承諾:C++14是我最後一個主動學習、使用的版本,C++17開始,一定努力做到不聽、不看、不傳。老子投身的是Computer Science,愛的絕對不是一群頑固不化的老混蛋把持的委員會,更不愛有種讓用戶再等12年才用networking/reflection標準庫的扯蛋語言。有那功夫看C++標準委員會的荒誕表演,不如學用一下rust,看多幾篇各自領域的論文。

無法不匿名,還得靠C++混飯吃,多說無意義,就醬紫。


推薦閱讀:
相关文章