理论上说,大部分语言都可以用来写操作系统内核。
但是为什么大部分操作系统内核都只用C语言来写?
因为目前所有的语言的开发环境里,C语言能做到编译成不依赖操作系统的形式二进制代码,C语言的各种脱离系统的库最丰富,最完整,C语言用来开发操作系统的工具最多。
举个例子:如果内核中希望使用printf
这个函数,那么内核就必须自己实现printf
,而不是依赖标准库,因为标准库是要依赖操作系统来完成真正的printf
操作。
而这种库,C语言版本的最容易找到,其它语言要么没有,要么很难用。
有兴趣可以看Linux
源码、网上泄露的Windows
源码、ReactOS
源码、以及各种嵌入式平台的源码(uC/OS,ThreadX,VxWorks等),这些源码的一个特点就是它们自身都实现了大部分标准库的函数。
所以语言本身是什么不重要,重要的是语言运行所依赖的东西。
如果有人使用Pascal
实现了Pascal
标准库里的大部分功能,并且都不依赖于操作系统,那么用这个环境就可以用来开发Pascal
写的操作系统。
有人会说解释型的语言肯定不合适,但是,实际上如果有人能移植一套不依赖操作系统的Java
虚拟机,那么虚拟机之上完全可以开发一套以Java
语言开发的操作系统。
解释型的语言难点在于解释器,但如果解释器不依赖操作系统,那么语言本身也可以做到不依赖。
回到问题,编程语言只是工具,不同语言之间确实在做事情上有差异,但如果付出一些代价(成本),那么工具的限制因素就会降低。
用机床可以做零件,但用斧头、锤子、电钻、刀具就不能做了吗?只不过很麻烦而已。
商用操作系统用C
语言开发是因为工具齐全开发成本低,仅此而已。
JNode[2],一个用Java写的操作系统。
这个世界上有很多闲人,他们一直在做着各种稀奇古怪的事情,就包括用各种语言开发操作系统。
最后我再补充一下:一个语言的第一个版本肯定是用别的语言写的,但以后的版本就不一定了。这像是一个先有鸡还是先有蛋的问题,但实际不是。
举个例子吧:C
语言的最早的编译器肯定不是C
写的,但用最早的编译器环境里的C
语言是可以做出更复杂的编译器的,更复杂的编译器再做出支持更复杂语法的C
,不停的迭代就可以了。
迭代不仅仅可以是C
语言,也可以是其它语言,就这样的。
[1]北极的知乎回答: https://www.zhihu.com/question/26834043/answer/34245822
[2]JNode: https://zh.wikipedia.org/wiki/JNode