当Java需要JVM运行时,它是如何独立于平台的?

2022-08-31 12:28:10

我刚刚开始学习Java,我对平台独立性的话题感到困惑。

“独立”是否意味着Java代码应该在任何机器上运行,并且不需要安装特殊软件?然而,JVM需要存在于机器中。

例如,我们需要有Turbo C编译器才能编译C / C++源代码,然后执行它。机器必须有C编译器。

有人可以请问Java被描述为“独立于平台”是什么意思吗?


答案 1

通常,编译的代码是CPU“执行”程序所需的确切指令集。在Java中,编译的代码是“虚拟CPU”的一组精确指令,它需要在每台物理机上都正常工作。

因此,从某种意义上说,Java语言的设计者决定该语言和编译的代码将独立于平台,但由于代码最终必须在物理平台上运行,因此他们选择将所有依赖于平台的代码放在JVM中。

JVM 的这一要求与您的 Turbo C 示例形成鲜明对比。使用Turbo C,编译器将生成与平台相关的代码,并且不需要类似JVM的工作,因为编译的Turbo C程序可以由CPU直接执行。

使用Java,CPU执行JVM,这与平台有关。然后,此运行的 JVM 将执行与平台无关的 Java 字节码,前提是您有一个可用于执行的 JVM。你可能会说,编写Java代码,你不是为在物理机器上执行的代码而编程,而是编写要在Java虚拟机上执行的代码。

所有这些 Java 字节码在所有 Java 虚拟机上工作的唯一方法是,已经为 Java 虚拟机的工作方式编写了一个相当严格的标准。这意味着无论您使用哪种物理平台,Java字节码与JVM接口的部分都可以保证仅以一种方式工作。由于所有JVM的工作方式完全相同,因此相同的代码在任何地方都完全相同,而无需重新编译。如果您无法通过测试来确保它相同,则不允许将虚拟机称为“Java 虚拟机”。

当然,有一些方法可以破坏Java程序的可移植性。您可以编写一个程序来查找仅在一个操作系统(例如cmd.exe上找到的文件)。您可以使用 JNI,它有效地允许您将编译的 C 或C++代码放入类中。您可以使用仅适用于特定操作系统的约定(例如假设“:”分隔目录)。但是,您可以保证永远不必为其他机器重新编译程序,除非您正在做一些非常特别的事情(例如JNI)。


答案 2
            Technical Article on How java is platform indepedent?

在进入细节之前,首先你必须了解平台的含义是什么?平台由计算机硬件(主要是微处理器的架构)和操作系统组成。

任何与平台无关的东西都可以在任何操作系统和硬件上运行。

Java是独立于平台的,因此Java可以在任何操作系统和硬件上运行。现在的问题是它是如何独立于平台的?

这是因为字节码的魔力是独立于操作系统的。当java编译器编译任何代码时,它会生成字节码而不是机器原生代码(与C编译器不同)。现在,此字节代码需要一个解释器在机器上执行。这个解释器是JVM。因此,JVM读取字节码(与机器无关)并执行它。不同的JVM是为不同的操作系统设计的,字节码能够在不同的操作系统上运行。

在C或C++(不与平台无关的语言)的情况下,编译器会生成.exe文件,该文件是操作系统的,因此当我们在另一个操作系统上运行此.exe文件时,它将不会运行,因为此文件是操作系统的,因此与另一个操作系统不兼容。

最后,独立于操作系统的中间字节代码使java平台独立。


推荐