連結:https://www.zhihu.com/question/26659552/answer/615531516
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
不錯,是個程式設計師料子。
沒錯,C的確比諸如C++、Java、python之類語言簡單。
因為它什麼都沒有:32個關鍵字9種控制語句,然後是加減乘除與或非之類直接從數學裡借來的若干運算子。沒了。
簡潔明瞭,自解釋性強,正交度高,一個個概念搞清楚了,那真是做什麼都簡單。
相比之下,其他語言往往會引入更多的概念;這些概念往往還做不到“正交”,關係複雜,規則層出不窮;經常還極不直觀……
對於跟著課本/教材亦步亦趨的初學者來說,當然是概念簡單清晰、邏輯關係直白、在達成基本資料結構/演算法這個目標上不帶任何邏輯包袱的C更簡單,更容易入門。
請注意我加粗的“跟著課本/教材亦步亦趨的初學者”這個限定。
一旦脫離了這個限定,第一段的討論就成了無的放矢了。
這是因為,一旦你真的需要寫點什麼實用的東西出來,你就不得不面對“現實的複雜性”。
比如說吧,最簡單的,見過電腦的bios介面嗎?如果讓你用C寫個類似的東西呢?
類似的,如果讓你寫個視訊解碼器音訊播放器呢?
你立刻就會發現,你必須面對如下問題:
1、你必須懂硬體原理(顯示器原理、視訊記憶體/螢幕空間的對映關係、硬碟儲存尋道原理、音訊取樣/插值原理等等;以及CPU暫存器、流水線、cache、匯流排、鎖等等等等)。
2、你不得不使用第三方庫——比如,為了寫一個bios式的介面,最省事的辦法是用ncurses庫。
3、其他語言直接提供給你的東西,你將不得不全部重新實現一遍——更加的笨拙,更加的不正交——粗糙的完全無法使用。
C要求,這1、2、3三點你必須全能。
它的庫往往更原始,缺乏抽象,經常需要你根據自己的實際情況隨手補全;
它要求你對硬體瞭如指掌:每條指令下去,從CPU標誌位到記憶體到匯流排到顯示卡音效卡,所造成的一切直接間接後果,你必須如數家珍、並把程式執行時每個實體的每個瞬間都安排的明明白白——哪怕狀態變化的時序出現問題,那都是無法接受的嚴重bug;
最後,你需要自己就能夠為python之類語言實現/改良它的字典,這才可能在C裡面造一個不能被編輯器/編譯器直接支援的類似物、然後還要把它用到自己的專案裡。
相比之下,其他語言不需要你瞭解1,它甚至禁止你過於瞭解硬體,從而避免你被硬體的複雜性所影響;
它們有豐富完善好用的2,它們的庫從一開始就是針對傻瓜使用者設計的,用錯了它甚至能給你提示;
你只需學會它們的3的用法、並不需要自己懂這些“神祕語言元素”的實現:你壓根不需要像用C時一樣,自己絞盡腦汁用最少的指令實現這類語言提供的基本設施——越是基本的設施越是值得字斟句酌:用python你可以直接用“字典”;但如果玩C,你得知道“字典”就是C裡面你要自己實現的“雜湊表”;而且並不是課本上的“玩具程式碼”,而是實實在在工業強度的、最優化的、支援一切key-value型別的、高度泛化的雜湊表。
可見,哪怕你對C對資料結構有那麼一丁點最粗淺的瞭解,你都絕不會用“python有字典”來證明它的難、證明C的易用——恰恰相反,學C的目標之一,正是為python實現字典、實現“無需區分變數型別的變數”、幫助初學者“不知道指標照樣能用記憶體寫程式因為我在後臺偷偷替他們做了嘿嘿哈哈……”
換句話說,題主完全不知道想用好C需要什麼。
你所羅列的、其他語言“難”的那些方面,恰恰證明了你對用好C需要哪些基礎知識一無所知。
因為學其它語言只需要知道如何用字典之類東西就夠了;而學C,你不僅得自己能實現字典(及其他),還得能推而廣之,因地制宜的設計出“字典”的各種類似體、變形體。