為什麼mysql,nginx,libev,redis,linux都是用C寫的?

請各路大神解答一下


因為你把用C寫的東西挑出來說了啊摔


C 能更精確的控制內存和硬體,月經貼?


操作系統不用說了,基本上所有操作系統核心都是用C寫的,包括聞到死。

libev:這本身是一個跨平台的庫,用C寫可以實現最大的可移植性,因為C庫的介面簡單,可以被更多語言調用,用C++寫庫除非暴露C介面,否則很難被重用吧?

至於mysql,redis,nginx,這種獨立的軟體,用C可能是開發者個人愛好或者某種考慮,完全可以用其他語言實現不一定是C。


為什麼linux是c寫的


可以控制內存 提高性能 對系統可控性強

linux為何是c語言開發的?

由於操作系統是運行在計算機之上的 所以先要了解計算機:

計算機的核心就是CPU

通過CPU發送電信號來控制所有設備的工作

設備之間約定好哪種電信號代表要執行哪種操作

用戶通過給CPU發送指令來控制CPU發送什麼電信號 進而控制計算機

用戶將指令發給CPU

CPU解析指令後發送此指令對應的電信號

然後設備做相應的操作

大意上來說 CPU就是一個將指令解析 電信號發送集成在電路中的設備

例如 CPU讀取指令:00100100(假設這個指令代表加)

那麼CPU就找到這條指令對應的電信號發送給加法器

加法器收到電信號 進行加法操作

然而像00100100這樣的指令太難記 故而出現了彙編 用人類語言代替二進位:ADD代表加

用戶寫源碼為ADD 執行前先編譯

編譯成00100100後再拿去執行

由於彙編語言是仔細到和所有硬體打交道和CPU支持的指令集也關鍵 故而移植性不好

具體來說移植性問題:

A計算機有寄存器Ra Rb

在A計算機上的代碼 ADD Ra Rb(將Ra Rb 寄存器內的值相加)

把這段代碼在B計算機上執行 然而B計算機沒有Ra寄存器 故而這段代碼就出現了移植性問題

或著兩台計算機的CPU對指令的支持不一樣也會導致移植性問題

於是就出現了C語言

C語言不涉及寄存器及具體的CPU指令 在不同的計算機上有不同的編譯系統 將c源碼編譯成此計算機上的彙編碼 進而生成二進位執行文件

而且c語言只是對彙編指令的整合 實質上與CPU原本的執行差別無幾

c語言對內存 外設操作接近計算機本身的工作行為 故而性能是其他語言不能比擬的

但c不能精確到寄存器級的操作 這也是性能不及彙編的原因之一 所以linux內核有些性能要求太高的部分是用彙編寫

再說面向對象語言

面向對象語言最終的執行還是CPU的指令集

先要將面向對象的邏輯轉換成順序邏輯然後再轉換成CPU指令集

由於多級的轉化導致到最底層的時候會存在很多冗餘 故而性能會有很多差異

因為是對底層的抽象 導致面向對象語言對底層是不可控的

要了解操作系統就得知道操作系統的功能:

1.進程調度

2.內存管理

3.外存管理

4.外設管理

5.作業管理

而這些功能就是最簡單的計算機底層的執行邏輯

用高級語言 一是很多方面達不到控制 二是把原本簡單的邏輯搞複雜了


沒有心智包袱,寫什麼是什麼。


你舉的那些軟體很多都是對運行效率有著非常嚴苛的要求,他們的開發團隊估計恨不得直接上彙編,像linux內核代碼裡面有些關鍵代碼都是內嵌彙編的。

用C來開發的時候,大致能感覺到會生成什麼樣的彙編代碼,這對於精通底層優化的開發團隊來說更容易編寫出高效的代碼。

另外,可以去搜一下linus對C++的態度,我想這多多少少也影響了開源界對語言的選擇。


因為沒必要用C++寫啊,尤其是像Nginx這麼簡單的邏輯。


因為MySQL,Nginx,Libev,Redis,Linux


不用c那應該用設么語言呢


mysql 大部分是c with class。postgres倒是全部是c


(? ???ω??? ?)不用c 難道要用「最好的語言」PHP來寫嗎


就像前面的人說的一樣。我說一句總結性的話:

人們只會看到他想看到的那部分。這就夠了。你的關注點在C所以,對於php,java,c++什麼的你就沒有去看。造成了。你看到的景色好美的故事


推薦閱讀:

Nginx支持ASP.net嗎?
為什麼要執行多個進程,把所有功能都放到一個進程裡面執行會影響性能嗎?
Nginx源碼中值得學習的編程風格有哪些?
請問nginx比apache性能高為什麼apache現在依然流行?
為什麼 node.js 的官網不用 node.js 而用 nginx 搭建?

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