共计 1602 个字符,预计需要花费 5 分钟才能阅读完成。
导读 | 本篇介绍了为什么大部分操作系统都使用 C 语言来编写,也介绍了 C 语言的许多优点,但值得注意的是每种语言都有自己的使用场景,C 语言也不例外,C 语言非常适合系统编程等偏向底层的方向,但在应用层你的选项则有很多。希望这篇对大家理解 C 语言与操作系统有所帮助。 |
首先不得不说的是 C 语言真的非常简单,看看 K &R 经典的 ”The C Programming Language”,薄薄的一本书就把 C 语言讲完了。
再去看看 Java、C# 等,要是介绍这些语言的书不能厚到去垫显示器你都不好意思去读。
由于 C 语言很简单,被移植到了许多 CPU 架构上,甚至许多 CPU 设计者第一件事就是把 C 语言移植过来。假设你自己打造了一款 CPU,有自己独特的机器指令,现在 CPU 有了,接下来的问题是你该怎么编写程序让你的 CPU 开始工作呢?
我们知道,CPU 只能执行机器指令,程序员都使用高级语言来编写程序,因此必须将高级语言翻译成机器指令,接下来的问题是选择什么语言呢?使用极为复杂的 Java/C# 还是简单的 C 呢?答案不言而喻。
因此你接下来需要的就是为你设计的 CPU 打造一款 C 编译器,之前都是通过魔改 gcc 来完成,现在你也可以使用 LLVM(注意,这绝不是一件想象中那么简单的事情)。
看到了吧,处理器设计者想到的第一个用来驱动 CPU 的高级语言就是 C,那么针对该 CPU 编写的操作系统该用什么语言还用得着说吗?
为什么说 C 语言最独立呢?想一想 Java、Python、C# 等是不是需要一大坨运行时系统(runtime system),包括解释器、线程模型、垃圾回收等等。
而 C 语言就简单太多了,C 语言不需要依赖任何运行时系统(不考虑标准库),它不需要内存管理系统、不需要解释器、不需要线程模式等等,这就意味着你编写的 C 语言程序可以直接在硬件上跑起来。
让我们来看一下在整个计算机系统中操作系统位于哪里:
可以看到操作系统位于应用程序与硬件中间,这就意味着操作系统必须对上层屏蔽硬件,这同时也意味着编写操作系统时必须能直接控制硬件,尤其是内存管理,而 C 语言就是为此而生的。
C 语言本身不像 Java 等自带内存管理系统,在 C 语言中这一工作完全由程序员控制,这种控制权在开发操作系统时是极为重要的,再加上指针这一大杀器,程序员可以方便的直接操作内存,像创建页表(page table)、DMA 控制器、Memory mapped IO 等等。
有的同学可能对指针 (pointer) 心生畏惧,的确,对于大部分工作在应用层的程序员来说没有指针我们一样可以编写出有用的程序,像 Java 程序、Python 程序等等,这些语言中没有指针,我们也不需要直接面对硬件,而这恰恰是因为操作系统帮我们屏蔽掉了,而在操作系统这一层我们无可逃避,C 语言可以干净利落的解决问题。
C 语言中没有复杂的数据结构,像各种容器、hash 表、树等,程序员必须自己来实现这些,这也是很多同学觉得不方便的地方,然而这样设计的初衷是为了让程序员能确切的知道 C 代码是怎样影响硬件的,C 语言也是最接近机器指令的高级语言,C 语言是非常透明,而这一点在其它高级语言中几乎不可能,因为 C 语言的设计哲学之一就是:
Trust the programmer
使用 C 语言的程序员应该清楚的知道自己在干啥,这非常适合编写操作系统这种贴近硬件涉及大量底层细节需要精密微调的程序,当然缺点就是刚才所说的没有内置的一些常用数据结构。
本篇介绍了为什么大部分操作系统都使用 C 语言来编写,也介绍了 C 语言的许多优点,但值得注意的是每种语言都有自己的使用场景,C 语言也不例外,C 语言非常适合系统编程等偏向底层的方向,但在应用层你的选项则有很多。希望这篇对大家理解 C 语言与操作系统有所帮助。