为什么实时操作系统只用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个回答

16

垃圾回收是Java不适合实时性的主要原因。JIT是另一个原因,但它可以被克服。

总的来说,C语言作为一种有效的可移植汇编语言,能够提供非常可预测的运行时性能,这对于可靠的实时执行至关重要。


5
Java确实拥有一个实时系统(RTS),并且在实时垃圾收集方面有一些良好的研究和工作。 - notnoop
@TheManWithNoName:垃圾回收是什么意思?JIT又是什么? - wrapperm
3
JIT是“即时编译器”,大大改变了代码的运行特性。垃圾回收是Java实现的自动内存清理机制。 - Federico Giorgi
2
垃圾回收是自动释放未使用对象的过程,这通常会导致应用程序暂停运行(暂停可以减少,但很难完全消除,以免出现内存不足情况)。JIT是即时编译器,将频繁使用的Java字节码按需转换为本机代码 - 这显然会极大地改变性能,但本身需要时间来执行,并且您可能需要强制进行完全编译以满足实时目标。 - TheManWithNoName
实时垃圾收集器已经存在了几十年。而且JIT对于Java来说并不是必需的。事实上,在几乎所有现有的Java实现中,都没有JIT编译器。通常,在JVM实现中会有一个JIT,但是a)Java并不需要JVM,b)JVM也不需要JIT。 - Jörg W Mittag

11

因为RTOS开发人员很可能不了解C++的足够多。

嵌入式系统中的C++:神话与现实

有人认为C ++具有开销和成本,使之不适合嵌入式系统编程,它缺乏C的控制性和简洁性,或者虽然它适用于某些细分应用程序,但它永远不会取代C成为嵌入式系统的首选语言。

这些看法是错误的。只要编译器和其他工具足够,对于嵌入式系统的实现语言,C ++总是优于C。尽管C ++可以做到C的所有事情,但它提供了更多表达、封装、重用的机会,甚至允许在C中不切实际的大小和速度改进。

> 那么,为什么这些看法持续存在?主要原因是当人们形成自己的观点时,他们对C的了解比对C ++的了解更多。他们读过一些书,编写过一些代码,并且能够熟练使用C ++的功能,但他们缺乏了解引擎盖下发生了什么的知识,缺乏熟悉的经验,而这种经验可以让人在输入源代码甚至在制定设计时可视化反汇编。

在嵌入式设计中使用C++替代C的指导方针

嵌入式软件应用程序最常用的编程语言是C。多年来,C++被视为自然继承者并得到了更广泛的接受,但其使用增长速度比预期要慢得多。
这其中有许多原因。首先,嵌入式开发人员相当保守,更喜欢使用经过验证的解决方案,而不是新颖的解决方案。"如果它没坏,就别修"。
还有经验教训。许多开发人员尝试使用C++进行嵌入式应用程序开发并失败了。这样的失败有时可以归咎于开发工具的缺陷,但更常见的原因是不适当地使用了语言,即将嵌入式系统像桌面电脑一样处理。
虽然C被广泛使用,但它也有局限性,因为它不是为嵌入式应用程序或现在普遍存在的大规模项目而设计的。主要的限制包括:
1) C非常强大和灵活,因此可能很危险。(它具有低级别功能-对于嵌入式系统很有用,但也代表了许多陷阱。)
2) 程序员需要非常有条理和有纪律。
3) 程序员需要了解程序在低级别和高级别上的行为(因此,大型项目很难维护)。
4) 程序员需要专业知识。
然而,C++具有强大的面向对象能力,可以帮助解决C的局限性:
1) 它将高级别的专业知识封装和隐藏到"对象"中,使非专家无法了解。(测试用例将在本系列的第二部分中演示专业知识的封装。)
2) 对象可以被非专家直观地使用,以实现概念设计的高级别实现。

1
在我看来,没有人真正精通C++,包括那些声称自己精通的人。我们曾经让一位专业的C++程序员创建一个数组类(在boost之前),但很快另一位专家就发现了其中大约32个主要错误。C本身并不是非常安全,但它更容易理解。Java之所以被创造出来,是因为它比C++更安全,但也有自己的缺点。 - Maarten Bodewes
你的链接已经失效了 - 请查看以下文章:"C++ in Embedded Systems: Myth and Reality" 和同一作者的后续文章:"Modern C++ in embedded systems",以及 "Guidelines for using C++ as an alternative to C in embedded designs" - HelpingHand
@MaartenBodewes “没人真正精通C++”...那游戏开发者呢?他们难道不是C++的专家吗? - undefined
@CloudCho 顶级游戏开发者在他们各自的领域非常出色。还有一些与安全相关的程序员也能做得很好。但我不会说一个性能优越的应用程序可以与一个安全的应用程序相媲美。一般来说,游戏相对独立。如果你花点时间,我会对无法入侵用C++编写的游戏服务器感到惊讶。现在,由于许多经过良好评价的库使用了自动指针管理等技术,你可以做得更好一些。 - undefined

