C與C++、C#有什麼關係?

Serials


從歷史時間和語言特性來看,他們有設計參考(

不是替代)關係。

下面是我畫的一個比較概要的關係圖

C到C++

C語言設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器代碼以及不需要任何運行環境支持便能運行的編程語言。

  • 在系統級別,相比彙編,C能兼顧性能和開發效率。

  • 而在應用層級別,尤其是面向對象思想流行以後,C++其實是作為C語言的增強版出現的。相比C,C++提供了更多編程友好性的特性並納入標準,比如虛函數、運算符重載、多繼承、標準模板庫、異常處理、運行時類型信息、名字空間等。
  • 在應用層的設計開發效率和大型工程的設計組織上,C++就比較優勢了,同時也沒有丟棄C的性能優點。

名字:C++這個名字出現是在1983年,客觀看C++並不是簡單的擴展C,它的名字叫++C更合適,但是有點難看,並且C+也已經被佔用了。

標準庫:從K&R C到C89、C99、C11,對比C++和C#,就知道什麼是簡潔舒服了。

GCC的選擇:GCC最先用C開發,從2008年開始移植到C++,理由是性能基本無差別,能設計出更好,更容易維護的程序。詳情可參見Linda Jacobson 2013年3月13日發佈的文章:“GCC's move to C++”。這裡並不是討論C++和C誰好好,而僅僅是在C和C++之間做選擇時取捨點的一個例子。

C++到C#

C和C++的核心開發難點是在內存的管理(自由是把雙刃劍)上;同時C++和C的可移植是建立在源碼級別上或者提供額外的系統抽象層;不同系統間移植以及系統相關接口使用時,需瞭解標準庫的區別以及編譯、鏈接等構建過程的介入。

C#主要是降低C++和C帶來的開發難度,在一定程度上保持性能。用官方的話說就是:“簡單、現代、通用”。豐富的基礎類庫和應用程序模型、無微不至的IDE,微軟就這樣“誘拐”了大量的人上了這條大船。

這裡不能簡單比較C#和C++,還需要加上虛擬機(CLR)一起來看。

C#(這裡換成.Net更合適)和Java一樣,在設計核心是提供自動內存管理二進制級別的可移植性

1、自動內存管理:通過虛擬機(CLR)來提供,即對象的內存分配和釋放由虛擬機來完成,稱為垃圾回收器(GC)。主流的內存管理都拋棄了引用計數,CLR這裡和JVM一樣,也是使用標記清除及壓縮算法;同時採用代齡機制利用局部性原理提升回收性能。

