為什麼現在的操作系統基本上用C語言來實現?

初學操作系統,產生了這樣的疑問= =

為什麼沒有人用python,java來實現操作系統?

同時如果用C++來實現操作系統有什麼樣的利弊嗎?


因為如果要在開發時間和軟體效率之間取一個平衡點的話,開發操作系統的平衡點就是C語言。

這裡是比較熱門的編程語言排行榜:TIOBE Software: The Coding Standards Company

除了C語言以外,其它語言都不具備某些特性、不夠方便、軟體效率不高。

寫操作系統需要編程語言提供以下幾個特徵:

1、跨平台,不能是只在某個平台下編譯(VB就不行);

2、必須是編譯型語言(PHP就不行),或者有一個非常高效的解釋器;

3、必須有方便的操作硬體的功能,容易嵌入彙編(Java就不行);

4、兼容性要好,最好不同編譯器編譯的符號要基本相同,容易鏈接(C++不行,如果放棄Class的話C++基本可以);

5、編譯器本身最好是由該語言自己完成的(大部分語言的編譯器都是用C/C++寫的);

6、開發者可以很方便的擴展、改造、或者使用第三方的運行庫(大部分語言的庫都無法修改);

7、開發者眾多(小眾語言就不行);

8、該語言開發操作系統的資料要足夠完善。

所以總結下來,C語言是首選。

當然了,不是說其它語言一定不行,只是其它語言開發操作系統時會有各種各樣的不方便的地方,因為有人就用Java+彙編來實現一個操作系統,也不是不可以,只是很麻煩。(參見寫操作系統只能用彙編和C語言? - 北極的回答)

而由於最早開發操作系統的時候選用了C語言,而且一直延續了下來。不管是習慣還是語言特性,C語言一直都很符合條件,因此沒有必要冒著各種風險換一種語言來開發。

補充,如果使用C++寫操作系統,並不是特別困難。C++的問題在於混合編譯時符號表比較麻煩(VC和GCC生成的全局符號名字不一樣),C++的運行效率略低於C,所以一般沒有人用C++去寫內核。

但是Windows里確實存在著使用C++寫的驅動,也算是屬於操作系統的一部分吧。


貴系3字班正在修操統的來圍觀。。作業請獨立完成。

有人實現過和項目取得商業成功是兩回事。。隨便列舉個X語言(包括並不限於Java/Python/Scheme/Common Lisp....)你都很容易搜到有人寫的OS,因為OS門檻辣么低,你只要實現一張能把本語言REPL跑起來的啟動盤,把字元界面弄出來就可以宣稱自己造了OS啦。。。


因為只有常接觸到的那部分是用C/C++來寫的而已。

Pascal,DoD的Ada都是寫OS的神器啊。(System 7)

