Java字节码中的平台无关性

4

我有时想知道为什么Java被称为平台无关的语言?

我找不到以下问题的合适解释:

  1. JVM在Windows/Linux/Mac OS上是否相同?
  2. 在以上环境中,是否对于同一类生成相同的字节码?

如果上述问题的答案是否定的,那么如何实现平台无关性。

请帮我了解这个基本概念。

7个回答

9

JVM在Windows/Linux/Mac OS上是相同的吗?

完全不同。编译器在所有平台上都是相同的。但是,由于它是一个可执行文件,因此文件本身将是不同的,即在Windows上,它将是.exe,在Linux上,它将是Linux可执行文件等。

在上述环境中,同一类生成的字节码是否相同?

是的。这就是为什么Java是编译一次,到处运行的原因。

enter image description here

在开始之前,请阅读由Oracle提供的此文档


+1 但您没有说编译器生成的 .class 文件在所有平台上都是相同的,并且它完全由 JLS(http://docs.oracle.com/javase/specs/jls/se7/html/index.html)和 JVMS(http://docs.oracle.com/javase/specs/jvms/se7/html/index.html)规定。 - Aubin
@Aubin 说得好。但是如果我开始写作...就有很多要提到的地方了。这就是为什么我添加了链接。在那个链接中,你的观点在第二段中 :) - Suresh Atta

3
机器依赖性:这意味着你在硬件架构上想要执行的任何内容都不能在另一种架构上执行。例如,如果你已经为AMD架构创建了一个可执行文件,它将无法在Intel架构上运行。接下来是平台依赖性,如果你为Windows操作系统创建了某个可执行文件,则它将无法在Linux上运行。使用汇编语言(由处理器提供)或机器语言编写的代码具有机器依赖性,但如果你使用C、CPP、JAVA编写代码,则你的代码就是机器无关的,这是由底层操作系统提供的。
平台无关性:如果你创建了一些C或CPP代码,则它会变成平台相关的,因为它会生成一个中间文件即编译文件,该文件匹配底层操作系统所提供的指令集。因此,你需要一些中介程序,可以理解编译器和操作系统。Java通过创建JVM实现了这一点。请注意:如果你删除了操作系统,即本身是使用某种语言创建的程序,该程序可以直接与底层计算机架构通信,则没有语言是机器无关的。操作系统是一种接受你的编译代码并在底层架构上运行它的程序。

2

1)Windows/Linux/Mac OS使用的JVM是相同的吗?

答案 ===> 不是,每个操作系统需要不同的 JVM。

2)在上述环境下,同一类别生成的字节码相同吗?

答案 ====> 是的,生成的字节码将是相同的。

以下解释将为您提供更多澄清。

{App1(Java代码)------>App1byteCode}........{(JVM+MacOS) 可帮助处理App1、App2、App3} {App2(Java代码)----->App2byteCode}........{(JVM+LinuxOS) 可帮助处理App1、App2、App3} {App3(Java代码)----->App3byteCode}........{(JVM+WindowsOS) 可帮助处理App1、App2、App3}

这是如何发生的?

答案--> JVM 有能力读取字节码并根据底层操作系统作出响应,因为 JVM 与操作系统同步。

所以我们发现,需要与特定平台同步的 JVM。

但主要的问题是,程序员不必知道特定平台的具体知识,可以编写他的应用程序。

使用 Java 语言编写程序,将其编译为字节码并在任何计算机上运行(是的,需要 与平台相关的 JVM 来执行它),使 Java 平台无需依赖于特定操作系统。


2
平台无关性的意思是,您只需要以一种格式分发Java程序。
这种格式将由每个平台上针对该平台进行优化编码的JVM解释,以便在任何存在JVM的地方运行。

1

观看这个两分钟的视频教程,希望能帮助你理解为什么Java是跨平台的?所有内容都在短短的2分37秒内解释清楚了。

为什么Java是跨平台的? https://www.youtube.com/watch?v=Vn8hdwxkyKI

以下是解释:

运行任何Java程序需要两个步骤: (i) 编译步骤 (ii) 解释步骤。

Java编译器通常称为“javac”,用于编译任何Java文件。在编译过程中,Java编译器将编译Java文件的每个语句。如果Java程序包含任何错误,则会在输出屏幕上生成错误消息。在编译过程成功完成后,编译器将创建一个新文件,称为类文件/二进制编码文件/字节码文件/魔术代码文件。

生成的类文件是一个二进制文件,因此需要Java解释器(通常称为Java)来解释类文件的每个语句。成功解释过程后,机器将在输出屏幕上生成输出。

这个生成的类文件是一个二进制编码文件,它依赖于Java解释器提供的组件,不依赖于操作系统中可用的工具和组件。
因此,我们可以在任何类型的操作系统中运行Java程序,只要操作系统中有Java解释器可用即可。因此,Java语言被称为平台无关语言。

1
Java被称为平台无关语言,因为你只需要在任何操作系统上运行代码所需的就是该系统的JVM。JVM将你的Java代码命令映射到系统命令,因此你不需要为任何操作系统更改代码,只需安装该系统的JVM(应由Oracle提供)。口号是“编写一次,随处运行”。

JVM 只有在必要时才将字节码映射到系统命令/系统调用。除非将其转换为指令集/汇编语言/对象代码/机器代码,否则不会直接映射任何语言代码。 - Ajay Bhojak
@AjayBhojak的“your java codes commands”指的是从您的Java代码编译运行时执行的命令。我认为人们已经理解了这一点。 - LuigiEdlCarno

1

当你在Java中运行一个应用程序时,会发生两件事情:

  • Java编译器(javac)将源代码编译成字节码(存储在.class文件中)

    Java字节码(.class)是与操作系统无关的,它在所有不同的操作系统中具有相同的扩展名。但由于这不特定于任何操作系统或其他环境,没有人可以运行它(除非有一台机器的本地指令集是字节码,即它们可以理解字节码本身)。

  • JVM加载并执行字节码

    虚拟机(VM)是一种计算机程序的软件实现,它像物理机一样执行程序。Java也有一个名为Java虚拟机(JVM)的虚拟机。

Java Code Execution Process

JVM有一个类加载器,将编译的Java字节码加载到运行时数据区。它还有一个执行引擎,用于执行Java字节码。重要的是,JVM是平台相关的。不同的操作系统和其他环境需要不同的JVM。
执行引擎必须将字节码转换为JVM中机器可执行的语言。这包括各种任务,如查找性能瓶颈和重新编译(为本地代码)经常使用的代码部分。字节码可以通过以下两种方式之一转换为适当的语言:
解释器:逐个读取、解释和执行字节码指令
JIT(即时编译器):为了弥补解释器的缺点,引入了JIT编译器。执行引擎首先作为解释器运行,然后在适当的时候,JIT编译器将整个字节码编译为本地代码。之后,执行引擎不再解释该方法,而是直接使用本地代码执行。在本地代码中执行比逐个解释指令快得多。由于本地代码存储在缓存中,因此编译后的代码可以快速执行。

简而言之,Java代码将被编译成字节码,这是平台无关的。Java有一个虚拟机(JVM),针对不同平台(操作系统等)具有特定的虚拟机,可以加载和解释这些字节码到机器特定的代码。

参考:


非常感谢,解释得非常清楚。 - Sashi Kant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接