jvm java是如何解决可移植性的?

8wtpewkr  于 2022-11-07  发布在  Java
关注(0)|答案(2)|浏览(159)

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

v8wbuo2f

v8wbuo2f1#

正如您自己所提到的,JVM是平台相关的。就是这样-JVM是平台相关的,但JAVA不是。毕竟,JVM需要以某种方式在本机内运行,所以它必须特定于该平台。
JAVA是可移植的,因为编译后的代码是可移植的。例如,如果你与C比较,C和Java源代码都是可移植的,这意味着它们都提供了源代码的可移植性。一旦你有了在Windows PC上编写的源代码,你可以将该代码转移到另一台Linux机器上,Java和C代码都可以在这两台机器上编译和运行。

但是,对象代码的可移植性如何?

我们知道,当我们编译一个C代码时,它会产生机器可读的目标代码。所以,如果你在一台机器上编译一个C源代码,那么如果它们不兼容的话,目标代码可能不能在另一台机器上运行。但是,在JAVA的情况下,如果你在一台机器上编译一个Java源代码成字节码,那么这个字节码可以在任何运行JVM的机器上运行。
另一个有趣的事实是,通过成功编译Java源代码,我们还为一些未知的未来CPU生成了字节代码,这些CPU甚至不存在,因为JVM充当了一种虚拟CPU。

piah890a

piah890a2#

最终用户使用 java 编写代码,这与平台无关。

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

因此从最终用户(Java程序员)的Angular 来看,Java代码确实是platform independent,因为它可以在任何地方运行,而无需任何更改。即使JVM被移植到不同的平台,也确实是platform dependent

与C/C++的差异:

与JVM一样,每个平台都有一个C/C++编译器负责translating source to machine/processor指令。这些机器指令可被处理器理解,例如:因此C/C编译器可用于它所支持的每个平台。然而,您可能需要在程序中链接到特定操作系统/平台的特定库。这将使您的程序特定于平台,并且需要通过链接到该库的另一个平台版本来针对该平台进行重写。**这成为C/C程序员的责任。此外,每个C/C++编译器具有其自己的特定于平台的变幻莫测的特性,这与JVM不同,JVM提供了下面详细描述的跨平台的一致视图。
如果是
Java**,您将无法利用平台特定性(除非JVM或Java库没有提供,但它们通常涵盖了大部分基础知识)。除非您在java源代码中使用JNI,否则您不必担心可移植性。例如:在Java程序中,您可以访问本地环境、主机内存、一些操作系统特性等,并且代码仍然是可移植的。JVM提供了基础结构,本地调用可以提取特定于平台的信息。但是,可能有一些Java程序所需的平台特定功能是JVM或Java库没有提供的,因此您需要JNI和结果便携性受到损害。

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

相关问题