(說起來我們操作系統課程的教材都是Pascal-like的代碼耶!

寫一個現代的操作系統的語言至少需要以下特徵:

1. 安全。(想想弱類型+無bound check的C語言吧。

2. 高效。

3. 輕量級的運行時依賴或者沒有運行時依賴。

4. 有(多)個還算可以的(干)爹。

這樣算下來,C++、Rust、去掉GC的D語言這些都是可以的。

當然也可以像Singularity那樣,直接先用黑魔法搭建一個託管的運行時環境,然後開心的用各種語言寫吧。


如果把C++中的以下功能去掉,用C++寫操作系統內核和驅動還是可以的,並且效率不低

1、STL中的大多數函數(注意,一個語言不僅包括語法特性,也包括庫函數),vector、map、iostream等等統統不能用

2、異常

3、RTTI、虛函數、虛繼承

4、全局變數定義時使用構造函數初始化和終止化

5、C++11中的lambda之類的

不過這時C++還剩什麼呢?

1、靜態類型檢查和自定義的模板

2、類(可以繼承的,有私有和共有)

3、namespace

4、函數重載

5、默認參數

如果你願意割捨那些不能用的,並且完全謹遵這些可以用的,C++還是不錯的,不就閹割一下嘛。那麼在C++中的這些剩下的特性如何被C代替呢?

1、宏和指針的各種技巧

2、宏和結構體的各種技巧

3、宏改變變數名的各種技巧

4、寫的時候小心點,反正出錯了編譯器會報錯

5、宏中嵌套宏的各種技巧

所以C++無非就保留一點C的語法糖,用宏也能實現嘛。一個是用美好的宏的實現,一個是用被閹割後的C++,哪種更好呢?

註:那些去掉的功能也可以保留,就是非常麻煩,例如

1、使用內核C函數或者彙編函數把各種allocator實現了,使用kernel log把iostream實現了,使用。。。

2、正確地在內核中實現一個異常鏈或者棧展開,注意此時有各種中斷、內存缺頁、進程IO,別出錯就行

3、正確地在內核中識別各種RTTI變數、虛表結構、類型信息等原本應該是編譯器和運行時乾的事情(內核中把這些都加進來幹嘛?)

4、這個比較麻煩,得事先定義初始化和終止化究竟是內核跑到哪一步做,然後把這些原本應該是運行時乾的做出來(內核中把這些都加進來幹嘛?)

5、在內核中實現一個lambda的類,解決好各種閉包傳遞問題、閉包分配問題、閉包銷毀問題

麻煩吧?編譯器都不好意思說自己能完全實現C++,居然還要扯進來操作系統。


貴系2字班唯一一個修過操統的來圍觀。。。

如果是貴系同學,稍微有一點不要臉了吧。。。

當然我自己回答這個問題,我回答的答案應該也不是什麼好的回答,只能說是我的知識水平內的回答。

Java/Python不被使用的原因是GC,GC本身涉及內存管理,那麼內存的分配演算法又是拿什麼寫呢?

再說C++,用C++寫是有這樣的嘗試的,而且似乎有很多人都在做。。。

C++吧之前就認識幾個寫玩具操作系統的。。。

C++不好的地方也是在內存管理部分,STL不能簡單地被使用,如果需要使用我猜需要自己寫Allocator吧,但是我覺得似乎使用STL的收益遠小於由此帶來的可維護程度的下降。(因為內核內部都是較為簡單的數據結構,就算是複雜的數據結構一般也要特化以保證效率)

另一方面,C++的OO帶來的開發上面的優勢,不可否認,是有的,但是不算特別多,而且C++命名空間導致的export的名字無法簡單獲取也是問題。(與彙編聯合)

再者說,那些成熟的操作系統都是C++未成熟時候的產物,那個時候大家用慣了C了,也沒有什麼為什麼不用C++,就是歷史遺留問題。。。


寫操作系統內核勢必要接觸底層的東西(比如具體的硬體協議),所以語言不能太高級。

但是又不能如彙編般低級,於是就只能用 C 這個結構化的彙編了。


你一定不知道 Lisp Machine 是什麼鬼


因為效率。

上層語言效率太低了。


因為c語言在執行程序的過程中夠快夠高效。


微軟官方的解釋: C++ for Kernel Mode Drivers: Pros and Cons. 雖然說的是內核驅動,但裡面的建議也適合內核開發。

https://view.officeapps.live.com/op/view.aspx?src=http%3A%2F%2Fdownload.microsoft.com%2Fdownload%2F5%2Fb%2F5%2F5b5bec17-ea71-4653-9539-204a672f11cf%2FKMcode.doc


Android已經轉為C++。


因為要求OS的內核要跨平台,考慮到各種「限制」,所以選擇了C。


訪問地址的能力。


推薦閱讀:

不同編程語言之間是如何溝通的?
Windows自帶的微軟拼音輸入法為什麼會佔用巨大的內存?
學習 Linux 有哪些好處?
一個已經裝好系統的硬碟能否移到其他未裝系統的電腦上直接使用?
win10不能直接關機強制(更新並關機)做法是不是太流氓?

TAG:程序員 | 操作系統 | 程序 | 操作系統內核 | 人機交互界面 |