程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 關於C和C++一些大神們的討論

關於C和C++一些大神們的討論

編輯:C++入門知識

關於C和C++一些大神們的討論


知乎上曾經有一個關於C和C++語言的討論,弄的沸沸揚揚。

余天升
開源社區一直都不怎麼待見C++,自由軟件基金會創始人Richard Stallman認為C++有語法歧義,這樣子沒有必要、非常瑣碎還會和C不兼容,並且還帶來不了什麼非常大的好處。
having ambiguous grammar and “gratuitous, trivial, incompatibilities with C (…) that are of no greatbenefit”
Linus Torvalds也說,C++是一種可怕的語言,而使用它的一大群水平很次的程序員,使得它變得更加可怕。
“C++ is a horrible language. It’s made more horrible by the fact that a lot of substandard programmers use it”
C++本身的語法是好的,但是過於的復雜,尤其像繼承這些特性被亂用了以後,面向對象的那些優勢會在那些質量糟糕的代碼前面完全喪失,有時候還會使得代碼非常費解。
容易被誤用語法特性而可能會變得很糟糕的C++,加上兩位大神的抵制,理所當然在開源陣營裡面流行不開。

Levski
我覺得@余天升 說的已經相對完整了。但是我覺得大家的回復還是偏片面了一些。而且部分回復的火力主要集中在評價這兩種語言上,實際沒有回答LZ的問題。

首先,應該從開源社區的風格來說,“一個大集市”我認為是一個比較恰當的比喻,一個吵吵嚷嚷的地方,必然每個項目都可以決定自己項目的開發方式。由於現在彼此之間相互依賴的開源項目大多數都是以Linux平台為開發對象,所以自然和Linux平台自身提供的技術解決方案保持一致是一個比較容易想到的技術策略。

其次,因為Linux社區中的領軍人物對C++抱有顧慮(先不談這個顧慮是否是正確的),導致Linux社區對C++的顧慮比較大。

那麼LZ的問題就可以轉化成開源社區對C++的顧慮究竟是正確的,還是錯誤的?我的看法是既正確,也錯誤。而原因都在於精英治理。

由於Linux內核,以及核心的GNU軟件,開發者都是技術上數一數二的精英。所以他們的產品目標,和第三方公司基於Linux平台開發的軟件產品目標,略有不同。包括 Linus Torvalds在內的精英們都害怕因為不好的代碼而“毀掉”一個優良的作品(當然還有其他的因素)。

而反觀一些商業上比較成功的軟件,並沒有過分強調技術性上的“純粹性”,而是更多的以商業利益為導向,我認為他們的成功很大程度上是因為他們深刻認識到人的思維很容易將大的問題做分解,但是比較難將小的解決方案組合成大的解決方案。而在這方面,C++應該比C更有優勢,更能通過接口、通過封裝降低產品各個部分的復雜度,不僅使開發者能夠更容易的進行開發,也更能夠讓需求分析、設計更容易貼近用戶實際的使用方式,而不用過分考慮其實現形式是否能夠承載。

總之,這兩種語言更大的區別我覺得在於設計的哲學,正是由於這種哲學上的不認同,導致了開源項目更多的使用C而不是C++。

李垚
《C專家編程》第二章《這不是Bug,而是語言特性》裡有一句話:

它(C++)對C語言中存在的一些最基本的問題沒有什麼改進,而它對C語言最重要的擴展(類)卻是建立在脆弱的C類型模型上。

第十一章《你懂得C,所以C++不在話下》裡還有一段話:

編程語言有一個特性,稱為正交性(orthogonality)。它是指不同的特性遵循同一個基本原則的程度(也就是學會一種特性有助於學習其他的特性)。例如,在Ada中,程序員一旦明白了包(package)的工作原理,也就能夠把這個知識應用於泛型包中。令人不快的是,C++中的許多特性是非正交的。精通C++的某個特性並不能給你帶來什麼線索或向你啟發適用於其他特性的思想模型。大多數程序員選擇了只使用C++中較簡單的一個子集的方法。

vczh
STL作為一個模范放在那裡人們都不看,非要去寫
披著C++外衣的C語言
披著C++外衣的java
中槍踩坑學不會都是正常的。這根本不是C和C++哪個好的問題,是大眾對C++的誤解造成的。在用C++的時候,自己水平不高,就不要去用C的部分。都是因為人類的意志力太脆弱,才造成這麼多問題的。

