摘錄:C 與 C++ 的真正區(qū)別在哪里?

https://www.zhihu.com/question/28834538/answer/1654211948

C是中餐廚師的菜刀,做啥菜就那一把刀,切菜切肉切魚(yú),都是這一把刀,刀工好的師傅,豆腐都能切成一朵花。無(wú)論你提什么概念,都能用指針給你做出來(lái),如果不行,那就用指向函數(shù)的指針,指針的指針,指向函數(shù)指針的指針。。。。

C++就是西餐廚師的刀,有一大堆不同款式的刀,切不同的東西得用不同的刀,每種刀還有不同的手法,顯得非常專業(yè),高大上。

中廚刀,簡(jiǎn)單,但深入高階難,難在復(fù)雜使用技巧,做啥都是這一把刀,要切出花來(lái),刀工需要練的,一般人練不好。

西廚刀,復(fù)雜,但是使用難度相對(duì)低,需要掌握一堆刀的功能限制。但刀太多,功能干涉太多,沒(méi)準(zhǔn)啥時(shí)候沒(méi)吃透就踩坑了。真正吃透也很難。

西餐廚師離開(kāi)這些功能復(fù)雜的西廚刀,就會(huì)顯得手忙腳亂,如果只有一把中廚刀,甚至不會(huì)做菜了。

中餐廚師用這堆西廚刀,會(huì)不耐煩,最后還是挑出一把最順手的,當(dāng)成中廚刀用,其他的閑置。

西餐廚師經(jīng)常炫技方式就是這刀我會(huì)用,那刀我也會(huì)用,組合起來(lái)還會(huì)用。一大堆使用西廚刀的術(shù)語(yǔ)名詞和隱藏小技巧。

中餐廚師炫技方式就是,隨便你提啥需求,我都是用這一把刀給你切出來(lái),刀工還強(qiáng)。

西餐廚師看不起中餐廚師,就一把刀,太簡(jiǎn)陋,沒(méi)逼格。

中餐廚師看不起西餐廚師,一大堆刀,也沒(méi)見(jiàn)菜更好吃,而且那一堆西廚刀的功能,咱就一把中廚刀也能切出來(lái)。

是的,C++所有新特性,用C都能做出來(lái),無(wú)論是面向?qū)ο筮€是函數(shù)式編程還是元編程。所以,不要再說(shuō)C++是面向?qū)ο蟮模鳦是面向過(guò)程的,這不是本質(zhì)區(qū)別。但C腦補(bǔ)編譯器確實(shí)也不是輕松的活。

初級(jí)階段,C比C++容易學(xué),畢竟語(yǔ)法簡(jiǎn)單,關(guān)鍵詞少。

中級(jí)階段,C++更容易更強(qiáng)大。畢竟有強(qiáng)大的編譯器支持,只要掌握這些語(yǔ)言特性,就已能實(shí)現(xiàn)強(qiáng)大的高級(jí)功能。而C還需要腦補(bǔ)編譯器,才能實(shí)現(xiàn)面向?qū)ο蟮雀呒?jí)特性,不是每個(gè)人都能做到,大學(xué)課程也不教這些。

高級(jí)階段,C++可能變成語(yǔ)言發(fā)燒友,各種特性組合會(huì)成為泥潭,牽扯極大的精力。而用C度過(guò)中階段后,更深入理解計(jì)算機(jī)和程序的哲學(xué)本質(zhì)后,會(huì)有一種無(wú)所不能的感覺(jué)。C反而是束縛更少,更自由,更高效的工具。

一個(gè)C++高手,能準(zhǔn)確掌握更多更復(fù)雜的高級(jí)語(yǔ)言特性組合,高效率響應(yīng)業(yè)務(wù)需求,快速迭代,代碼優(yōu)雅簡(jiǎn)潔,魯棒性好,維護(hù)性好,擴(kuò)展性好。

一個(gè)C高手,能掌握更多的基礎(chǔ)模塊實(shí)現(xiàn)方案,什么無(wú)鎖消息隊(duì)列,內(nèi)存管理,線程調(diào)度器,時(shí)鐘,各種算法庫(kù),甚至不同風(fēng)格的面向?qū)ο蟮募軜?gòu),這都是自己純手工打造,然后根據(jù)業(yè)務(wù)需要定制這些基礎(chǔ)模塊的設(shè)計(jì)方案和參數(shù),以追求應(yīng)用業(yè)務(wù)的極致性能,和極致可靠。

C高手往往不太喜歡C++那一套,因?yàn)楹芏鄸|西不能自己掌控。這讓習(xí)慣掌控一切的C程序員覺(jué)得腳下有些發(fā)虛。

C++高手往往也不太喜歡C,因?yàn)楹芏噍喿右约涸?。讓?xí)慣快速響應(yīng)迭代的C++程序員無(wú)比煩躁。

都是圖靈完備的語(yǔ)言。C能做到的,C++肯定能做,畢竟C++是C超集。而C++能做到的,其實(shí)C也能做到,只需要腦補(bǔ)一種編譯范式而已。

如果非要在哲學(xué)上說(shuō)C和C++有什么區(qū)別,那么C是心法派,C++是語(yǔ)法派。

