為什麼說 C 語言是系統級編程的首選?

為什麼說C語言是系統級編程的首選? 它和C++、JAVA這類面向對象語言相比。在系統級編程時有哪些優勢?


因為 C 的很多特性都適合拿來「亂搞」(比如指針算數),偏偏寫操作系統經常需要「亂搞」


其一,所有系統幾乎都是用C語言開發的,說家鄉話自然要比說那些時髦的Python之類的來的親切

其二,是由系統編程的要求決定的,性能,是他的首要要求,在所有語言當中,C的性能恐怕是第一的了吧。當然,彙編的性能比他更高,但是太複雜繁瑣,得不償失。所以只有選擇C語言。


大家似乎都回答了為什麼C語言適合系統開發,或者開發系統,沒有說為什麼是首選。正如@陳良喬 所說,C語言之所以是首選,因為我們見到的大部分系統,Windows、Linux、FreeBSD都是C開發的。大家都提到了為什麼C適合系統開發,我只補充一點,就是C語言是為了開發操作系統而生的,所以適合開發操作系統也是必須的。

系統用什麼開發的,當然就用什麼作為系統開發的首選。Symbian是C++開發的,C++就是Symbian系統級開發的首選。如果有一個系統是用Java開發的,那那個系統開發的首選語言,也一定是Java。不過很可惜,真正能夠用來開發操作系統的語言並不多,而Java、Python這些都是在C之上實現的。


系統編程歸根結底是 toolchain 的問題。怎麼和彙編對接,怎麼和 OS 對接,怎麼和 ROM/BIOS 對接。都要有人解決。僅僅有人解決還不夠,還要考慮這個解決的方式是不是大眾都認可接受的。

比如說 Ruff 這樣的系統,只要需要解決的 tool 都有了,拿 JavaScript 來搞系統開發也不是不行。但是問題是有沒有幾百個廠家一起支持 Ruff 的模式?在 Ruff 上的經驗能不能遷移到其它硬體系統?在同樣的硬體上還有沒有 Ruff 之外支持 JavaScript,都是問題。

C 語言的特性,不是支持系統編程必須的。但是 C 語言的特性成就了一個生態和一段歷史。人不能和歷史進程抗爭。


《黑客與畫家》里說過:C語言是操作系統的腳本語言

其它的大多語言是其對應虛擬機制的腳本語言,若要做系統編程,當然選擇為這個操作系統本身預設的腳本語言了


大約可歸納成三點吧

1 語法簡約性以及操作的靈活性

2 面向底層的特性(這兩點PK掉java python等高級語言)

3 便於移植性 (PK掉彙編)

歡迎補充 :-)


1、執行效率

2、操作內存、CPU、匯流排等硬體,如操作BIOS、8259、鍵盤控制器之類的東西彙編、c、c++這種編譯型語言比較擅長, 但是java、python之類的解釋型語言就鞭長莫及了

3、想像cpu執行一條指令僅僅是一段01碼,c語言編譯完成之後就是二進位執行文件(雖然elf、exe等也包含很多複雜的節頭之類的,但是只需要稍加挪動就是一段數據段和代碼段完整的二進位),想想java和python吧,先要翻譯成位元組碼,然後還要把位元組碼搞成計算機認識的01碼,雖然你可以通過再寫一個由位元組碼轉01碼的「編譯器」,但是不覺得費時費事嗎?而且效率明顯達不到,我見過有項目在做c#操作系統(不過最底層也顯示用c起一個c#解釋器),效率可想而知了


系統級編程說得比較泛,直接寫操作系統的機會應該比較少,給操作系統寫驅動、插件這類事情更多一些,統稱系統組件吧。另外,給有或者沒有操作系統的硬體寫系統也比較常見。

編程語言核心是要提供足夠的能力描述演算法邏輯,同時提供演算法執行的必然需要用到的內存進行映射的類型系統和管理機制。

前面這點圖靈完備的語言都可以搞定,有許多語言的表達能力遠比 C 強,但 C 已經足夠用了。C 語言有 GOTO,這個現代語言基本都不支持,這玩意濫用有害,善用很爽,處理異常情況不需要引入心智負擔和運行時負擔太重的異常機制。

