查看原文
其他

为什么用C语言编写操作系统?

码农的荒岛求生 码农的荒岛求生 2022-10-10
大家好,我是小风哥。
你有没有想过,为什么大部分操作系统都使用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语言与操作系统有所帮助。

最后,你对操作系统感兴趣那么小风哥自己写的书《深入理解操作系统》绝不能错过。

最后,我建了微信技术群,扫描下方二维码备注写“加群”二字即可,一起见证我们的成长。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存