10

实时系统也可以用其他语言进行编程。例如,Java有一个Java RTS 系统

与其他答案不同的是,有相当数量的工作在进行实时垃圾收集方面。但是,这些通常不会捆绑在您的典型发行版中。

问题在于其他语言通常具有使确定性和可靠性难以实现的功能,例如传统垃圾收集、JIT、运行时优化等。


3
请注意,Java RTS系统必须在实时操作系统(RTOS)上运行 - 迄今为止还没有人构建出实时裸机的Java系统。 - caf
@notnoop:人们已经做过了,例如http://www.jnode.org/和http://cjos.sourceforge.net/archive/。 - viraptor
Ajile系统(www.ajile.com)制造实时Java CPU。它们在裸机硬件上运行Java。中断响应延迟低于1微秒。线程到线程的上下文切换时间不到1微秒。100%CPU时的功耗最大为100毫瓦。性能与400Mhz的Pentium相当。使用它们的公司不会进行广告宣传。对他们来说,这是一种竞争优势。现在要找到做嵌入式Java实时的人有点难。我喜欢他们的硬件。它很有趣并且已经解决了真实公司的真实问题,并在全球范围内使用。 - Tim Williscroft
最新的jnode进展报告日期为:2008年。在本评论发布时已经过去了四年。从那以后有任何进展吗? - will

9

首先,RTOS并不仅仅是用C语言编写的。它们也可以用其他语言编写。但是用于RTOS的语言需要提供确定性行为。这意味着特定操作的延迟时间必须始终在特定时间范围内。这就排除了例如垃圾收集器,在大多数实现中将停止所有线程的执行一段不确定的时间。


1
天啊...这些大多数以前都是用FORTRAN和汇编语言编写的。 C RTOS就像是带有CD播放器和桶座的“进化”选项。在英特尔硬件上,相当多的实时系统工作是用PL/M编写的,你可以将其描述为宏汇编高级语言(3GL)。 - will
在单独的线程中运行Java垃圾回收是否是一个好主意? - undefined

6
  • 高度优化的 C 编译器可供所有 RTOS 典型运行的硬件使用。
  • 您可以相对轻松地在 C 代码中包含非常低级别的优化。
  • 许多有用的低级系统工具的 C 代码可供使用,因此可以轻松地将它们合并。

1
你的第二个理由很有道理。编写任何类型的操作系统,你都必须时不时地与硬件进行深入接触。Java 的设计初衷是为了掩盖真正低级别的东西,这一点显而易见。 - David Thornley

6

虽然不是必须,但更实用

作为一种语言,Java可以使用,实际上也有各种奇怪的案例。

但是,少数边缘案例和演示确实更多地证明了这个规则的例外。

总的来说,Java是一个复杂的系统,旨在用于业务逻辑而不是操作系统内核。

如果我们没有C语言,Java可能会朝着不同的方向或多个方向发展。

但是我们有C语言,它几乎完美地适用于操作系统内核,并且对于业务逻辑来说是相当具有挑战性的。

认为Java与C语言一样适合内核的论点,就像认为C语言与Java应用程序一样好一样不切实际。经验(除少数边缘案例外)证明了每种语言擅长的领域。


5
按照定义,RTOS必须支持确定性调度和执行。通常低中断延迟和直接硬件访问也是一个理想因素。Java中使用的技术,如垃圾回收、JIT编译和字节码执行使这些目标难以实现。
Java可能被用于实时系统,但通常它在RTOS上运行,而不是用于其实现。
尽管如此,声称RTOS总是用C语言实现也是不正确的。任何系统级语言都可以使用,包括汇编语言。在任何情况下,内核的至少一部分将是汇编语言。C++是一种合适的语言(显然因为它本质上是C的超集),许多商业RTOS都有C++包装器;我通常开发C++抽象层来支持RTOS的可移植性。
通常使用C的另一个原因是因为C(通常是C/C++)编译器通常是新架构(现在通常是GNU编译器实现的形式)可用的第一种语言,也经常是唯一的语言(除了汇编语言)。因此,如果您想将RTOS移植到最广泛的平台上,使用最普遍的语言是有意义的。

3
我认为Java在这个领域的最大问题是自动垃圾回收。这里有一个关于在Java中创建实时系统的链接:link

3

因为基于C的RTOS已经广为人知并且使用了几十年。对于许多具体情况,它们的行为是可预测的,并且您可以找到许多专家来开发这些系统。

我不知道有任何基于Java的RTOS已达到一个公司制作安全关键实时应用程序会采用的水平。

从技术上讲,没有反对基于Java的RTOS的论据,但是该主题的研究、工程和产品尚未成熟。


3

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

不一定。您也可以使用汇编语言、Ada等其他语言进行编码。

为什么不能使用Java或其他技术来编写呢?是因为Java中没有指针的概念吗?

不是。这是由于代码执行时间无法预测。


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