哪些類型的應用必須用c語言寫?

我知道很多通信系統和嵌入式系統是用c語言寫的,因為1、資源限制2、實時性要求高,必須用c語言寫,可是現在嵌入式設備的資源也越來越充足,go語言的gc性能也越來越高,很多時候能滿足低時延要求。

那麼具有哪些特徵的應用必須用c寫?哪些是可以用go、scala這樣的新語言寫的?有沒有一些可以指導選擇的標準?


沒有。能用 C 寫的,用 Pascal 也沒問題,用彙編就更沒問題了,當然你可以說 C++ 不是另外一門語言……


C是「半高級語言」,通常用於平台相關代碼,也就是說,你和彙編關係比較密切,一般就用C來寫。


需要嚴格控制硬體運行行為的情況下通常要用C,你也可以說可以用其他相當的替代語言比如Pascal,但是這些語言恐怕在很多場景下沒有相應的工具鏈,何必噁心自己……

原因在於只有C這樣貼近底層的編譯語言才能保證:一旦編譯完成後許多特性就可以保持不變,最大程度不依賴隨機因素,最大程度不依賴編譯器和VM,最大程度利用嵌入式系統自己的特性。

對隨機因素來說,其中來說最主要的一個考慮是GC,由於GC的運行受到很多隨機因素的影響,包括線程調度、包括程序的執行順序等等,GC只能保證使用後的內存在一段時間後被釋放,並不能保證它完全及時地被釋放,如果分代的GC無法讓所有使用的內存都正確釋放,就必須要依賴full GC,而full GC是比較慢的,再快也需要幾十毫秒的級別,對於實時性要求高的場景來說,比如說緩衝區很短的實時音頻,突然插進來一個full GC就可能導致一個能聽得見的jitter(衝激聲),如果是對於自動控制系統那就更糟糕了。

對編譯器和VM依賴來說,通常不同版本的編譯器和VM都可能導致代碼出現不同特性,比如代碼佔用空間變大,比如數據大小增加,比如內存佔用增加,就用最貼近C的C++來舉例,新版本的編譯器可能會在一個類當中添加額外的空間來啟用新的功能,可能會鏈接進新版本的庫,這些在PC上不是大問題,在嵌入式系統中都可能出問題,比如編譯出來的bin文件大小超過ROM大小燒不進去了,比如執行的時候到某個階段因為棧上的類每個大了一位元組剛好放不進1KB的棧空間裡面了,等等。這就可能導致以前版本編譯器編譯的程序跑得好好的,升級了一下編譯器版本一下就不工作了,需要改代碼,這個對代碼維護來說相當致命。

利用嵌入式系統自己的特性,是說C支持使用強制轉換來訪問指定的內存空間,許多嵌入式系統中會將操作設備的介面映射到地址空間中;還包括可以直接嵌入彙編等等。其他語言(除了C++)大部分不支持這些特性,開發的時候可能還需要用C或者彙編封一個庫,那最終還得用C。

但其實也還是看權衡的,畢竟Java、Go的確開發快、開發門檻低,如果一個系統對快、對開發工作量的要求遠遠超過了硬體成本的考量,那麼使用更高級的語言完全是可行的,智能機其實也是嵌入式開發啊,Android應用還不是用Java?反過來,如果一個嵌入式系統目標是千萬的銷量級別,每件增加十元錢的硬體成本就是一個億,然後需要保證數年內銷售出去的產品型號要一致,軟體要保證能夠工作十年以上,還要把成本壓縮到對其他廠家有競爭力,那麼使用C可能就是唯一的選擇了。


瀉個葯,作為從小就刻意避開C系列的農,還真沒覺得非它不可

APPLE II 有 Basic

民用操作系統有 Pascal

戰鬥機用軍用 ADA

---

插一句,操作系統內核,C不是必須品

---

Windows GUI 有 Delphi

腳本有 2 P + 一堆 Shell

Web 有 PHP, JS

手機有Java

愣沒看出來非要C不可的地方

能要到GC的地方,最多軟實時

現在非要C不可的,覺得只有一些應該工具鏈綁定的很偏的比如單片機或GPU


糾結這個問題的人,總是喜歡糾結語言本身,而不看手上現有的運行環境是什麼。。。。

每種語言都有特定的運行條件和環境。。。。

你以為我不想用java python寫嵌入式啊!

就算資源豐富了,也不一定給你提供虛擬機或者解釋器的環境。。。


在 bare metal 上面運行的程序一般只能用 C 和彙編。


生態決定了開發語言的使用場景


操作系統內核及其相關模塊。


和硬體打交道的底層代碼,c 是最好的選擇,而且其他選擇也非常少。


沒有必須用C的這個說法吧,能用C實現的用其他語言一定可以的。

至於嵌入式系統,很多這種系統只提供C和彙編的tool chain,你想寫別的你也寫不了,就連C++都不行,這個是必選項,無奈的選擇。

至於幾個新語言,等毒霸了天下再說吧,當年sun推java card,java chip那麼努力也沒啥效果。


別的我沒有分析過,沒有見過,不敢亂說。可以確定的是,大部分單片機(特別是新推出的單片機),可以使用C語言開發。


驅動程序和操作系統肯定得用C語言寫。但應用程序就不好說了,貌似沒有必須用C語言的。


單片機,Linux,Linux驅動,git, ngix, memchcaed, lua SQLite


推薦閱讀:

關於菲波那契數列的一個低級問題?
C語言可否自定義數值類型(或是任意個位元組的數值類型)?
利用異或方式交換兩個變數值的原理是什麼?
為什麼計算機里加上存儲功能可以代替改變電路?
為什麼開源軟體絕大部分都是C語言寫的,而商業軟體大多數是C++開發的?

TAG:通信 | C編程語言 | Scala | 嵌入式開發 | Go語言 |