Java字节代码中的平台独立性

我有时想知道为什么Java被称为平台独立语言?

我无法找到以下几点的正确解释:

  1. JVM是否与Windows / Linux / Mac OS相同?
  2. 在上述环境中,对于同一个类,字节码是否相同?

如果上述问题的答案为否,那么如何实现平台独立性。

请帮助我学习这个基本概念。

JVM是否与Windows / Linux / Mac OS相同?

一点也不。 编译器在整个平台上是相同的。 但是,由于它是一个可执行文件 ,文件本身将是不同的,即在Windows上,它将是.exe,在Linux上,它将是Linux可执行文件等。

在上述环境中,对于同一个类,字节码是否相同?

是。 这就是Java为COMPILE ONCE的原因。 无论如何都要跑。

在此处输入图像描述

在开始之前, 请阅读oracle的这篇文档

机器依赖性:这意味着无论您想在硬件架构上执行什么,都无法在其他架构上执行。 如果您为AMD架构创建了可执行文件,它将无法在英特尔架构上运行。 现在平台依赖是你已经为你的Windows操作系统创建了一些不能在Linux上运行的可执行文件。用汇编语言编写的代码(由你的处理器提供)或机器语言是机器相关的,但是如果用C编写代码, CPP,JAVA然后您的代码是独立于机器的,由底层操作系统提供。

平台独立性:如果您创建一些C或CPP代码,那么它将变得与平台相关,因为它产生一个中间文件,即编译文件,它与底层操作系统提供的指令集相匹配。 所以你需要一些可以理解编译器和OS的中介.Java通过创建JVM实现了这一点。 注意:如果您删除的操作系统本身是使用某种语言创建的程序,而该语言可以直接与您的底层计算机体系结构通信,则该语言与计算机无关。 操作系统就是这样一个程序,它将您编译的代码运行到底层架构的顶层。

平台独立性的含义是您只需要以一种格式分发Java程序。

这种格式将由每个平台上的JVM解释(它们被编码为针对它们所在平台优化的不同程序),以便它可以在JVM存在的任何地方运行。

1)JVM是否与Windows / Linux / Mac OS相同?

回答===>不, JVM与All不同

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

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

以下说明将为您提供更多说明。

{App1(Java code)——> App1byteCode} …….. {(JVM + MacOS)帮助处理App1,App2,App3} {App2(Java Code)—–> App2byteCode} …….. {(JVM + LinuxOS)帮助处理App1,App2,App3} {App3(Java Code)—–> App3byteCode} …….. {(JVM + WindowsOS)帮助使用App1,App2,App3}

这是怎么回事?

Ans – > JVM具有根据底层操作系统读取字节码和响应的function由于JVM与OS同步。

所以我们发现,我们需要JVM与Sync with Platform。

但主要的事情是,程序员不必了解平台的具体知识,并编写他的应用程序,记住一个特定的平台。

Java语言编写程序的灵活性—编译为字节码并在任何机器上运行 (是的,需要平台相关JVM才能执行它) 使Java平台独立。

Java被称为平台独立语言,因为几乎所有在任何操作系统上运行代码所需的都是系统JVM。

JVM将您的java代码命令“映射”到系统的命令,因此您不必更改任何操作系统的代码,只需安装该系统的JVM(应该提供给Oracle)

信条是“一次编写,随处运行”。

观看这个2分钟的video教程希望这有助于您了解为什么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解释器应该在操作系统中可用。 因此,Java语言被称为平台无关语言。

在Java中运行应用程序时会发生两件事,

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

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

  • JVM加载并执行字节码

    虚拟机(VM)是执行诸如物理机器之类的程序的机器(即计算机)的软件实现。 Java还有一个名为Java Virtual Machine(JVM)的虚拟机。

Java代码执行过程

JVM有一个类加载器,可以将已编译的Java字节码加载到运行时数据区。 它有一个执行Java字节码的执行引擎。 而且重要的是他JVM依赖于平台。 您将拥有适用于不同操作系统和其他环境的不同JVM。

执行引擎必须将字节码更改为JVM中的机器可以执行的语言。 这包括各种任务,例如查找性能瓶颈和重新编译(对本机代码)经常使用的代码段。 字节码可以通过两种方式之一更改为合适的语言,

解释器:逐个读取,解释和执行字节码指令

JIT(即时)编译器:引入了JIT编译器以弥补解释器的缺点。 执行引擎首先作为解释器运行,并在适当的时候,JIT编译器编译整个字节码以将其更改为本机代码。 之后,执行引擎不再解释该方法,而是直接使用本机代码执行。 本机代码中的执行比逐个解释指令快得多。 由于本机代码存储在高速缓存中,因此可以快速执行编译的代码。

因此,在摘要中,Java代码将被编译为与平台无关的字节码,并且Java具有特定于每个不同平台(操作系统等)的虚拟机(JVM),其可以将这些字节码加载并解释为机器特定代码。

参考: