为什么操作系统不用Java编写?

11

到目前为止,所有操作系统都是用C/C++编写的,而没有用Java编写的。虽然有很多Java应用程序,但却没有操作系统。为什么呢?


1
http://en.wikipedia.org/wiki/JavaOS - user2357112
2
许多操作系统都是用C或C++以外的语言编写的。在C和C++之前,人们就已经开始编写操作系统了。然而,Java似乎不是一个特别好的选择。 - user2357112
有Jx出现了。令人惊奇的是,Java使用可变对象实例和通过类加载实现的黑白安全性以及像整数溢出之类的东西,对于我来说并不足够安全,因此我不建议将其用于实现安全操作系统,尽管乍一看似乎最适合它。 - Maarten Bodewes
5个回答

12

由于我们已经有了操作系统,因此 Java 并不是设计用于在裸机上运行的,但这并不是一开始看起来那么大的障碍。正如 C 编译器提供内置函数编译成特定指令一样,Java 编译器 (或 JIT,在这个上下文中没有实际区别) 也可以做同样的事情。处理 GC 和内存管理器之间的交互也有点棘手,但是它是可行的。结果就是一个 95% 由 Java 构成且准备运行 jar 的内核。接下来呢?

现在是编写操作系统的时候了。设备驱动程序、文件系统、网络堆栈等所有其他使计算机能够完成任务的组件。Java 标准库通常会大量依赖系统调用来完成重活,既因为必须如此,也因为“运行计算机很麻烦”。例如,写入文件涉及以下层次结构(至少我不是操作系统专家,所以我肯定会错过一些东西):

  1. 文件系统,必须找到文件的空间,更新其目录结构,处理日志,并最终决定需要写入哪些磁盘块以及以什么顺序。
  2. 块层,必须安排并发的写入和读取以最大化吞吐量,同时最大限度地保持公平性。
  3. 设备驱动程序,必须使设备保持愉悦并在正确的位置上进行操作。当然,每个设备都有其自己特殊的损坏方式,需要其自己的驱动程序。

所有这些都必须正常运行,并在十几个线程访问磁盘时保持性能良好,因为磁盘本质上是一堆共享可变状态。

最后,你得到了 Linux,除了它的功能和性能没有被充分投入外,它只能运行 Java。可能你从一个单一的地址空间和没有内核/用户空间区别中获得了性能提升,但是这种收益不值得投入的努力。

在一个特定语言的操作系统中有一种情况是有意义的:虚拟机。让底层操作系统处理计算机运行的困难部分,让租户操作系统处理将虚拟机转换为执行环境的任务。 BareMetalMirageOS 遵循这个模型。那么,为什么要这样做而不是使用Docker呢?这是一个好问题。


4
确实有一种名为JavaOS的操作系统。详情请见http://en.wikipedia.org/wiki/JavaOS
以下是讨论为何没有很多用Java编写的操作系统的内容,Is it possible to make an operating system using java?
简单来说,Java需要在JVM上运行,而JVM需要在操作系统上运行。用Java编写操作系统并不是一个好的选择。因为操作系统需要处理硬件,而这在Java中是做不到的(除非使用JNI)。这是因为JVM只提供了有限的命令供Java使用,包括添加、调用方法等。但是处理硬件需要直接操作寄存器、内存、CPU和硬件驱动程序的命令。这些命令在JVM中不能直接支持,所以需要使用JNI。这又回到了起点——仍然需要用C/汇编语言编写操作系统。
希望这能帮到你。

似乎这应该是一条注释。另外,JavaOS已经停止开发了。 - Dioxin
2
在我看来,必须使用汇编语言来编写操作系统的某些部分并不否定其余部分是用另一种语言(如Java、C#等)编写的事实。我还没有见过一个操作系统(即使是基于C或C++的操作系统)不包含至少一点汇编代码。这几乎不会使整个操作系统“回到起点”。此外,请记住:没有什么可以阻止您将Java编译为机器代码。 - Theodoros Chatzigiannakis
我记得在2000年代末期,VMware尝试推出一项技术,直接在ESX服务器上运行JVM,无需任何中间操作系统。 - riccardo.cardin

3

使用Java的主要优势之一是它抽象了许多通常您不需要关心的低级细节。这些细节在构建操作系统时是必需的。所以尽管您可以绕过这个问题用Java编写操作系统,但会有很多限制,并且您将花费大量时间与语言及其初始设计原则进行斗争。


3

对于操作系统,你需要在非常底层的地方工作。而在Java中这是一种痛苦。例如,你需要使用无符号数据类型,但Java只有有符号数据类型。你需要有 struct 对象,它们具有驱动程序期望的内存对齐方式(并且没有像Java为每个对象添加的对象标头)。

即使是Java本身的关键组件也不再是用Java编写的。

这绝不是暂时的事情。越来越多的东西会被重写为原生代码以获得更好的性能。HotSpot VM为性能关键的原生代码添加了 "intrinsics",并且正在努力降低原生调用的总成本。

例如JavaFX:它比AWT/Swing快得多的原因是因为它包含/使用大量的本机代码。它依赖本机代码进行渲染,并且如果你添加 "webview" 浏览器组件,它实际上使用webkit C库提供浏览器。

Java确实做了很多很好的事情。它是一种结构良好的语言,拥有一个极好的工具链。Python写起来更加简洁,但其工具链却很混乱,例如重构工具令人失望。Java的优点在于能够在运行时优化多态性。C++编译器需要进行昂贵的虚拟调用,因为在编译时不知道将使用哪个实现,而Hotspot则可以通过侵入式编写代码来获得更好的性能。但是对于操作系统来说,你并不需要这么多。你可以承受手动优化调用站点和内联。


1

这个回答并不打算详细阐述任何问题,但我想分享一下我的思考(这是一个非常广泛的主题)。

尽管在理论上可以使用纯 Java 编写某些操作系统,但实际上存在一些使得这项任务极为困难的实践问题。主要问题在于目前不存在一种最新且可靠的 Java 编译器能够将 Java 编译为字节码。因此,在我所知道的范围内,目前没有现有工具可以使得从头开始编写整个操作系统变得可行。

Java 被设计成在某些 Java 虚拟机的实现中运行。存在着 Windows、Mac、Linux、Android 等平台的实现。该语言的设计强烈依赖于 JVM 的存在,并期望运行时 JVM 会进行一些魔术操作(例如垃圾回收、即时编译器、反射等)。这很可能是为什么不存在这样的编译器的部分原因:所有这些功能都应该被编译成字节码吗?这是可能的,但我认为在这个时候这将会很困难。甚至 Android,其 SDK 完全基于 Java,也在 Linux 内核上运行 Dalvik(JVM 的一个版本,支持语言的子集)。


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