當前位置:首頁 > 公眾號精選 > C語言與CPP編程
[導讀]C對比其他語言到底難在哪里?有人對C異常推崇,除了性能優(yōu)勢,還有什么優(yōu)點,怎么學好C?01C的能力上限非常高,可以說在軟件領(lǐng)域沒有C做不好和做不到的事情,只是開發(fā)者水平和成本問題,而C之后出現(xiàn)的語言都有些無論如何都做不好或根本做不到的事情。C雖然能力上限高,但是達到這個上限對開發(fā)...

C 對比其他語言到底難在哪里?有人對C 異常推崇,除了性能優(yōu)勢,還有什么優(yōu)點,怎么學好C ?


01



C 的能力上限非常高,可以說在軟件領(lǐng)域沒有C 做不好和做不到的事情,只是開發(fā)者水平和成本問題,而C 之后出現(xiàn)的語言都有些無論如何都做不好或根本做不到的事情。


C 雖然能力上限高,但是達到這個上限對開發(fā)者的要求也很高,不是普通程序員可以做到的。


其它語言雖然上限低,但是只要不去碰那些極端要求的領(lǐng)域,在各自的優(yōu)勢領(lǐng)域里還是能超越C 的,對工程師要求也沒那么高,但是在全領(lǐng)域超越C 的目前還沒有。


C 的難點在于給開發(fā)者的自由度太高了,什么都可以做,限制很少,導致水平不夠的人也可以胡搞瞎搞,把代碼寫的亂七八糟,然后怪C 太難太復雜。


學好C ,最重要的是你要有學C 的需求,就是個人目標是要成為頂級程序員,成為開發(fā)基礎(chǔ)設(shè)施,設(shè)計構(gòu)建軟件平臺的人,沒有宏大的理想不會有足夠的動力去學C 的,過程中太多困難會導致放棄的。


長期來看,C 還是會被取代的,只是這個長期非常長,可以入選有生之年系列。


可以看到在最近幾年新出現(xiàn)的軟件項目里,C 的使用率已經(jīng)在下降了,但是很多歷史悠久的基礎(chǔ)設(shè)施類的項目基本都是C ,這些項目生命周期都很長,不會輕易被淘汰。


作者:姚冬
https://www.zhihu.com/question/311845619/answer/610895557


02



項目構(gòu)建看上去似乎是個攔路虎,不過結(jié)合現(xiàn)代cmake之后,很復雜的工程也其實可以構(gòu)建得很簡單。


難在范式多。范式多其實并不難,真正難在各范式的最佳實踐相當不明確。過程式和傳統(tǒng)c with class的最佳實踐還是比較明確的,多看看GTK和QT就差不離。但是現(xiàn)代C 偏重于靜態(tài)決定和半函數(shù)式,而且本身還在劇烈演進中,這兩個方向上,最佳實踐比較匱乏,尤其是大規(guī)模工程化的最佳實踐。我看過微軟、facebook的幾個現(xiàn)代C 開發(fā)框架,還是感覺過于玩具化,跟我自己的開發(fā)方式也區(qū)別很大,當然我自己是簡單至上的,不算完全的通用化方案。


那么真正的難度就在于取舍。如何做業(yè)務抽象,以何種形式來做抽象,如何平衡復雜與簡潔度,如何確認各技術(shù)和模塊的邊界,如何綜合運用多范式就很考驗經(jīng)驗和性格。


說點性能以外的優(yōu)勢吧。C 11之后,一向是我認為最佳的工程語言,控制力極強。重點在于靜態(tài)決定和操作簡化。


C 盡量少搞動態(tài)OOP,理論上不成問題,但是實際語法相當麻煩,而且弄多了就很容易出現(xiàn)像python一樣的問題,重構(gòu)困難。所以基于極強的類型化體系和模板體系,在開發(fā)體系的抽象和重構(gòu)性上,可以達到一個相當舒服的地步。盡可能的靜態(tài)決定可以避免很多手工錯誤。


C 寫庫那是各種手段都可以用上的,但是寫完了,可以做到使用極其簡單。我個人就覺得和typescript比較像,用起來有時候還要簡單一些。


再結(jié)合C 20的concept這種前置類型條件,constract這種前置邊界后置邊界,寫代碼就更舒服了。


作者:王旭競

https://www.zhihu.com/question/311845619/answer/594847911


03



C 對比其他語言到底難在哪里?概念多;

未定義行為多,編譯通過不表明你可以那么寫;

存在大量語言之外的東西。語言本身只定義到編譯單元,但后面還有靜態(tài)庫、動態(tài)庫、工程化的一堆事情。


最重要的,你不得不學會絕大部分概念。所謂“只使用語言的一部分特性”在稍微大點的工程里是做不到的,因為第三方庫會強制你使用那些你原本不打算用的概念。


除了性能優(yōu)勢,還有什么優(yōu)點?


性能優(yōu)勢不是特點,因為有太多的語言是注重性能的:不論是更老的C、Objective C,還是比較新的C#、Rust。


C 的關(guān)鍵特點,是有性能優(yōu)勢的同時提供了足夠多的抽象能力,使得它有能力構(gòu)建比較復雜的系統(tǒng)(vs C);同時又出現(xiàn)得足夠早,有足夠的歷史包袱:大量已存在的SDK使用C ,于是你不得不用C (vs C#、Rust)。


怎么學好C ?


我也不知道。我第一個真正學習的語言是Perl,然后使用裸奔類比學會了C 。


總之,你需要掌握:

裸奔概念(比如class無非就是有行為的結(jié)構(gòu)體,method無非就是函數(shù),template無非就是某種代碼生成規(guī)則)。


業(yè)務系統(tǒng)的分割、組織,這對于所有的編程都是需要的。


從項目中學習。沒有項目就自己做點小玩具。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