我有时想知道为什么 Java 被称为平台独立语言?
我找不到以下几点的正确解释:
- Windows/Linux/Mac OS 的 JVM 是否相同?
- 在上述环境中为同一个类生成的字节码是否相同?
如果上述问题的答案是否定的,那么如何实现平台独立性。
请帮助我学习这个基本概念。
我有时想知道为什么 Java 被称为平台独立语言?
我找不到以下几点的正确解释:
如果上述问题的答案是否定的,那么如何实现平台独立性。
请帮助我学习这个基本概念。
Windows/Linux/Mac OS 的 JVM 是否相同?
一点也不。编译器在各个平台上都是相同的。但是,因为它是一个可执行文件,所以文件本身会有所不同,即在 Windows 上,它将是 .exe,在 Linux 上,它将是 Linux 可执行文件等。
在上述环境中为同一个类生成的字节码是否相同?
是的。这就是 Java编译一次的原因。到处跑。
在开始之前,请阅读 oracle 的此文档
机器依赖:这意味着你想在你的硬件架构上执行的任何东西都不能在另一个架构上执行。就像如果您为您的 AMD 架构创建了一个可执行文件,它将无法在 Intel 的架构上运行。现在出现了平台依赖性,您已经为您的 Windows 操作系统创建了一些无法在 Linux 上运行的可执行文件。用汇编(由您的处理器提供)或机器语言编写的代码依赖于机器,但如果您用 C 编写代码, CPP,JAVA 那么你的代码是由底层操作系统提供的独立于机器的。
平台独立性:如果您创建一些 C 或 CPP 代码,那么它就成为平台相关的,因为它会生成一个中间文件,即与底层操作系统提供的指令集匹配的编译文件。因此,您需要一些可以理解编译器和操作系统的中介。Java 通过创建 JVM 实现了这一点。注意:如果您删除操作系统本身是使用可以直接与您的底层机器架构对话的某种语言创建的程序,则没有语言是机器独立的。操作系统就是这样一个程序,它获取您编译的代码并将其运行在底层架构之上。
平台独立性的含义是您只需以一种格式分发您的 Java 程序。
这种格式将由每个平台上的 JVM 解释(它们被编码为针对它们所在的平台优化的不同程序),以便它可以在 JVM 存在的任何地方运行。
1 ) Windows/Linux/Mac OS 的 JVM 是否相同?
答案 ===> 否, JVM 对所有人都不同
2)在上述环境中为同一个类生成的字节码是否相同?
答案 ====> YES ,生成的字节码将是相同的。
下面的解释将为您提供更多说明。
{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。
但最重要的是,程序员不必了解平台的特定知识并在记住一个特定平台的情况下编写他的应用程序。
这种用 Java 语言编写程序的灵活性 --- 编译成字节码并在任何机器上运行(是的,需要有Platform DEPENDENT JVM来执行它)使得 Java 平台独立。
Java 被称为平台独立语言,因为实际上在任何操作系统上运行代码所需的只是系统 JVM。
JVM 将您的 java 代码命令“映射”到系统的命令,因此您不必为任何操作系统更改代码,只需安装该系统的 JVM(应由 Oracle 提供)
信条是“一次编写,随处运行”。
观看这个 2 分钟的视频教程,希望这能帮助你理解为什么 java 是平台独立的?一切都在 2 分 37 秒内得到解释。
这是下面给出的解释;
运行任何java程序都需要两个步骤,即(i)编译和(ii)解释步骤。
Java编译器,俗称“javac”,用于编译任何java文件。在编译过程中,java编译器会编译java文件的每一个语句。如果 java 程序包含任何错误,那么它将在输出屏幕上生成错误消息。编译过程成功完成后,编译器将创建一个新文件,称为类文件/二进制编码文件/字节代码文件/魔术代码文件。
生成的类文件是一个二进制文件,因此通常称为 Java 的 java 解释器需要解释类文件的每个语句。成功完成解释过程后,机器将在输出屏幕上生成输出。
这个生成的类文件是一个二进制编码的文件,它依赖于 java 解释器 (java) 提供的组件,而不依赖于操作系统中可用的工具和组件。
因此,只要操作系统中应该有 java 解释器,我们就可以在任何类型的操作系统中运行 java 程序。因此,Java 语言被称为平台无关语言。
在 Java 中运行应用程序时会发生两件事,
Java 编译器 (javac) 将源代码编译成字节码(存储在 .class 文件中)
java Byte Code (.class) 是独立于操作系统的,它在所有不同的操作系统中具有相同的扩展名。但是由于这不是特定于任何操作系统或其他环境的,没有人可以运行它(除非有一台机器的本机指令集是字节码,即他们可以理解字节码本身)
JVM 加载并执行字节码
虚拟机(VM)是机器(即计算机)的软件实现,它像物理机器一样执行程序。Java 也有一个称为 Java 虚拟机 (JVM) 的虚拟机。
JVM 有一个类加载器,可以将编译后的 Java 字节码加载到运行时数据区。它有一个执行引擎来执行 Java 字节码。重要的是,JVM 依赖于平台。对于不同的操作系统和其他环境,您将拥有不同的 JVM。
执行引擎必须将字节码更改为 JVM 中机器可以执行的语言。这包括各种任务,例如查找性能瓶颈和重新编译(到本机代码)经常使用的代码部分。字节码可以通过以下两种方式之一更改为合适的语言,
解释器:一一读取、解释和执行字节码指令
JIT(即时)编译器:引入了 JIT 编译器来弥补解释器的缺点。执行引擎首先作为解释器运行,并在适当的时候,JIT 编译器编译整个字节码以将其更改为本机代码。之后,执行引擎不再解释该方法,而是直接使用本机代码执行。在本机代码中执行比一条一条解释指令要快得多。由于本机代码存储在缓存中,因此编译后的代码可以快速执行。
因此,总而言之,Java 代码将被编译成一个独立于平台的字节码,并且 Java 有一个特定于每个不同平台(操作系统等)的虚拟机 (JVM),它可以将这些字节码加载并解释为特定于机器的代码。
参考 :