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

4

是否总是需要使用C语言编写RTOS?为什么不能用Java或其他技术编写呢?这是因为Java中没有指针概念吗?


7
老实说,大多数操作系统都是用C语言编写的,无论是否涉及实时性。 - jk.
他们不是。请参考IBM Metronome:http://domino.research.ibm.com/comm/research_projects.nsf/pages/metronome.index.html - Mehrdad Afshari
1
@jk: 有原因:C非常适合编写操作系统内核。 - David Thornley
16个回答

2

1

C语言是为编写操作系统而设计的,因此常被称为“可移植汇编语言”,因此可以预期它将用于此目的。

如果您想要实时Java,则Sun提供了一种商业解决方案。


1

如果有什么原因的话,那就是指针。在Java中,除了基本数据类型,其他所有东西都在堆上分配内存,而且除了像int这样的变量以外,其他变量都是指针。这并不是编写操作系统的好方式,因为它给大多数操作增加了一层间接性,在操作系统编写中,这一层可能会让你付出代价。

操作系统内核需要优化和高性能,因为你不知道它将运行什么。这对于实时操作系统尤其如此,其中半毫秒的延迟可能至关重要。这需要与CPU和其他硬件密切合作,并且具备编写高度微优化代码的能力,以便以极高的可预测性执行特定任务。

因此,使用C语言构建实时操作系统内核是一个非常好的选择,而Java则不是。这并不意味着你不能用Java做到,但它会更困难,而且可能不那么成功。

我很好奇你为什么问这个问题。如果你正在使用实时操作系统,那么它是用什么语言编写的并不重要。如果你想要破解一个RTOS,那么它是用什么语言编写的就很重要了,但是OS的概念和实现本身就足够难以理解,学习一门新语言也是微不足道的。此外,如果你学习操作系统设计和实现,几乎可以确定你所使用的资源将使用C作为教学语言。


1

RTOS并不总是用C语言编写的。通常情况下是这样,但我相信在ThreadX中他们使用汇编语言。


C语言将被编译成汇编语言,而且在大多数C编译器中,你甚至可以使用内联汇编。 - Paul

-3
像Java这样的垃圾回收语言非常不适合实时编程。这些原因应该是显而易见的。

有一种叫做实时垃圾回收的东西:http://www.ibm.com/developerworks/java/library/j-rtj4/index.html - notnoop
2
难道stackoverflow上的每个问题的答案都很显而易见吗? - Pod
Sun 公司有一款商业版的 Java 实时版本。 - Thorbjørn Ravn Andersen
为了回答问题,也许列出原因会有所帮助。用户的水平不同,对一些人来说显而易见的事情对其他人可能并非如此。 - semaj
@semaj:但在这种情况下,答案是显而易见的:@Anon显然从未听说过实时垃圾收集器。 - Jörg W Mittag
实时垃圾回收器需要相当多的支持,这意味着Java RTOS需要它而C RTOS不需要。然而,在这里,垃圾回收大体上是无关紧要的。 - David Thornley

-3

在编写RTOS时,是否总是需要使用C语言?

不是的。例如,有些RTOS是用Lisp或Smalltalk编写的。

为什么不能用Java或其他技术来编码呢?

你认为为什么不能呢?

这是因为有一个误解,即操作系统只能用C语言编写。这个误解可以轻松地被证明是错误的,但它仍然不肯消失。

这个误解非常普遍,以至于想要编写新操作系统的人,只敢尝试使用C语言。


如果证明如此显然,那么给一些链接怎么样? - Norman Ramsey
更重要的是,神话在哪里?回答这个问题声称操作系统只能用C语言编写。 - David Thornley
@Jörg:这不是关于编写操作系统,而是编写实时操作系统。实时操作系统的整个重点在于它是确定性的。要想拥有真正确定性的Java,您需要删除相当多的Java优点(即使使用Java RTS),这会有点违背使用它的目的。如果您正确编码并使用类似JRRT的东西,您可以接近实时,但在编写实时操作系统时,您还不够实时。至少现在还不够。 - Fredrik
我想我应该指出,我所听说的唯一广泛使用的Lisp操作系统都是在专门设计的硬件上运行的,而且从来没有人告诉我它们是实时的。是否有用Lisp或Smalltalk编写的实际实时操作系统? - David Thornley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接