相對其他語(yǔ)言,C 是難了幾個(gè)數量級,首先在于語(yǔ)言的目標:
1. 足夠的接近底層,從而追求極致的性能操控
2. 支持多范式編程,來(lái)管理不同維度的復雜性
這兩個(gè)目標在某種程度上是有些矛盾的, 很多語(yǔ)言在追求抽象性的時(shí)候,往往要犧牲性能。在追求性能的時(shí)候,往往要犧牲抽象性(暴露實(shí)現細節)。
而C 是野心最大的語(yǔ)言,試圖兩者都追求,但這個(gè)代價(jià)就是需要提供給程序員足夠的freedom來(lái)根據情況作設計tradeoff。
這個(gè)freedom在C 編程中有各種體現。比如傳參:Java中,傳參很簡(jiǎn)單,依賴(lài)類(lèi)型的不同就兩種方式;但C 的 傳參簡(jiǎn)單來(lái)說(shuō)就有 傳值、傳引用、傳指針。
這其中每一種又有各種類(lèi)型,如指針的指針,指針的引用.....再加上const修飾,又是各種變體....再拿內存管理來(lái)說(shuō),C 允許程序員很精細地控制,對象放在stack上、還是heap上。而絕大多數語(yǔ)言都是 類(lèi)型直接決定了對象在heap還是stack上,程序員沒(méi)有任何控制自由度。
C 也允許程序員確定性刪除 堆內存,即delete 析構函數,這又帶來(lái)一系列復雜度......再拿面向對象來(lái)說(shuō),C 支持多繼承,支持對繼承設置不同的保護級別。
對于多態(tài),允許程序員控制哪些函數為virtual,哪些不為virtual.... 而大多數語(yǔ)言如Java,只支持單繼承、只支持public繼承,實(shí)例函數默認為virtual還有很多很多地方C 有各種自由度。 個(gè)人經(jīng)驗,在每一個(gè) 細節技術(shù)feature,C 都提供了 至少3個(gè) 以上的options,而大多數語(yǔ)言只提供1個(gè)選擇。
然后很多技術(shù)feature又有交叉組合的情況,那么feature A * feature B * feature C,假設每一種是3種options,那么就是27種。如果每一種是2種options, 也有8種。
所以,從可選擇的freedom上來(lái)講,C 比其他語(yǔ)言的復雜度至少在10倍以上。所有這些,都是C 之父Bjarne Stroustrup 在設計之處就為C 定下的基調:
1. Direct access to hardware
2. Zero-overhead abstraction
3. Stability and portability
C 對硬件操控的追求,所謂Direct access to hardware,也是其他語(yǔ)言所不能及的。
其他絕大多數編程語(yǔ)言(比如Java、C#、Swift....)設計目標都是,通過(guò)足夠的abstraction 讓程序員focus在業(yè)務(wù)上,忘掉機器。
大多數非C 程序員, 程序寫(xiě)多了,就忘了computer system是啥了。但C 語(yǔ)言,程序員必須拉回到Computer System層面的深入理解,memory, cpu, gpu, cache, disk, I/O...... 不一而足,這也是我們常常說(shuō)C 是一門(mén)System-Level 的編程語(yǔ)言。
這種感覺(jué)大概是 非C 的程序員很難理解的吧。