每當(dāng)有新概念新范式出現(xiàn),C++標(biāo)準(zhǔn)組織就會(huì)開(kāi)發(fā)新特性新語(yǔ)法,以提供這種新范式。

而C則腦補(bǔ)一種新的心法(數(shù)據(jù)結(jié)構(gòu)和算法)來(lái)解決,在語(yǔ)法層面盡量少增加特性,幾乎很少變化。

C和C++又有點(diǎn)像武俠之氣宗和劍宗

入門(mén)是氣宗C簡(jiǎn)單,入門(mén)要學(xué)的東西少。而劍宗C++不僅要學(xué)氣宗的C,還需要學(xué)劍宗的這些++,入門(mén)就復(fù)雜一些。

修煉進(jìn)展,是劍宗C++來(lái)的快,畢竟有一大堆現(xiàn)成的語(yǔ)法范式,不需要知其所以然,只需會(huì)用,就能發(fā)揮劍宗招式的威力。而氣宗C還要掌握一大堆基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)和算法以及設(shè)計(jì)范式,研究精深,知其所以然,才能真正發(fā)揮威力。

上限,是氣宗C來(lái)的高。等真正深入到高階編程,會(huì)發(fā)現(xiàn)每一種現(xiàn)成的語(yǔ)法范式和庫(kù),某種意義上,便捷的另一面就是束縛。語(yǔ)言編譯器做的工作越多,庫(kù)越強(qiáng)大,編程束縛反而越大;而語(yǔ)法越少編譯器越簡(jiǎn)單,反而自由度越高而且越穩(wěn)定可靠,可供發(fā)揮的上限也越高。

對(duì)于以C為主的高水平團(tuán)隊(duì),C現(xiàn)有的語(yǔ)法不是太少,而是多了,反而還要設(shè)定一些編程規(guī)范加以限制。所以一些真正經(jīng)典優(yōu)美的C代碼,往往都是樸實(shí)無(wú)華的,很少在語(yǔ)句技巧層面炫技。

以C++為主的高水平團(tuán)隊(duì),也常常制定編程規(guī)范,對(duì)語(yǔ)法使用加以限制,限制可能比C更多。

一個(gè)團(tuán)隊(duì)水平高低,從其編程規(guī)范就可見(jiàn)一斑。水平越高,往往規(guī)矩越多。

當(dāng)然,真正的高手,都是氣劍雙修的,在語(yǔ)法層面幾乎都是樸實(shí)無(wú)華,從不炫技,人家炫的是思想。


有人想聽(tīng)Python是什么刀。

嗯,竊以為,Python更多像速凍食品。

速凍食品能快速的滿足需求填飽肚子,而不是餓著肚子還需要洗切烹飪,在底層原料處理環(huán)節(jié)消耗大量的時(shí)間精力。

Python最大優(yōu)勢(shì)就是用起來(lái)方便。不是每個(gè)人都需要懂編譯器實(shí)現(xiàn),各種算法的細(xì)節(jié),各種指針的奇技淫巧。大部分人需要的只是快速方便的解決現(xiàn)實(shí)問(wèn)題。

所以,與其說(shuō)Python兼容面向?qū)ο蠛?a target="_blank">面向過(guò)程,不如說(shuō)Python是面向問(wèn)題的。

Python的編譯器,和大量的庫(kù),都是用C/C++寫(xiě)的,會(huì)熟練使用這些庫(kù),也就站在了巨人的肩膀上,還不是一個(gè),是一群巨人。掌握這些,足以快速的解決多數(shù)問(wèn)題。

那么速凍食品就沒(méi)有逼格,手工現(xiàn)做就有逼格?其實(shí)也不是,一切從現(xiàn)實(shí)需求出發(fā),能最快最好滿足需求的工具,就是最好的工具。

Python高手,會(huì)掌握大量的庫(kù)和設(shè)計(jì)范式,信手拈來(lái),快速滿足需求。

而進(jìn)階Python高手,還會(huì)自己用C來(lái)做庫(kù),以在某些特殊場(chǎng)景下,突破開(kāi)源庫(kù)的功能和規(guī)格束縛。


又有朋友問(wèn),JAVA,C#,VB,VBA是什么刀?

這真當(dāng)咱是刀匠嗎?還是鐵匠? 嗯 ? ~ o( ̄▽ ̄)o

好吧,所有的刀款式,這回一次性解決。

所有編程語(yǔ)言,本質(zhì)上都是工具。

所有刀,本質(zhì)上也是工具。

都是工具,工具間,自然有類似特征,會(huì)有些相通之處。

理解這些有趣的相通之處,有利于我們快速的掌握一種新工具。而不是迷失在新工具的細(xì)節(jié)之中。

而這些有趣的相通之處,其實(shí)并不是孤立零散的。

掌握這些有趣相通之處的分布規(guī)律,可以更深刻的理解這些相通之處。

然后,對(duì)新工具理解,就是二次方的深刻度。

就像練武,學(xué)會(huì)心法,招式訓(xùn)練效果倍增。

而學(xué)會(huì)心法的心法,功力提升速度則加速到二次方。