後面這點是 C 威力大的地方, C 的類型系統是對不同位元組數內存的直接映射,想用必須搞清楚,也容易搞清楚,系統編程一大半時間都在折騰內存,一般對內存耗用量非常敏感,所以用 C 會覺得很爽。

C 是一個特別小的語言,沒有太多語言內置的基礎設施,I/O甚至堆內存管理全靠庫,而這個庫在不同環境完全可以隨便換,語言本身對不同平台支持沒有設置障礙,標準庫小也方便移植。在開源的 GCC/LLVM 基礎上打造一個工具鏈會容易一些。

所以一直有個說法,C 偉大之處在於,它作為高級語言提供了對機器的最小抽象。


我只回答和c相關的,

因為 Dennis M. Ritchie同時發明了unix和c,並用c重寫了unix, unix實在是太成功,以至於後面的操作系統都在它影響之下,使用c作為開發語言,

因為和最底層操作系統打交道,最直接的,當然是使用c,

我不喜歡說什麼是歷史的必然,只是c足夠好,歷史選擇了c,


c語言中的概念和語法更加接近於底層機器的實現方式


其實沒有多大優勢,這是個歷史問題,不是技術問題。

硬要說技術原因,大概是它最接近彙編和機器。


如果用java。。

?360提示您【您的開機時間為10分59秒,擊敗全國99%的電腦,希望您再接再厲】


這是每個遊戲編程FAQ里都有的問題。這個問題每星期都會在遊戲開發論壇上被問上好幾次。這是個很好的問題,但是,沒人能給出簡單的答案。在某些應用程序中,總有一些計算機語言優於其他語言。下面是幾種用於編寫遊戲的主要編程語言的介紹及其優缺點。希望這篇文章能幫助你做出決定。

1、C語言

如果說FORTRAN和COBOL是第一代高級編譯語言,那麼C語言就是它們的孫子輩。C語言是Dennis Ritchie在七十年代創建的,它功能更強大且與ALGOL保持更連續的繼承性,而ALGOL則是COBOL和FORTRAN的結構化繼承者。C語言被設計成一個比它的前輩更精巧、更簡單的版本,它適於編寫系統級的程序,比如操作系統。在此之前,操作系統是使用彙編語言編寫的,而且不可移植。C語言是第一個使得系統級代碼移植成為可能的編程語言。

C語言支持結構化編程,也就是說C的程序被編寫成一些分離的函數呼叫(調用)的集合,這些呼叫是自上而下運行,而不像一個單獨的集成塊的代碼使用GOTO語句控制流程。因此,C程序比起集成性的FORTRAN及COBOL的「空心粉式代碼」代碼要簡單得多。事實上,C仍然具有GOTO語句,不過它的功能被限制了,僅當結構化方案非常複雜時才建議使用。

正由於它的系統編程根源,將C和彙編語言進行結合是相當容易的。函數調用介面非常簡單,而且彙編語言指令還能內嵌到C代碼中,所以,不需要連接獨立的彙編模塊。

優點:有益於編寫小而快的程序。很容易與彙編語言結合。具有很高的標準化,因此其他平台上的各版本非常相似。

缺點:不容易支持面向對象技術。語法有時會非常難以理解,並造成濫用。

移植性:C語言的核心以及ANSI函數調用都具有移植性,但僅限於流程式控制制、內存管理和簡單的文件處理。其他的東西都跟平台有關。比如說,為Windows和Mac開發可移植的程序,用戶界面部分就需要用到與系統相關的函數調用。這一般意味著你必須寫兩次用戶界面代碼,不過還好有一些庫可以減輕工作量。

用C語言編寫的遊戲:非常非常多。

資料:C語言的經典著作是《The C Programming Language》,它經過多次修改,已經擴展到最初的三倍大,但它仍然是介紹C的優秀書本。一本極好的教程是《The Waite Group"s C Primer Plus》。

2、C++

C++語言是具有面向對象特性的C語言的繼承者。面向對象編程,或稱OOP是結構化編程的下一步。OO程序由對象組成,其中的對象是數據和函數離散集合。有許多可用的對象庫存在,這使得編程簡單得只需要將一些程序「建築材料」堆在一起(至少理論上是這樣)。比如說,有很多的GUI和資料庫的庫實現為對象的集合。