Wilson Xu

從Github的語言排行榜(https://github.com/languages)看來,C比C++多了將近一倍。
原因:對於面向對象的編程語言, 除C++外還有許多更好的選項,比如Ruby、Python、PHP和Java(全都比C++排名先前);相反,C的代替品不多。

白順龍
1 歷史原因, C的歷史悠久,基礎項目多,很多40多歲的大牛也是基本用C用的多
2 C++屬於實驗性質的先驅,很多東西都是在C++裡面廣泛應用起來才推廣的,面向對象,泛型等,另外繼承C的一些不良東西,導致臃腫瑣碎,上手容易,產生高質量的代碼不容易,標准不穩定,編譯器很後時才支持的比較好。
3 Linus說的很對,關鍵是設計,如果借鑒設計模式的一些想法,C一樣可以寫的很好,如果習慣了,開發效率未必會比C++低
4 現代的軟件設計講究模塊化設計,各模塊分工好了,整個項目不必使用同一種語言,C++的生存空間被壓縮不少
5 其實C++在一些大項目上應用還是比較廣的,比如symbian, windows,llvm,zeromq, mongodb, ecos,chrome, ace,qt, flash 在需要面向對象的時候,使用C來做還是有些啰嗦, 可以對比下Gtk裡面的C代碼。google和microsoft很喜歡c++
6 C++易學難精,很容易糾結到語言細節中,而忘了項目。
7 C++還是很有發展前途,一些必須用native code的,如果不是用C的高手,用C++還是寫的快。
8 還忘了一條,C語言都是一個人從頭定義的,標准委員會只是略打個補丁。C++是委員會妥協(商業政治和技術)的結果,所以混亂,標准制定進度緩慢。來自於不同的想法,沒有很強的一致的風格。不過C++畢竟是需求推動起來的,所以還是符合了開發的需要。

Dion
(1)C++比C多了很多特性,讓用C++寫出來的代碼容易不倫不類。
從風格上來說,鐘愛C的程序員可能不喜歡。

(2)兼容性。
雖然C++在絕大部分情況下是可以兼容C的,但在某些情況,還是不得不使用 extern C 這樣的代碼。

(3)我還是認為 C++ 比 C 優秀很多,如果你能很好地駕馭它。
C++ 也是在不斷改進(ANSI C99、C++0x),以及很早就有了 Boost。
C++ 大師 Bjarne Stroustrup 回答過很多人的一個疑問,大致就是說“C++特性太多了,變得很臃腫,你會不會考慮裁掉一些特性”。他給的答案是“不會,無論是異常、多重繼承、還是RTTI”。
原因很簡單。如果說多重繼承會帶來問題,難道C的指針不會嗎?還是那句話,只要你能很好地駕馭它!

Bill Cheng
就我個人來說,作為一個C++程序員,我永遠是被C程序員擺在瞧不起的位置,所以開源軟件這種證明程序員榮譽的東西,怎麼能讓那些高傲的人低下頭來使用C++呢……
說起來,本人一路低頭,從C++學到JAVA再到OB-C……越來越被同行瞧不起……

任衛
我認為就是推廣,C本來接受度就更好,各種編譯器全部可以編譯,任何項目都可以借鑒,而且C更簡單易維護。C就是首選。不但要首選C,若有可能要做到Clean-C.
我覺得可推廣性考慮完全擊敗linus和大胡子

路飛
作為開源項目,和封閉項目不同,要盡量支持更多的平台,對開發環境也不能做太多要求和指定。C 語言比較簡單,編譯器穩定可靠。而 C++ 雖然有一個標准,但是實踐中,各個編譯器的實現都不同程度地偏離了標准。這種差別是很惱人的,為項目帶來很多麻煩。這時采用純 C 而不是 C++ 就是一個十分合理的選擇。

另外,開源項目很多是基礎類庫,而 C++ 在很多平台缺乏統一而穩定的二進制接口,無法做到二進制復用。(很遺憾,像 Boost 這樣難得一見的著名開源 C++ 項目,在不尊重二進制接口的穩定性這一點上,又是臭名昭著。)那麼,從節約用戶的編譯時間和環保的角度考慮,開源項目采用純 C 而不是 C++ 也是有理有據的。

Snow
C++ 編譯器做了很多額外的工作,如程序員不合格,隱藏很多bug。

匿名用戶
c++過於復雜,絕大多開發者都不能完全掌握c++所有的特性(c++iso文檔有600頁你讀完了?boost你都看懂了?)c++的另一個問題是不少程序員 包括我 在使用時,不少設計是利用了語言的一些特性,造成了設計上的不良。到最後就很難修改了。某牛說過c++是座山,世界上最大的屎山。我認為也是源於此吧。總之c++容易寫出復雜而晦澀也不易修改的代碼,這一切不是c++的錯。但在c++裡很容易發生。這是門給iq190
以上人用的語言,但太多iq70的人在用,所以大牛門紛紛不用了。

牟小峰
c++太復雜了,c++寫的庫也很復雜,比如stl和boost,調試不方便,不如c清晰簡單直接。

宋業文
C相對於C++而言簡單、快速、靈活,C++ 復雜到超出絕大部分精英程序員的控制,而對他們而言用C同樣可以實現優雅的繼承、封裝和多態。C++ 側重於考驗一個人的架構能力,而這種能力對程序員有著很高的要求,稍有不慎,就會傷到自己,還不如用C來實現更完美。

zhenghui zhou
這種問題的答案的首要因素不應該是代碼積累/沉澱/延續嗎?為什麼現在人都把精力放在語言特性的比較上?就算很多認識並較好掌握了復雜語言特性的他們,是否有足以拿得出手的項目/代碼可以分享或者重用。
顯然開源的老祖宗GNU(Gnu’s Not Unix)是脫胎於Unix文化,C語言那個時候也已經得到了普遍的接受,兼容性也是最好的,用c並延續已有的c的成熟經驗和代碼是最自然的事。幾乎所有流行的linux環境也都是在這個基礎上被搭建起來的,在沒有足夠大的改變開發工具的必要性來推動的話,這麼慣性會延續很久。(其實已經逐步在改變,比如gcc轉換到c++上開發)
任何一個仔細考察和研究開源項目,或哪怕僅僅GNU項目本身的人都會發現其中蘊含的是一個巨大的寶庫。實際上對於從微軟/單機時代走過來的每一個人,在介入到網絡(Fidonet/Internet)那一霎時,無不對突然暴露在眼前的源代碼項目充滿好奇,就仿佛突然發現了寶藏一般迫不及待要去挖掘。
C++乃至後續的項目的確給出了更多的方便編寫代碼的特性,但因為目前使用的馮氏計算機體系結構以及底層都是類Unix的操作系統也決定的的這些特性都可以通過C這個馮氏匯編語言實現,最多是偶爾稍過繁瑣,這種現狀暫時還不會得到改變,至少在自動生成代碼的量占據一定比例以前。
那麼從項目沉澱的角度看,一個最少抽象,又已經有足夠底層支撐的語言是最適合用於開發希望被大眾接受並廣為傳播的開源項目的。盡管眼下基本上各種流行語言都有不少的類似項目,但如果以一定的質量/價值/普適性閥值做一個過濾的話,基於c的項目可能存活下來的概率是最高的。越是新潮的高級的東西,要不是只是作為練手的玩具,要不往往僅局限於一個某個較窄的應用場景。
所以某些高級的東西,它們的確能夠提高某個具體項目的開發效率,但其中提高最多的是那些隨心所欲的成分,而真正能夠拿來重用那部分沉澱/積累的東西並不會因此改變太多。人們往往發現每當一個高級的東西被發掘出來,能夠得到流行的關鍵往往是其自身究竟積累到何種程度,實際上每次這個積累過程很可能只是一個重新制造輪子的過程,盡管這些個新造的輪子可能表面顯得更加漂亮和光滑。

王翀
沒那麼復雜吧,就是c存在的時間長而已 c本身是優秀的語言,所以一直活到現在。舊時代的項目沒有更換語言的理由 但如果看這遠些,互聯網時代出生的開源項目,基本就是使用新興語言了。如果還要高性能,c++是不多的選擇之一 其實c++11不該和老c++相提並論的

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
我覺得吧,這個話題有點老了,C++11的出現讓C++重新煥發了生命力,而且近兩年的排名也不錯。確實C++很危險,但是事在人為。
最後看圖:
這裡寫圖片描述

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved