java 如何解决可移植性问题?
How java solved portability?
Java 编译器将 Java 代码转换为字节码,然后 JVM 将字节码转换为机器指令。据我所知,JVM 是为不同的平台构建的(处理器 + OS)。那我们怎么能说 Java 是平台无关的呢?最终,我们需要一个依赖于平台的 JVM?
end-user在java中编写代码,并且与平台无关。
JVM 工程师致力于创建 JVM 和 JRE 以及其中针对不同平台的编译器和解释器。因此, 免除了 end-user 将他们的代码库 移植到不同平台的担忧。编写一次,然后 运行 它可以在所有平台上运行(只要该平台有可用的 JVM)。
所以从 end-user(Java 程序员)的角度来看,java 代码确实是 platform independent
因为它可以 运行 任何地方而无需任何更改.尽管JVM移植到不同的平台,确实platform dependent
.
与C/C++的区别:
与 JVM 一样,每个平台都有一个 C/C++ 编译器负责 translating source to machine/processor
指令。处理器可以理解这些机器指令,例如:intel 等。因此,C/C++ 编译器可用于它支持的每个平台。但是,您可能需要 link 特定 OS/platform 程序中的特定库。这将使您的程序平台特定,并且需要通过 linking 到该库的该平台版本来为另一个平台重写。 这成为 C/C++ 程序员的责任。此外,每个 C/C++ 编译器都有自己特定于平台的变幻莫测,这与 JVM 不同,JVM 提供跨平台的一致视图,详见下文。
在 Java 的情况下,您无法利用平台特性(除非 JVM 或 Java 库不提供它,但它们通常涵盖大部分基础知识)。 java 代码利用 JVM 和 Java 库,JVM 负责在 运行 时将其转换为 bytecode or to machine instructions
(以提高性能)。除非您在 java 源中使用 JNI
,否则您不必担心可移植性。例如:在您的 Java 程序中,您可以访问本机环境、主机内存、某些 OS 特性等,并且您的代码仍然是可移植的。 JVM 提供基础结构,本地调用可以提取特定于平台的信息。但是,您的 java 程序可能需要某些特定于平台的功能,而 JVM 或 Java 库未提供这些功能,因此您需要 JNI,因此您的可移植性会受到影响。
注意:C/C++/Java都具有源代码可移植性。但是 JVM 提供的是二进制可移植性。在称为 JVM(虚拟机)的抽象上编译或解释的 java 代码 运行s。 java 程序员写入该接口而不是 JVM 运行 所在的平台。这里有明显的区分。
正如您自己提到的,JVM
是 platform-dependent。就是这样 - JVM
是 platform-dependent,但不是 JAVA
。毕竟,JVM 需要 运行 以某种方式位于本机机器内部,因此它必须特定于该平台。
JAVA
是可移植的,因为编译后的代码是可移植的。例如,如果与 C
进行比较,C 和 Java 源代码都是可移植的,这意味着它们都提供了源代码可移植性。一旦您在 Windows PC 中编写了源代码,您就可以将确切的代码传输到另一台 Linux 机器上,并且 Java 和 C 代码都可以编译并且 运行两台机器。
但是,目标代码的可移植性呢?
我们知道,当我们编译C代码时,它会产生机器可读的目标代码。因此,如果您从一台机器编译 C 源代码,那么如果它们不兼容,则该目标代码可能不是来自另一台机器的 运行。但是,在 JAVA 的情况下,如果您将 Java 源代码从一台机器编译为字节码,则该字节码在任何 运行 是 JVM 的机器中都可以是 运行。
另一个有趣的事实,通过成功编译 Java 源代码,我们还为一些未知的未来 CPU 生成字节码,它甚至不存在,因为 JVM 充当一种虚拟 CPU.
Java 编译器将 Java 代码转换为字节码,然后 JVM 将字节码转换为机器指令。据我所知,JVM 是为不同的平台构建的(处理器 + OS)。那我们怎么能说 Java 是平台无关的呢?最终,我们需要一个依赖于平台的 JVM?
end-user在java中编写代码,并且与平台无关。
JVM 工程师致力于创建 JVM 和 JRE 以及其中针对不同平台的编译器和解释器。因此, 免除了 end-user 将他们的代码库 移植到不同平台的担忧。编写一次,然后 运行 它可以在所有平台上运行(只要该平台有可用的 JVM)。
所以从 end-user(Java 程序员)的角度来看,java 代码确实是 platform independent
因为它可以 运行 任何地方而无需任何更改.尽管JVM移植到不同的平台,确实platform dependent
.
与C/C++的区别:
与 JVM 一样,每个平台都有一个 C/C++ 编译器负责 translating source to machine/processor
指令。处理器可以理解这些机器指令,例如:intel 等。因此,C/C++ 编译器可用于它支持的每个平台。但是,您可能需要 link 特定 OS/platform 程序中的特定库。这将使您的程序平台特定,并且需要通过 linking 到该库的该平台版本来为另一个平台重写。 这成为 C/C++ 程序员的责任。此外,每个 C/C++ 编译器都有自己特定于平台的变幻莫测,这与 JVM 不同,JVM 提供跨平台的一致视图,详见下文。
在 Java 的情况下,您无法利用平台特性(除非 JVM 或 Java 库不提供它,但它们通常涵盖大部分基础知识)。 java 代码利用 JVM 和 Java 库,JVM 负责在 运行 时将其转换为 bytecode or to machine instructions
(以提高性能)。除非您在 java 源中使用 JNI
,否则您不必担心可移植性。例如:在您的 Java 程序中,您可以访问本机环境、主机内存、某些 OS 特性等,并且您的代码仍然是可移植的。 JVM 提供基础结构,本地调用可以提取特定于平台的信息。但是,您的 java 程序可能需要某些特定于平台的功能,而 JVM 或 Java 库未提供这些功能,因此您需要 JNI,因此您的可移植性会受到影响。
注意:C/C++/Java都具有源代码可移植性。但是 JVM 提供的是二进制可移植性。在称为 JVM(虚拟机)的抽象上编译或解释的 java 代码 运行s。 java 程序员写入该接口而不是 JVM 运行 所在的平台。这里有明显的区分。
正如您自己提到的,JVM
是 platform-dependent。就是这样 - JVM
是 platform-dependent,但不是 JAVA
。毕竟,JVM 需要 运行 以某种方式位于本机机器内部,因此它必须特定于该平台。
JAVA
是可移植的,因为编译后的代码是可移植的。例如,如果与 C
进行比较,C 和 Java 源代码都是可移植的,这意味着它们都提供了源代码可移植性。一旦您在 Windows PC 中编写了源代码,您就可以将确切的代码传输到另一台 Linux 机器上,并且 Java 和 C 代码都可以编译并且 运行两台机器。
但是,目标代码的可移植性呢?
我们知道,当我们编译C代码时,它会产生机器可读的目标代码。因此,如果您从一台机器编译 C 源代码,那么如果它们不兼容,则该目标代码可能不是来自另一台机器的 运行。但是,在 JAVA 的情况下,如果您将 Java 源代码从一台机器编译为字节码,则该字节码在任何 运行 是 JVM 的机器中都可以是 运行。
另一个有趣的事实,通过成功编译 Java 源代码,我们还为一些未知的未来 CPU 生成字节码,它甚至不存在,因为 JVM 充当一种虚拟 CPU.