二次方程,需要一個(gè)坐標(biāo)軸。

建立坐標(biāo)軸,首先需要一個(gè)零點(diǎn),然后需要一個(gè)無(wú)窮遠(yuǎn)。

從零點(diǎn)到無(wú)窮遠(yuǎn),就是一個(gè)數(shù)軸。

當(dāng)你內(nèi)心建立起這樣一個(gè)數(shù)軸,所謂心法的心法,就水落石出,一目了然,不需要?jiǎng)e人告訴你特征,打比方解釋給你聽(tīng),扯什么中式菜刀和西式廚刀的故事。

你自己就可以發(fā)現(xiàn)規(guī)律。

你自己就可以打無(wú)數(shù)的比方,信手拈來(lái)。

那么,編程語(yǔ)言的零點(diǎn),在哪里?

圖靈機(jī)。

是的,圖靈機(jī),是近幾十年來(lái)一切計(jì)算機(jī)技術(shù)的起點(diǎn)。

那么,無(wú)窮遠(yuǎn),又在哪里?

宇宙間萬(wàn)事萬(wàn)物的無(wú)限復(fù)雜度,不正是無(wú)窮遠(yuǎn)嗎?

當(dāng)我們從圖靈機(jī)出發(fā),去解決宇宙間萬(wàn)事萬(wàn)物的無(wú)限復(fù)雜的過(guò)程,就是從零點(diǎn)到無(wú)窮遠(yuǎn)的過(guò)程,就產(chǎn)生了數(shù)軸。

一旦有了數(shù)軸,所有的芯片架構(gòu)和編程語(yǔ)言,都可以在這數(shù)軸上有一個(gè)位置,也就是坐標(biāo)。

當(dāng)你俯瞰這些坐標(biāo)構(gòu)成的散點(diǎn)圖,哦,原來(lái)如此,不過(guò)如此,就像魔術(shù)師的技巧被解密了。

讓我們出發(fā)。

圖靈機(jī)是零點(diǎn),第一個(gè)點(diǎn)在哪里?

馮諾依曼架構(gòu)。

圖靈機(jī)是數(shù)學(xué)理論上的抽象模型,而馮諾依曼架構(gòu)個(gè)是可落地的工程計(jì)算架構(gòu)。

實(shí)現(xiàn)馮諾依曼架構(gòu),需要一套指令集、一些指令集配套的寄存器、運(yùn)算單元、地址總線、數(shù)據(jù)總線、內(nèi)存等。然后,就可以開(kāi)始機(jī)器碼的編程。

基于CPU指令集的機(jī)器碼編程,可比基于圖靈機(jī)的機(jī)器碼編程來(lái)的高效的多。

但,每一步效率的提升,都是拿自由兌換的。

指令集也不例外,有位寬的限制,有指令位寬的區(qū)別,有寄存器的區(qū)別,有精簡(jiǎn)指令集復(fù)雜指令集區(qū)別,等等,等等。

指令集,正是編程遇到的第一次束縛。

所以,從馮諾依曼架構(gòu)開(kāi)始出發(fā),有各種各樣的指令集。試圖用不同的實(shí)現(xiàn)折中,來(lái)?yè)Q取不同的效率優(yōu)化。

機(jī)器碼編程太累,就有了匯編。匯編跟機(jī)器碼幾乎是一一映射,無(wú)損壓縮。

匯編還是累,就有了一些初步的高級(jí)語(yǔ)言,如廣泛應(yīng)用成熟的C。

C提供了函數(shù),方便了程序設(shè)計(jì),但卻剝奪了CPU寄存器的可見(jiàn)性,戴上了??臻g的束縛,等等。

C++提供了面向?qū)ο蟮恼Z(yǔ)法便捷,但面向?qū)ο髤s限制了指令交叉訪問(wèn)數(shù)據(jù)的自由和效率。

Java等語(yǔ)言提供了內(nèi)存管理便捷,但剝奪了程序自主內(nèi)存管理的自由和效率。

面向宇宙萬(wàn)物的無(wú)限復(fù)雜度,每一步編程效率的提升,都是拿自由兌換的,毫無(wú)例外。

當(dāng)我們想要更大的便捷性和功能,就面向具體問(wèn)題,以可以忍受的些許自由代價(jià),來(lái)?yè)Q取解決具體問(wèn)題的范式,以此獲得效率的提升,也就是更高級(jí)的語(yǔ)言。

當(dāng)我們想要更大的自由度,就向零點(diǎn)回退。

踩著前人的腳步,熟悉每一步自由換取便捷的手法,你心中就有了數(shù)軸。

有了數(shù)軸,你就可以俯瞰所有的語(yǔ)言、程序、和架構(gòu)設(shè)計(jì)。

熟悉這一切,你甚至可以根據(jù)需要?jiǎng)?chuàng)造新的編程語(yǔ)言,新的設(shè)計(jì)范式。

就是這樣而已,沒(méi)什么魔法。

本文完。

課后作業(yè):

圖靈機(jī)真的是零點(diǎn)嗎?

這個(gè)軸的負(fù)數(shù)方向意味著什么?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容