究竟難在哪里?
首先得分兩邊說:1. 學(xué)和用c++難在哪兒,2. c++語言的自身演化難在哪兒。
難學(xué)在哪兒:i. 它是個多程序風(fēng)格語言。fp、oop、pp都支持。支持c風(fēng)格的宏,所以mp也支持(吧...)。
ii. 它仍然需要關(guān)注內(nèi)存,即使使用所謂智能指針后,仍有需要注意的。如,T t[N], 里的N需要編譯期可計算,因為它實例化在棧上。這個其實新手很容易掉坑里。還有就是大名鼎鼎的dangling pointer。rust每天指著鼻子罵c和c++的就是這個事兒。
iii. 語言本身復(fù)雜度也高,oop里多繼承,泛型的運算系統(tǒng),等等等等...太多了...
iv. term小王子...在c++面前,java發(fā)明的那些術(shù)語簡直不值一提...standard layout,就是和struct長得一毛一樣的class在內(nèi)存里存儲數(shù)據(jù)的內(nèi)存鋪設(shè)方式...這也需要個術(shù)語... compile unit就是編譯出一個完整的object文件的這么個“單元”。
v. 與系統(tǒng)的交叉知識,如dll、系統(tǒng)調(diào)用與標(biāo)準(zhǔn)庫的對應(yīng)(這個c也有)。
vi. 第三方庫...在哪兒啊?這個庫靠譜還是那個?
vii. 異質(zhì)計算體系。如自己代碼是CPU上的,但有些東西要用cuda算...還有學(xué)通訊的,沒事整個“firmware”...
難用在哪兒i. debug有時候看不出來內(nèi)存結(jié)構(gòu)是個啥。搞裸機開發(fā)時候更如此。我有一次jlink加gdb弄進來之后,單步執(zhí)行發(fā)現(xiàn)行為和直接跑對不上...因為燒錄的是O3的...但debug的bin太大,放不進去...于是盲猜開始了...
ii. ide提供的支持有限。即使宇宙第一ide vs里,c++仍有很多時候提示不出來。例如你給了模板的default值,但ide仍然提示不出來。因為c++的template和宏更相似。ide看見那個類時候,不知道你是不是會用default,所以沒法展開...
iii. 交叉編譯的工具鏈配置是真復(fù)雜...一旦配好了,真不想動...
iv. cmake+git submodule其實能滿足當(dāng)今80%以上的需求。然而你似乎總能或多或少的跑到另外20%里沾那么一下...
v. 性能測試... 不說了...都是淚...
自身語言演化的難度i. 標(biāo)準(zhǔn)化與既有生態(tài)永遠都有矛盾。我記得微軟在標(biāo)準(zhǔn)化時候否過一個啥feature來著...想不起來了。因為cl沒有準(zhǔn)備好。這個事兒按說應(yīng)該氣憤與微軟否決進步的提案。但標(biāo)準(zhǔn)化的目的是鋪平道路。cl是宇宙第一ide的編譯器,它不支持,即使通過了,也不標(biāo)準(zhǔn)啊...這也算“依靠實力和地位”唄...
ii. 與其他語言的競爭中,c++的標(biāo)準(zhǔn)在不斷的前進。最近10年是個加速趨勢。但寫代碼的人,面對的場面是...既有代碼要跟上時代就有大量的重寫、重測的成本... 除非從頭再折騰一套,否則大項目要進步,內(nèi)應(yīng)力太高了... 當(dāng)然最大的應(yīng)力其實來自開發(fā)者自身...人間值不值得啊?
iii. c++這些年來,語言本身的演變一直是滯后于使用的。因此背負了太多標(biāo)簽...主要就是不安全、開發(fā)效率低,等等等等。造成在極度需要性能的1%世界,c++其實滲透率很低的...所以扎克伯格他們在做那個diem(以前叫啥忘了)數(shù)字貨幣時選了rust。ethereum的倆client實現(xiàn),一個golang一個rust。這樣就尷尬了。和錢最接近的領(lǐng)域,c++并沒有能卡住位。這一下就和java掉一個梯隊去了...這是c++目前不大好的一個消息。比特幣的client我沒讀過代碼,是不是c++的還是c的,我不大清楚。但比特幣的核心是錢,并不能如ethereum那樣支起一個“空間”來啊。