Java如何解决可移植性?

问题描述 投票:0回答:2

Java编译器将Java代码转换为字节码,然后JVM将字节码转换为机器指令。据我了解,JVM 是为不同的平台(处理器+操作系统)构建的。那我们怎么能说Java是平台无关的呢?最终,我们需要一个依赖于平台的 JVM?

java jvm
2个回答
1
投票

正如您自己提到的,JVM 是依赖于平台的。就是这样——JVM 是平台相关的,但 Java 不是。毕竟,JVM 需要在本机机器内以某种方式运行,因此它必须特定于该平台。

Java 是可移植的,因为编译后的代码是可移植的。例如,如果与 C 进行比较,C 和 Java 源代码都是可移植的,这意味着它们都提供源代码可移植性。一旦您在 Windows PC 中编写了源代码,您就可以将该代码转移到另一台 Linux 计算机中,并且 Java 和 C 代码都可以在两台计算机中正常编译和运行。

但是,目标代码的可移植性怎么样?

我们知道,当我们编译 C 代码时,它会生成机器可读的目标代码。因此,如果您从一台机器编译 C 源代码,那么如果它们不兼容,则该目标代码可能无法从另一台机器运行。但是,对于 Java,如果您从一台机器将 Java 源代码编译为字节码,则该字节码可以在任何运行 JVM 的机器上运行。

另一个有趣的事实,通过成功编译 Java 源代码,我们还为某些未知的未来 CPU 生成字节码,这些 CPU 甚至不存在,因为 JVM 充当一种虚拟 CPU。


1
投票

最终用户用 Java 编写代码,并且与平台无关。

JVM 工程师致力于创建 JVM 和 JRE,以及其中针对不同平台的编译器和解释器。因此,这消除了最终用户将其代码库移植到不同平台的担忧。编写一次,然后在所有平台上运行它(只要有适用于该平台的 JVM)。

因此,从最终用户(Java 程序员)的角度来看,Java 代码确实是平台无关的,因为它可以在任何地方运行而无需任何更改。尽管 JVM 被移植到不同的平台并且确实是平台相关的。

与C/C++的区别

与 JVM 一样,每个平台都存在一个 C/C++ 编译器,负责将源代码转换为机器/处理器指令。这些机器指令可以被处理器理解,例如:Intel 等。因此,C/C++ 编译器可用于其支持的每个平台。但是,您可能需要链接到程序中特定操作系统/平台的特定库。这将使您的程序平台特定,并且需要通过链接到该库的该平台版本来针对另一个平台进行重写。这成为 C/C++ 程序员的责任。此外,每个 C/C++ 编译器都有自己特定于平台的变化,这与 JVM 不同,JVM 提供了跨平台的一致视图,详细信息如下。

对于 Java,您无法深入了解平台细节(除非 JVM 或 Java 库不提供它,但它们通常涵盖了大部分基础知识)。 Java 代码利用 JVM 和 Java 库,JVM 负责在运行时将其转换为字节码或机器指令(以提高性能)。除非您在 Java 源代码中使用 JNI,否则您不必担心可移植性。例如:在您的Java程序中,您可以访问本机环境、主机内存、某些操作系统特征等,并且您的代码仍然是可移植的。 JVM 提供了基础设施,以便本机调用提取特定于平台的信息。然而,您的 Java 程序可能需要一些特定于平台的功能,而 JVM 或 Java 库并未提供这些功能,因此您需要使用 JNI,从而导致您的可移植性受到影响。

注意:C/C++/Java 都具有源代码可移植性。但 JVM 提供的是二进制可移植性。编译或解释的 Java 代码在称为 JVM(虚拟机)的抽象上运行。 Java 程序员写入该接口,而不是 JVM 运行的平台。这里有明显的分离。

© www.soinside.com 2019 - 2024. All rights reserved.