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

时间:2013-06-14 05:40:12

标签: java jvm cross-platform

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

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

  1. Windows / Linux / Mac OS的JVM是否相同?
  2. 在上述环境中,同一个类的字节码是否相同?
  3. 如果上述问题的答案为否,则表明如何实现平台独立性。

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

7 个答案:

答案 0 :(得分:8)

  

对于Windows / Linux / Mac OS,JVM是否相同?

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

  

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

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

enter image description here

开始please read this doc by oracle之前

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

回答===> NO, 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具有根据底层操作系统读取字节码和响应的功能由于JVM与操作系统同步。

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

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

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

观看这个2分钟的视频教程希望这有助于您了解为什么java与平台无关?一切都在2分37秒内解释。

  

Why Java is platform independent? https://www.youtube.com/watch?v=Vn8hdwxkyKI

以下是对此的解释;

运行任何java程序需要两个步骤,即 (i)汇编& (ii)解释步骤。

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

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

这个生成的类文件是二进制编码文件,它取决于java解释器(java)提供的组件。不依赖于工具和操作系统中可用的组件。

因此,我们可以在任何类型的操作系统中运行java程序,提供的java解释器应该在操作系统中可用。因此,Java语言被称为平台无关语言。

答案 6 :(得分:1)

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

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

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

  • JVM加载并执行字节码

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

Java Code Execution Process

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

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

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

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

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

参考:

相关问题