C++總是辯論的主題,尤其是在遊戲開發論壇里。有幾項C++的功能,比如虛擬函數,為函數呼叫的決策制定增加了一個額外層次,批評家很快指出C++程序將變得比相同功能的C程序來得大和慢。C++的擁護者則認為,用C寫出與虛擬函數等價的代碼同樣會增加開支。這將是一個還在進行,而且不可能很快得出結論的爭論。

我認為,C++的額外開支只是使用更好的語言的小付出。同樣的爭論發生在六十年代高級程序語言如COBOL和FORTRAN開始取代彙編成為語言所選的時候。批評家正確的指出使用高級語言編寫的程序天生就比手寫的彙編語言來得慢,而且必然如此。而高級語言支持者認為這麼點小小的性能損失是值得的,因為COBOL和FORTRAN程序更容易編寫和維護。

優點:組織大型程序時比C語言好得多。很好的支持面向對象機制。通用數據結構,如鏈表和可增長的陣列組成的庫減輕了由於處理低層細節的負擔。

缺點:非常大而複雜。與C語言一樣存在語法濫用問題。比C慢。大多數編譯器沒有把整個語言正確的實現。

移植性:比C語言好多了,但依然不是很樂觀。因為它具有與C語言相同的缺點,大多數可移植性用戶界面庫都使用C++對象實現。

使用C++編寫的遊戲:非常非常多。大多數的商業遊戲是使用C或C++編寫的。

資料:最新版的《The C++ Programming Language》非常好。作為教程,有兩個陣營,一個假定你知道C,另外一個假定你不知道。到目前為止,最好的C++教程是《Who"s Afraid of C++》,如果你已經熟知C,那麼試一下《Teach Yourself C++》。

3、我該學習C++或是該從C開始

我不喜歡這種說法,但它是繼「我該使用哪門語言」之後最經常被問及的問題。很不幸,不存在標準答案。你可以自學C並使用它來寫程序,從而節省一大堆的時間,不過使用這種方法有兩個弊端:

你將錯過那些面向對象的知識,因為它可能在你的遊戲中使得數據建模更有效率的東西。

最大的商業遊戲,包括第一人稱射擊遊戲很多並沒有使用C++。但是,這些程序的作者即使使用老的C的格式,他們通常堅持使用面向對象編程技術。如果你只想學C,至少要自學OO(面向對象)編程技術。OO是模擬(遊戲)的完美方法,如果你不學習OO,你將不得不「辛苦」的工作。

4、彙編語言

顯然,彙編是第一個計算機語言。彙編語言實際上是你計算機處理器實際運行的指令的命令形式表示法。這意味著你將與處理器的底層打交道,比如寄存器和堆棧。如果你要找的是類英語且有相關的自我說明的語言,這不是你想要的。

確切的說,任何你能在其他語言里做到的事情,彙編都能做,只是不那麼簡單 — 這是當然,就像說你既可以開車到某個地方,也可以走路去,只是難易之分。話雖不錯,但是新技術讓東西變得更易於使用。

總的來說,彙編語言不會在遊戲中單獨應用。遊戲使用彙編主要是使用它那些能提高性能的零零碎碎的部分。比如說,毀滅戰士整體使用C來編寫,有幾段繪圖程序使用彙編。這些程序每秒鐘要調用數千次,因此,儘可能的簡潔將有助於提高遊戲的性能。而從C里調用彙編寫的函數是相當簡單的,因此同時使用兩種語言不成問題。

特別注意:語言的名字叫「彙編」。把彙編語言翻譯成真實的機器碼的工具叫「彙編程序」。把這門語言叫做「彙編程序」這種用詞不當相當普遍,因此,請從這門語言的正確稱呼作為起點出發。

優點:最小、最快的語言。彙編高手能編寫出比任何其他語言能實現的快得多的程序。你將是利用處理器最新功能的第一人,因為你能直接使用它們。

缺點:難學、語法晦澀、堅持效率,造成大量額外代碼 — 不適於心臟虛弱者。

移植性:接近零。因為這門語言是為一種單獨的處理器設計的,根本沒移植性可言。如果使用了某個特殊處理器的擴展功能,你的代碼甚至無法移植到其他同類型的處理器上(比如,AMD的3DNow指令是無法移植到其它奔騰系列的處理器上的)。