2、二進制級別的可移植性:實際上就是利用中間語言(IL)提供中間層來實現。中間語言同時還提供了基於不同語言(比如VB和C#)的二進制級別共享機制。


如果從進程的角度看,其實要理解.Net程序運行機制就比C++和C難多了,這個也是C#程序員進階的最大難點。看下圖的用戶態堆棧在虛擬中的邏輯結構便可知一二。

上圖源自CoreCLR的wiki資料:Stackwalking in the CLR


關於OS的移植性,NetCore正式版本出來後才算是正式宣佈一個里程碑,Mono差不多可以退出舞臺了。.Net前期注重不同語言的二進制級別共享和封閉式的全家桶,形成鮮明對比的是Java的標準加開源,現實告訴我們,.Net輸得很慘。

名字:在C上面帶上四個+,略顯浮誇。微軟主要想表示C#在一些語言特性方面對C++的提升的意思。

結束

以上只是簡要概述C、C++、C#,他們各自有偏重的設計要點(同時影響了編程模式和設計實現)以及應用場景的差別。如果硬要在語言設計級別來分出個高下的話,一哥PHP沒來,這場辯論會就顯得很生硬。




遷徙de麻雀


C/C++/C#的關係與區別?

1.先說C: C是最早的高級語言,歷史悠久,企業覆蓋廣,任何軟件幾乎都跑在C程序的上面,C更像編程語言的根。學習這門語言能夠理解編程的本質,使得今後的IT職業生涯之路越走越寬。

2.再說C++:C++是完全兼容C的一門具備面向對象特點的語言,使得C的領域從系統級別,橫跨到應用級別,覆蓋領域更加廣泛。C++同時延續了C的全部優點(具備面向過程和麵向對象特點、編程本質掌握程度深)。

3.最後說C#:C#是微軟研發的基於C特點的一門類似於Java的編程語言。其中C#有很多C語言的影子。C#是一門專注於windows平臺開發應用程序的語言,而C/C++是兼容windows和Linux平臺.

Windows應用

C#有.Net框架,C/C++有MFC、QT框架。

遊戲開發

C#有U3D遊戲框架, 而C++也有Cocos2D/3D遊戲框架。

目前市場上的C#能夠解決的方案,C/C++也能夠解決。而且C/C++知識寬度會涵蓋C#的知識。

我們來介紹一下每個層級:

硬件層級:就是實體硬件(包括、CPU、內存、顯卡等)不屬於軟件範疇之內

彙編層級: 幾十年前是在沒有高級語言(C/C++/Java等)之前,是彙編的年代。彙編語言對於人類可讀性非常差,不適合開發,現在由於有編譯器的存在(比如GCC[C語言編譯器]、JVM[java虛擬機]等),可以把“高級語言”寫好的代碼直接轉化成“彙編語言”,所以市場彙編語言的工程師需求量變的很少。而高級語言需求量增大。高級語言的好處在於對於人類的可讀性很好,在編程中可以用一些有含義的英文單詞表示語義。

系統層級:我們知道,我們平時用的所有的APP、或者電腦軟件都是跑在操作系統上的(Windows、Linux、Mac OS、Android、iOS等)。這些操作系統本身的代碼都是C語言實現的,因為C語言是最早的高級語言,也是性能最優的語言,操作系統需要性能,多以都是選擇C語言實現。C語言佔據了整個系統層級,地位穩固,難以撼動!

應用層級:應用層級的程序,更加偏重軟件的程序的執行流程和功能。而開發起來的體量很大,這樣就需要具備面向對象的編程語法,因為面向對象是比較適合人類交流的編程方式。所以類似C++(基於C語言做了完善)、Java這類語言佔主要地位。 應用級別語言編程語義流暢,但是性能依然沒有C語言好。

腳本層級:在這一層級的語言,更加看重編程語義,讓開發者的代碼看上去很直觀,而且寫代碼速度很快。但是有得必有失,增加了代碼的可讀性(給人類看,計算機並不能看懂),編譯器把腳本語言翻譯成彙編語言(計算機能看懂、人類看不懂)的成本就越大,從而延長的翻譯的時間,而導致程序性能下降。


傳智播客


C++是C的親弟弟,而C#是則是他們二者的遠房親戚(其實更像是JAVA的表兄)。這三門語言都是十分優秀的編程語言,也都有很高的運行效率。三種編程語言的應用範圍很廣闊,下面我就來分別介紹一下三種語言的來歷以及應用領域(插圖為經典教材)。

  1. C語言。C語言誕生在大名鼎鼎的美國貝爾實驗室,它的前身是B語言。C語言從誕生之初就獲得了廣大程序員的青睞,由於其簡潔的語法,高效的執行效率(比較接近彙編的性能),在很多領域獲得了廣泛應用。比如操作系統,圖像處理算法,硬件驅動,嵌入式設備編程等等。

  2. C++。儘管C語言已經足夠優秀,但它畢竟是一門面向過程的編程語言,不符合人的思維習慣(人腦的思維習慣有點像面向對象)。於是在這種背景下就誕生了更加強大的C++,之所以說C++是C語言的親弟弟,是因為C++同樣誕生在貝爾實驗室。C++在C的基礎上增加了數據封裝,繼承,多態等編程特性,同時又全部兼容了C語言,使之成為C++的一個子集。C++語言背廣泛用在操作系統,大型應用軟件的開發中。

  3. C#。C#是由微軟公司開發出來用來抗衡Java的一款現代編程語言(具有安全,穩定,簡單的特點)。它吸收了很多Java語言的優點(比如自動垃圾回收),但微軟公司為了避免法律糾紛,下意識的將其語法規則向C++看齊(也在一定程度上吸收了C++的諸多優點)。C#的語法簡單,可以快速上手,開發效率很高,被廣泛應用在了各類應用軟件,遊戲開發之中。

關於三種語言的關係就介紹這麼多,歡迎打擊關注太科羅技頭條號,並在下方積極留言討論。

太科羅技


C就像手動擋的小鋼炮,老司機都喜歡,離合器配合油門,加速快還省油,一腳油門就能超車,就是需要經常要打開發動機蓋檢查是否漏機油,新手開起來還容易熄火。C#是自動擋的車,上班族的最愛,開起來特別容易,只要控制油門和剎車,省心省力,但是你上不了高速,有關部門還沒修好,並且不能去外市,因為是外地牌照不給上路。C++是定製級跑車,改裝人士的最愛,有人開它跑得過F1,有人開起來就像拖拉機。它配有全時四驅,四輪動力獨立分配,城市和越野模式隨意切換,加裝套件還能在水面上開,汽車上能有的功能全部都有,就是沒有行車電腦,所有功能都要自己控制開關。它有四套變速箱,分別控制每個車輪的動力分配,需要你用四個檔位杆來進行換擋,並且還有另外的十幾個按鍵來控制它的差速鎖和空氣懸掛,它也會漏機油,有時還會掉零件,新手不僅容易熄火,還會因為記不住哪個是點火開關而打不著火。


嗨慢點走


三種語言的發展過程回答中已經有很好的說明。這裡說說3種語言的現狀。C語言有時間響應準確的特點,至今仍被廣泛用於各種工業控制系統的底層驅動及控制軟件。C++改善了C語言語法結構過於簡單,不適合開發大型複雜系統的短板,引入了面向對象的思想,受益於對C語言製作的底層程序良好的兼容性,C++被廣泛用於開發各種基礎的應用程序。C++受限於C語言的基本語法框架,無法取消指針操作,被很多倡導面向對象的人士詬病。這也使得C++的語法比較複雜,開發效率遠低於其他面向對象的程序語言。為了彌補這一短板微軟發佈了C#。C#語法結構接近Java等主流面向對象的語言。大幅提升了開發效率。同時,C#還保持了對C甚至是彙編語言的兼容性。技術上說幾近完美。但C#只能在Windows 家族的系統上運行,這個短板極大地制約了它的推廣和普及。


日衝信息 黃


c是鼻祖,是c++和c#的祖宗,通俗比方,c是祖父,c++是伯父,c#是侄兒,c雖有結構、函數、指針等編程思維,但沒有完整的對象概念,c++是對c的改進,採用全新的面向對象的編程思想,類包含數據、函數等,具有良好的封裝性,可以繼承派生,可以多態變化,對於軟件工程規模化開發起到了很好的促進作用,c#繼承了c++的編程思想,但又不同於c++,摒棄了c++的不實用不安全部分,加強優化了系統應用部分,c#依賴.net framework框架,配合採用龐大完善的框架類庫,即時編譯IL中間代碼,兼顧功能和性能,方便各種需求應用開發,特別是當今互聯網web盛行,c#大行其道普及流行


紅塵匆匆過客夢


C++是帶類的C,基本語法都差不多,細節上C++語法會更嚴謹。C++是面向對象的語言,從開發角度來說比C會方便不少,也更容易維護。C#是完全面向對象語言,跟Java一樣的,更容易學習,邏輯相對前兩者更簡單明瞭。


小小的船和彎彎的月兒


c是祖先,c++繼承了c並增加了自己獨特的特性。c#跟前面的關係有,但是不太密切,相當於c的很遠很遠的孫子。java和c#一個輩份的,表兄弟關係。至於javascript 麼,可以理解為野種,是隔壁老王的兒子。


星空147480491


在c的基礎上延伸出來的語言,其實大部分語言都借鑑了c或底層是c

c是低級語言沒有對象,所以有了對象的c叫c++,c#

java和javascript沒啥關係,只是在javascrip剛完成的時候作者覺得java火就取名為javascript


分享到:


相關文章: