不同的操作系统/平台有不同版本的 JVM。这意味着开发它的人已经为主要操作系统制作了不同的解释器。如果今天有一个新的操作系统出现,java 也会在它上面工作吗?那么,当我们说平台独立时,我们是在限制 JVM 可用的平台,还是 Java 实际上是平台独立的?
7 回答
你在这里混淆了几个不同的东西。
它是独立于平台的Java 编程语言,并且通过扩展,任何用它编写的程序。
JVM 本身不是平台独立的:它是平台相关的手段,通过它实现语言的平台独立性。
显然,Java 不能在没有 JVM 的平台上运行。因此,从字面意义上来说,Java 并不是独立于平台的。但与此同时,您对平台独立性的定义没有用。任何可能的语言都不可能真正独立于平台,因为平台的某些方面需要能够解析语言。考虑到所有可能的平台,有些平台必然无法解析它。
因此,考虑到很多很多平台都运行 JVM,并且 Java 代码可以在任何具有相同含义的 JVM 上运行,Java 是平台相关的。
对于 Java,平台独立性仅指这样一个事实,即如果您正确编写代码,则生成的编译代码应该在任何支持 JVM 的平台上运行不变且完全相同。
显然,如果没有 JVM,您就没有机会执行字节码。这个问题让我想知道将 JVM 移植到新平台实际上有多么困难。 Wpedia有(重新 HotSpot VM):
第三方也可以为 Mac OS X 和各种其他 Unix 操作系统提供端口。支持多种不同的硬件架构,包括 x86、PowerPC 和 SPARC(仅限 Solaris)。
移植 HotSpot 很困难,因为代码虽然主要用 C++ 编写,但包含大量汇编语言。为了解决这个问题,IcedTea 项目开发了 HotSpot 解释器的通用端口,称为零汇编程序 Hotspot(或零),几乎没有汇编代码。此端口旨在将 HotSpot 的解释器组件轻松适应任何 Linux 处理器架构。自 1.6 版起,HotSpot 的所有非 x86 端口(PPC、IA64、S390 和 ARM)都使用零汇编程序 Hotspot 的代码。
IcedTea 开发人员 Gary Benson 使用 LLVM 为 HotSpot 开发了一个独立于平台的即时编译器,称为 Shark,以补零。
有不同的方面需要考虑:
JVM规范对平台独立性不是很严格,就像它没有说明应该如何实现垃圾收集一样。因此,公司可以自由地将JVM的某些组件作为平台依赖来优化性能。所以执行编译代码的JVM不是平台独立的。您需要特定于该平台的 JVM,即 windows JVM、linux JVM、Mac OS JVM 等,并且同一平台有不同的 JVM 实现。
但是Java API、Java Language和Java Compiler是平台无关的。
简而言之:没有JVM,您无法在任何平台上解释Java代码。JVM是平台相关的。因此,如果今天有新的操作系统出现,java 代码将无法运行。
我不认为 Java 是完全独立于平台的。
因为:
线程调度工作的时间片取决于处理器、操作系统和平台。
AWT 图形随着输出设备的变化而变化,因此它显示了平台依赖性。