使用彙編編寫的遊戲:我不知道有什麼商業遊戲是完全用彙編開發的。不過有些遊戲使用彙編完成多數對時間要求苛刻的部分。

資料:如果你正在找一門彙編語言的文檔,你主要要找晶元的文檔。網路上如Intel、AMD、Motorola等有一些關於它們的處理器的資料。對於書籍而言,《Assembly Language: Step-By-Step》是很值得學習的。

5、Pascal語言

Pascal語言是由Nicolas Wirth在七十年代早期設計的,因為他對於FORTRAN和COBOL沒有強制訓練學生的結構化編程感到很失望,「空心粉式代碼」變成了規範,而當時的語言又不反對它。Pascal被設計來強行使用結構化編程。最初的Pascal被嚴格設計成教學之用,最終,大量的擁護者促使它闖入了商業編程中。當Borland發布IBM PC上的 Turbo Pascal時,Pascal輝煌一時。集成的編輯器,閃電般的編譯器加上低廉的價格使之變得不可抵抗,Pascal編程了為MS-DOS編寫小程序的首選語言。

然而時日不久,C編譯器變得更快,並具有優秀的內置編輯器和調試器。Pascal在1990年Windows開始流行時走到了盡頭,Borland放棄了Pascal而把目光轉向了為Windows 編寫程序的C++。Turbo Pascal很快被人遺忘。

最後,在1996年,Borland發布了它的「Visual Basic殺手」— Delphi。它是一種快速的帶華麗用戶界面的 Pascal編譯器。由於不懈努力,它很快贏得了一大群愛好者。

基本上,Pascal比C簡單。雖然語法類似,它缺乏很多C有的簡潔操作符。這既是好事又是壞事。雖然很難寫出難以理解的「聰明」代碼,它同時也使得一些低級操作,如位操作變得困難起來。

優點:易學、平台相關的運行(Delphi)非常好。

缺點:「世界潮流」面向對象的Pascal繼承者(Modula、Oberon)尚未成功。語言標準不被編譯器開發者認同。專利權。

移植性:很差。語言的功能由於平台的轉變而轉變,沒有移植性工具包來處理平台相關的功能。

使用Pascal編寫的遊戲:幾個。DirectX的Delphi組件使得遊戲場所變大了。

資料:查找跟Delphi有關的資料,請訪問:Inprise Delphi page。

6、Visual Basic

哈,BASIC。回到八十年代的石器時代,它是程序初學者的第一個語言。最初的BASIC形式,雖然易於學習,卻是可怕的無組織化,它義無反顧的使用了GOTO充斥的「空心粉式代碼」。當回憶起BASIC的行號和GOSUB命令,沒有幾個人能止住眼角的淚水。

快速前進到九十年代早期,雖然不是蘋果公司所希望的巨人,HyperCard仍然是一個在Windows下無法比擬的吸引人的小型編程環境。Windows下的HyperCard克隆品如ToolBook又慢又笨又昂貴。為了與HyperCard一決高下,微軟取得了一個小巧的名為Thunder編程環境的許可權,並把它作為Visual Basci 1.0發布,其用戶界面在當時非常具有新意。這門語言雖然還叫做Basic(不再是全部大寫),但更加結構化了,行號也被去除。實際上,這門語言與那些內置於TRS-80、Apple II及Atari里的舊的ROM BASIC相比,更像是帶Basic風格動詞的Pascal。

經過六個版本,Visual Basic變得非常漂亮。用戶界面發生了許多變化,但依然保留著「把代碼關聯到用戶界面」的主旨。這使得它在與即時編譯結合時變成了一個快速原型的優異環境。

優點:整潔的編輯環境。易學、即時編譯導致簡單、迅速的原型。大量可用的插件。雖然有第三方的DirectX插件,DirectX 7已準備提供Visual Basic的支持。

缺點:程序很大,而且運行時需要幾個巨大的運行時動態連接庫。雖然表單型和對話框型的程序很容易完成,要編寫好的圖形程序卻比較難。調用Windows的API程序非常笨拙,因為VB的數據結構沒能很好的映射到C中。有OO功能,但卻不是完全的面向對象。專利權。

