爲什麼用 C 語言編寫操作系統?

大家好,我是小風哥。

你有沒有想過,爲什麼大部分操作系統都使用 C 語言來編寫而不是其它語言呢?這篇文章給你答案。

C 語言在處理器界很受歡迎

首先不得不說的是 C 語言真的非常簡單,看看 K&R 經典的 "The C Programming Language",薄薄的一本書就把 C 語言講完了。

再去看看 Java、C# 等,要是介紹這些語言的書不能厚到去墊顯示器你都不好意思去讀。

由於 C 語言很簡單,被移植到了許多 CPU 架構上,甚至許多 CPU 設計者第一件事就是把 C 語言移植過來。

假設你自己打造了一款 CPU,有自己獨特的機器指令,現在 CPU 有了,接下來的問題是你該怎麼編寫程序讓你的 CPU 開始工作呢?關於 CPU 的工作原理你可以參考《你管這破玩意叫 CPU?

我們知道,CPU 只能執行機器指令,程序員都使用高級語言來編寫程序,因此必須將高級語言翻譯成機器指令,接下來的問題是選擇什麼語言呢?使用極爲複雜的 Java/C# 還是簡單的 C 呢?答案不言而喻。

因此你接下來需要的就是爲你設計的 CPU 打造一款 C 編譯器,之前都是通過魔改 gcc 來完成,現在你也可以使用 LLVM(注意,這絕不是一件想象中那麼簡單的事情)。

看到了吧,處理器設計者想到的第一個用來驅動 CPU 的高級語言就是 C,那麼針對該 CPU 編寫的操作系統該用什麼語言還用得着說嗎?

C 語言最獨立

爲什麼說 C 語言最獨立呢?

想一想 Java、Python、C# 等是不是需要一大坨運行時系統 (runtime system),包括解釋器、線程模型、垃圾回收等等。

而 C 語言就簡單太多了,C 語言不需要依賴任何運行時系統 (不考慮標準庫),它不需要內存管理系統、不需要解釋器、不需要線程模式等等,這就意味着你編寫的 C 語言程序可以直接在硬件上跑起來。

直接操作硬件的能力

讓我們來看一下在整個計算機系統中操作系統位於哪裏:

可以看到操作系統位於應用程序與硬件中間,這就意味着操作系統必須對上層屏蔽硬件,這同時也意味着編寫操作系統時必須能直接控制硬件,尤其是內存管理,而 C 語言就是爲此而生的。

C 語言本身不像 Java 等自帶內存管理系統,在 C 語言中這一工作完全由程序員控制,這種控制權在開發操作系統時是極爲重要的,再加上指針這一大殺器,程序員可以方便的直接操作內存,像創建頁表 (page table)、DMA 控制器、Memory mapped IO 等等。

有的同學可能對指針 (pointer) 心生畏懼,的確,對於大部分工作在應用層的程序員來說沒有指針我們一樣可以編寫出有用的程序,像 Java 程序、Python 程序等等,這些語言中沒有指針,我們也不需要直接面對硬件,而這恰恰是因爲操作系統幫我們屏蔽掉了,而在操作系統這一層我們無可逃避,C 語言可以乾淨利落的解決問題。

關於指針,你可以參考小風哥《徹底理解 C 語言中的指針》這篇文章。

最接近底層的高級語言

C 語言中沒有複雜的數據結構,像各種容器、hash 表、樹等,程序員必須自己來實現這些,這也是很多同學覺得不方便的地方,然而這樣設計的初衷是爲了讓程序員能確切的知道 C 代碼是怎樣影響硬件的,C 語言也是最接近機器指令的高級語言,C 語言是非常透明,而這一點在其它高級語言中幾乎不可能,因爲 C 語言的設計哲學之一就是:

Trust the programmer

使用 C 語言的程序員應該清楚的知道自己在幹啥,這非常適合編寫操作系統這種貼近硬件涉及大量底層細節需要精密微調的程序,當然缺點就是剛纔所說的沒有內置的一些常用數據結構。

總結

本篇介紹了爲什麼大部分操作系統都使用 C 語言來編寫,也介紹了 C 語言的許多優點,但值得注意的是每種語言都有自己的使用場景,C 語言也不例外,C 語言非常適合系統編程等偏向底層的方向,但在應用層你的選項則有很多。

希望這篇對大家理解 C 語言與操作系統有所幫助。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/FQrYRNqEUhHMtXRf1ltiGg