C 究竟難在哪里?
時(shí)間:2021-10-09 15:32:06
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]C對(duì)比其他語(yǔ)言到底難在哪里?有人對(duì)C異常推崇,除了性能優(yōu)勢(shì),還有什么優(yōu)點(diǎn),怎么學(xué)好C?01C的能力上限非常高,可以說(shuō)在軟件領(lǐng)域沒(méi)有C做不好和做不到的事情,只是開(kāi)發(fā)者水平和成本問(wèn)題,而C之后出現(xiàn)的語(yǔ)言都有些無(wú)論如何都做不好或根本做不到的事情。C雖然能力上限高,但是達(dá)到這個(gè)上限對(duì)開(kāi)發(fā)...
C 對(duì)比其他語(yǔ)言到底難在哪里?有人對(duì)C 異常推崇,除了性能優(yōu)勢(shì),還有什么優(yōu)點(diǎn),怎么學(xué)好C ?
01
C 的能力上限非常高,可以說(shuō)在軟件領(lǐng)域沒(méi)有C 做不好和做不到的事情,只是開(kāi)發(fā)者水平和成本問(wèn)題,而C 之后出現(xiàn)的語(yǔ)言都有些無(wú)論如何都做不好或根本做不到的事情。
C 雖然能力上限高,但是達(dá)到這個(gè)上限對(duì)開(kāi)發(fā)者的要求也很高,不是普通程序員可以做到的。
其它語(yǔ)言雖然上限低,但是只要不去碰那些極端要求的領(lǐng)域,在各自的優(yōu)勢(shì)領(lǐng)域里還是能超越C 的,對(duì)工程師要求也沒(méi)那么高,但是在全領(lǐng)域超越C 的目前還沒(méi)有。
C 的難點(diǎn)在于給開(kāi)發(fā)者的自由度太高了,什么都可以做,限制很少,導(dǎo)致水平不夠的人也可以胡搞瞎搞,把代碼寫(xiě)的亂七八糟,然后怪C 太難太復(fù)雜。
學(xué)好C ,最重要的是你要有學(xué)C 的需求,就是個(gè)人目標(biāo)是要成為頂級(jí)程序員,成為開(kāi)發(fā)基礎(chǔ)設(shè)施,設(shè)計(jì)構(gòu)建軟件平臺(tái)的人,沒(méi)有宏大的理想不會(huì)有足夠的動(dòng)力去學(xué)C 的,過(guò)程中太多困難會(huì)導(dǎo)致放棄的。
長(zhǎng)期來(lái)看,C 還是會(huì)被取代的,只是這個(gè)長(zhǎng)期非常長(zhǎng),可以入選有生之年系列。
可以看到在最近幾年新出現(xiàn)的軟件項(xiàng)目里,C 的使用率已經(jīng)在下降了,但是很多歷史悠久的基礎(chǔ)設(shè)施類(lèi)的項(xiàng)目基本都是C ,這些項(xiàng)目生命周期都很長(zhǎng),不會(huì)輕易被淘汰。
作者:姚冬
https://www.zhihu.com/question/311845619/answer/610895557
02
項(xiàng)目構(gòu)建看上去似乎是個(gè)攔路虎,不過(guò)結(jié)合現(xiàn)代cmake之后,很復(fù)雜的工程也其實(shí)可以構(gòu)建得很簡(jiǎn)單。
難在范式多。范式多其實(shí)并不難,真正難在各范式的最佳實(shí)踐相當(dāng)不明確。過(guò)程式和傳統(tǒng)c with class的最佳實(shí)踐還是比較明確的,多看看GTK和QT就差不離。但是現(xiàn)代C 偏重于靜態(tài)決定和半函數(shù)式,而且本身還在劇烈演進(jìn)中,這兩個(gè)方向上,最佳實(shí)踐比較匱乏,尤其是大規(guī)模工程化的最佳實(shí)踐。我看過(guò)微軟、facebook的幾個(gè)現(xiàn)代C 開(kāi)發(fā)框架,還是感覺(jué)過(guò)于玩具化,跟我自己的開(kāi)發(fā)方式也區(qū)別很大,當(dāng)然我自己是簡(jiǎn)單至上的,不算完全的通用化方案。
那么真正的難度就在于取舍。如何做業(yè)務(wù)抽象,以何種形式來(lái)做抽象,如何平衡復(fù)雜與簡(jiǎn)潔度,如何確認(rèn)各技術(shù)和模塊的邊界,如何綜合運(yùn)用多范式就很考驗(yàn)經(jīng)驗(yàn)和性格。
說(shuō)點(diǎn)性能以外的優(yōu)勢(shì)吧。C 11之后,一向是我認(rèn)為最佳的工程語(yǔ)言,控制力極強(qiáng)。重點(diǎn)在于靜態(tài)決定和操作簡(jiǎn)化。
C 盡量少搞動(dòng)態(tài)OOP,理論上不成問(wèn)題,但是實(shí)際語(yǔ)法相當(dāng)麻煩,而且弄多了就很容易出現(xiàn)像python一樣的問(wèn)題,重構(gòu)困難。所以基于極強(qiáng)的類(lèi)型化體系和模板體系,在開(kāi)發(fā)體系的抽象和重構(gòu)性上,可以達(dá)到一個(gè)相當(dāng)舒服的地步。盡可能的靜態(tài)決定可以避免很多手工錯(cuò)誤。
C 寫(xiě)庫(kù)那是各種手段都可以用上的,但是寫(xiě)完了,可以做到使用極其簡(jiǎn)單。我個(gè)人就覺(jué)得和typescript比較像,用起來(lái)有時(shí)候還要簡(jiǎn)單一些。
再結(jié)合C 20的concept這種前置類(lèi)型條件,constract這種前置邊界后置邊界,寫(xiě)代碼就更舒服了。
作者:王旭競(jìng)https://www.zhihu.com/question/311845619/answer/594847911
03
C 對(duì)比其他語(yǔ)言到底難在哪里?概念多;未定義行為多,編譯通過(guò)不表明你可以那么寫(xiě);存在大量語(yǔ)言之外的東西。語(yǔ)言本身只定義到編譯單元,但后面還有靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)、工程化的一堆事情。
最重要的,你不得不學(xué)會(huì)絕大部分概念。所謂“只使用語(yǔ)言的一部分特性”在稍微大點(diǎn)的工程里是做不到的,因?yàn)榈谌綆?kù)會(huì)強(qiáng)制你使用那些你原本不打算用的概念。
除了性能優(yōu)勢(shì),還有什么優(yōu)點(diǎn)?
性能優(yōu)勢(shì)不是特點(diǎn),因?yàn)橛刑嗟恼Z(yǔ)言是注重性能的:不論是更老的C、Objective C,還是比較新的C#、Rust。
C 的關(guān)鍵特點(diǎn),是有性能優(yōu)勢(shì)的同時(shí)提供了足夠多的抽象能力,使得它有能力構(gòu)建比較復(fù)雜的系統(tǒng)(vs C);同時(shí)又出現(xiàn)得足夠早,有足夠的歷史包袱:大量已存在的SDK使用C ,于是你不得不用C (vs C#、Rust)。
怎么學(xué)好C ?
我也不知道。我第一個(gè)真正學(xué)習(xí)的語(yǔ)言是Perl,然后使用裸奔類(lèi)比學(xué)會(huì)了C 。
總之,你需要掌握:裸奔概念(比如class無(wú)非就是有行為的結(jié)構(gòu)體,method無(wú)非就是函數(shù),template無(wú)非就是某種代碼生成規(guī)則)。
業(yè)務(wù)系統(tǒng)的分割、組織,這對(duì)于所有的編程都是需要的。
從項(xiàng)目中學(xué)習(xí)。沒(méi)有項(xiàng)目就自己做點(diǎn)小玩具。
01
C 的能力上限非常高,可以說(shuō)在軟件領(lǐng)域沒(méi)有C 做不好和做不到的事情,只是開(kāi)發(fā)者水平和成本問(wèn)題,而C 之后出現(xiàn)的語(yǔ)言都有些無(wú)論如何都做不好或根本做不到的事情。
C 雖然能力上限高,但是達(dá)到這個(gè)上限對(duì)開(kāi)發(fā)者的要求也很高,不是普通程序員可以做到的。
其它語(yǔ)言雖然上限低,但是只要不去碰那些極端要求的領(lǐng)域,在各自的優(yōu)勢(shì)領(lǐng)域里還是能超越C 的,對(duì)工程師要求也沒(méi)那么高,但是在全領(lǐng)域超越C 的目前還沒(méi)有。
C 的難點(diǎn)在于給開(kāi)發(fā)者的自由度太高了,什么都可以做,限制很少,導(dǎo)致水平不夠的人也可以胡搞瞎搞,把代碼寫(xiě)的亂七八糟,然后怪C 太難太復(fù)雜。
學(xué)好C ,最重要的是你要有學(xué)C 的需求,就是個(gè)人目標(biāo)是要成為頂級(jí)程序員,成為開(kāi)發(fā)基礎(chǔ)設(shè)施,設(shè)計(jì)構(gòu)建軟件平臺(tái)的人,沒(méi)有宏大的理想不會(huì)有足夠的動(dòng)力去學(xué)C 的,過(guò)程中太多困難會(huì)導(dǎo)致放棄的。
長(zhǎng)期來(lái)看,C 還是會(huì)被取代的,只是這個(gè)長(zhǎng)期非常長(zhǎng),可以入選有生之年系列。
可以看到在最近幾年新出現(xiàn)的軟件項(xiàng)目里,C 的使用率已經(jīng)在下降了,但是很多歷史悠久的基礎(chǔ)設(shè)施類(lèi)的項(xiàng)目基本都是C ,這些項(xiàng)目生命周期都很長(zhǎng),不會(huì)輕易被淘汰。
作者:姚冬
https://www.zhihu.com/question/311845619/answer/610895557
02
項(xiàng)目構(gòu)建看上去似乎是個(gè)攔路虎,不過(guò)結(jié)合現(xiàn)代cmake之后,很復(fù)雜的工程也其實(shí)可以構(gòu)建得很簡(jiǎn)單。
難在范式多。范式多其實(shí)并不難,真正難在各范式的最佳實(shí)踐相當(dāng)不明確。過(guò)程式和傳統(tǒng)c with class的最佳實(shí)踐還是比較明確的,多看看GTK和QT就差不離。但是現(xiàn)代C 偏重于靜態(tài)決定和半函數(shù)式,而且本身還在劇烈演進(jìn)中,這兩個(gè)方向上,最佳實(shí)踐比較匱乏,尤其是大規(guī)模工程化的最佳實(shí)踐。我看過(guò)微軟、facebook的幾個(gè)現(xiàn)代C 開(kāi)發(fā)框架,還是感覺(jué)過(guò)于玩具化,跟我自己的開(kāi)發(fā)方式也區(qū)別很大,當(dāng)然我自己是簡(jiǎn)單至上的,不算完全的通用化方案。
那么真正的難度就在于取舍。如何做業(yè)務(wù)抽象,以何種形式來(lái)做抽象,如何平衡復(fù)雜與簡(jiǎn)潔度,如何確認(rèn)各技術(shù)和模塊的邊界,如何綜合運(yùn)用多范式就很考驗(yàn)經(jīng)驗(yàn)和性格。
說(shuō)點(diǎn)性能以外的優(yōu)勢(shì)吧。C 11之后,一向是我認(rèn)為最佳的工程語(yǔ)言,控制力極強(qiáng)。重點(diǎn)在于靜態(tài)決定和操作簡(jiǎn)化。
C 盡量少搞動(dòng)態(tài)OOP,理論上不成問(wèn)題,但是實(shí)際語(yǔ)法相當(dāng)麻煩,而且弄多了就很容易出現(xiàn)像python一樣的問(wèn)題,重構(gòu)困難。所以基于極強(qiáng)的類(lèi)型化體系和模板體系,在開(kāi)發(fā)體系的抽象和重構(gòu)性上,可以達(dá)到一個(gè)相當(dāng)舒服的地步。盡可能的靜態(tài)決定可以避免很多手工錯(cuò)誤。
C 寫(xiě)庫(kù)那是各種手段都可以用上的,但是寫(xiě)完了,可以做到使用極其簡(jiǎn)單。我個(gè)人就覺(jué)得和typescript比較像,用起來(lái)有時(shí)候還要簡(jiǎn)單一些。
再結(jié)合C 20的concept這種前置類(lèi)型條件,constract這種前置邊界后置邊界,寫(xiě)代碼就更舒服了。
作者:王旭競(jìng)https://www.zhihu.com/question/311845619/answer/594847911
03
C 對(duì)比其他語(yǔ)言到底難在哪里?概念多;未定義行為多,編譯通過(guò)不表明你可以那么寫(xiě);存在大量語(yǔ)言之外的東西。語(yǔ)言本身只定義到編譯單元,但后面還有靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)、工程化的一堆事情。
最重要的,你不得不學(xué)會(huì)絕大部分概念。所謂“只使用語(yǔ)言的一部分特性”在稍微大點(diǎn)的工程里是做不到的,因?yàn)榈谌綆?kù)會(huì)強(qiáng)制你使用那些你原本不打算用的概念。
除了性能優(yōu)勢(shì),還有什么優(yōu)點(diǎn)?
性能優(yōu)勢(shì)不是特點(diǎn),因?yàn)橛刑嗟恼Z(yǔ)言是注重性能的:不論是更老的C、Objective C,還是比較新的C#、Rust。
C 的關(guān)鍵特點(diǎn),是有性能優(yōu)勢(shì)的同時(shí)提供了足夠多的抽象能力,使得它有能力構(gòu)建比較復(fù)雜的系統(tǒng)(vs C);同時(shí)又出現(xiàn)得足夠早,有足夠的歷史包袱:大量已存在的SDK使用C ,于是你不得不用C (vs C#、Rust)。
怎么學(xué)好C ?
我也不知道。我第一個(gè)真正學(xué)習(xí)的語(yǔ)言是Perl,然后使用裸奔類(lèi)比學(xué)會(huì)了C 。
總之,你需要掌握:裸奔概念(比如class無(wú)非就是有行為的結(jié)構(gòu)體,method無(wú)非就是函數(shù),template無(wú)非就是某種代碼生成規(guī)則)。
業(yè)務(wù)系統(tǒng)的分割、組織,這對(duì)于所有的編程都是需要的。
從項(xiàng)目中學(xué)習(xí)。沒(méi)有項(xiàng)目就自己做點(diǎn)小玩具。