移植性:非常差。因為Visual Basic是微軟的產品,你自然就被局限在他們實現它的平台上。也就是說,你能得到的選擇是:Windows,Windows或Widnows。當然,有一些工具能將VB程序轉變成Java。

使用Visual Basic編寫的遊戲:一些。有很多使用VB編寫的共享遊戲,還有一些是商業性的。

資料:微軟的VB頁面有一些信息。

7、Java

Java是由Sun最初設計用於嵌入程序的可移植性「小C++」。在網頁上運行小程序的想法著實吸引了不少人的目光,於是,這門語言迅速崛起。事實證明,Java不僅僅適於在網頁上內嵌動畫 — 它是一門極好的完全的軟體編程的小語言。「虛擬機」機制、垃圾回收以及沒有指針等使它很容易實現不易崩潰且不會泄漏資源的可靠程序。

雖然不是C++的正式續篇,Java從C++ 中借用了大量的語法。它丟棄了很多C++的複雜功能,從而形成一門緊湊而易學的語言。不像C++,Java強制面向對象編程,要在Java里寫非面向對象的程序就像要在Pascal里寫「空心粉式代碼」一樣困難。

優點:二進位碼可移植到其他平台。程序可以在網頁中運行。內含的類庫非常標準且極其健壯。自動分配合垃圾回收避免程序中資源泄漏。網上數量巨大的代碼常式。

缺點:使用一個「虛擬機」來運行可移植的位元組碼而非本地機器碼,程序將比真正編譯器慢。有很多技術(例如「即時」編譯器)很大的提高了Java的速度,不過速度永遠比不過機器碼方案。早期的功能,如AWT沒經過慎重考慮,雖然被正式廢除,但為了保持向後兼容不得不保留。越高級的技術,造成處理低級的機器功能越困難,Sun為這門語言增加新的「受祝福」功能的速度實在太慢。

移植性:最好的,但仍未達到它本應達到的水平。低級代碼具有非常高的可移植性,但是,很多UI及新功能在某些平台上不穩定。

使用Java編寫的遊戲:網頁上有大量小的Applet,但僅有一些是商業性的。有幾個商業遊戲使用Java作為內部腳本語言。

資料:Sun的官方Java頁面有一些好的信息。IBM也有一個非常好的Java頁面。JavaLobby是一個關於Java新聞的最好去處。

8、創作工具

上面所提及的編程語言涵蓋了大多數的商業遊戲。但是也有一個例外,這個大遊戲由於它的缺席而變得突出。

「神秘島」。沒錯,賣得最好的商業遊戲不是使用以上任何一門語言編的,雖然有人說「神秘島」99%是使用 3D建模工具製作的,其根本的編程邏輯是在HyperCard里完成的。

多數創作工具有點像Visual Basic,只是它們工作在更高的層次上。大多數工具使用一些拖拉式的流程圖來模擬流程式控制制。很多內置解釋的程序語言,但是這些語言都無法像上面所說的單獨的語言那樣健壯。

優點:快速原型 — 如果你的遊戲符合工具製作的主旨,你或許能使你的遊戲跑得比使用其他語言快。在很多情況下,你可以創造一個不需要任何代碼的簡單遊戲。使用插件程序,如Shockware及IconAuthor播放器,你可以在網頁上發布很多創作工具生成的程序。

缺點:專利權,至於將增加什麼功能,你將受到工具製造者的支配。你必須考慮這些工具是否能滿足你遊戲的需要,因為有很多事情是那些創作工具無法完成的。某些工具會產生臃腫得可怕的程序。

移植性:因為創作工具是具有專利權的,你的移植性以他們提供的功能息息相關。有些系統,如Director可以在幾種平台上創作和運行,有些工具則在某一平台上創作,在多種平台上運行,還有的是僅能在單一平台上創作和運行。

使用創作工具編寫的遊戲:「神秘島」和其他一些同類型的探險遊戲。所有的Shockwave遊戲都在網路上。

資料:Director、HyperCard、SuperCard、IconAuthor、Authorware。

9、易語言

全中文支持,無需跨越英語門檻。全可視化編程,支持所見即所得程序界面設計和程序流程編碼。中文語句快速錄入。提供多種內嵌專用輸入法,徹底解決中文語句輸入速度慢的問題。代碼即文檔。自動規範強制代碼格式轉換,任何人編寫的任何程序源代碼格式均統一。參數引導技術,方便程序語句參數錄入。無定義類關鍵字。所有程序定義部分均採用表格填表方式,用戶無需記憶此類關鍵字及其使用格式。命令格式統一。所有程序語句調用格式完全一致。語法格式自動檢查。自動檢查並提示所輸入語句的語法格式是否正確,且可自動添加各類名稱。全程提示與幫助。滑鼠停留立即顯示相關項目提示。編程時提示語法格式,調試時提示變數當前內容,隨時按下F1鍵可得到與當前主題相關詳細幫助等。名稱自動管理。用戶修改任一名稱定義,其它所有包含該名稱的程序代碼均自動修正。集成化開發環境。集界面設計、代碼編寫、調試分析、編譯打包等於一體。學習資源豐富。詳細的幫助文件、數十兆的知識庫、數萬用戶的網上論壇、教材已出版發行……

10、結論

你可能希望得到一個關於「我該使用哪種語言」這個問題的更標準的結論。非常不幸,沒有一個對所有應用程序都最佳的解決方案。C適於快而小的程序,但不支持面向對象的編程。C++完全支持面向對象,但是非常複雜。Visual Basic與Delphi易學,但不可移植且有專利權。Java有很多簡潔的功能,但是慢。創作工具可以以最快的速度產生你的程序,但是僅對某一些類型的程序起作用。最好的方法是決定你要寫什麼樣的遊戲,並選擇對你的遊戲支持最好的語言。「試用三十天」的做法成為工業標準是件好事情。


無非是無運行時(因此看起來overhead比較小,注意,這僅僅是看起來而已)和容易和彙編代碼對應起來,可以內嵌彙編也是個小優點

不過隨著硬體架構的進步和內核代碼的「用戶態化」(即內核徹底退化成處理器的「策略層」插件代碼,甚至可以是熱插拔的),C遲早會被具備強大得多的靜態檢查能力的語言取代。很可能是Rust這個方向上的語言


因為C語言是在操作系統演化初期為了更好的編寫操作系統創造出來的。


基本上都沒有說到點子上。

C語言基本上就是彙編的直譯,不能更簡單了。

整個C就是指針和地址,然後是數值運算,別無其他。

唯一隱藏的就是寄存器分配。

再多一點就是提供了彙編沒有的類型驗證保護,而這個也是可以去掉的,

C語言真的不能再多了。

再多說一句話,就是基本上彙編能做的C能做9.5成,最後0.5成用函數封裝彙編給出。

別的語言能做8成就很不錯了,很多人會說C++,我只想說C++很煩,擴展了功能人家也不願意用吧。


因為系統級編程語言只會C語言。

細軟跑


效率


因為C是機器語言與人類語言的橋樑。

理論上來說,任何東西你都可以用二進位寫,只要功夫深。而且一開始的程序也是這麼寫的,有個東西叫打孔機,在紙片上打孔,插入8位機的讀卡器就是一個程序,能做一些比較複雜的數學運算。

當然現在你寫不出什麼來,因為人類已電腦的方式思維實在太累了。於是就有了彙編這種看起來像人類語言的機器語言。

系統變得複雜起來了,彙編也漸漸力不從心,需要有一種把彙編語言抽象得更像人類語言的東西,這時候出現了很多語言,而C語言無疑是他們中間最成功的。

至於後面為什麼系統級的編程語言大家還用C。其實也不然,也有用其他的C++,java都可以算。但是從開發效率,運行效率,使用者的習慣等等來綜合評定,大家還是用C比較順手。


你想實現的東西都能通過c語言完成


因為操作系統,編譯器,TCP/IP等網路協議,都是用C語言寫成的。這些軟體算不算是信息技術的基石?


推薦閱讀:

Linux 下有沒有像 Visual Studio 一樣的,有自動填充、提示語法錯誤、斷點調試等功能的 C/C++ IDE?
用 int 類型表示多個字母,把多個字母轉化為整數的原理是什麼?
為什麼說C++不是C的超集?
函數傳遞引用 與 直接操縱全局變數 消耗資源的區別?
C語言里64位程序long類型的變數 長度是4還是8?

TAG:操作系統 | 編程語言 | C編程語言 |