我刚开始学习Java,对于平台无关性这个主题感到困惑。
“无关性”难道不意味着Java代码应该可以在任何计算机上运行,并且不需要安装特殊软件吗?然而,JVM需要在计算机上安装。
例如,我们需要Turbo C编译器才能编译C / C ++源代码,然后执行它。计算机必须安装C编译器。
请问当Java被描述为“平台无关”的时候,这是什么意思?
我刚开始学习Java,对于平台无关性这个主题感到困惑。
“无关性”难道不意味着Java代码应该可以在任何计算机上运行,并且不需要安装特殊软件吗?然而,JVM需要在计算机上安装。
例如,我们需要Turbo C编译器才能编译C / C ++源代码,然后执行它。计算机必须安装C编译器。
请问当Java被描述为“平台无关”的时候,这是什么意思?
JVM
(即Java虚拟机)是一个包含大量文件的程序集合,提供各种在文件夹中存在的功能(即以中间层格式的程序集合),称为packages
。JVM
有助于不使操作系统过载,它仅通过自身执行.class
文件或Java应用程序。它有助于在Java编译器编译之后将平等性变为中间级格式,然后提供字节码(.class文件)表示形式,该表示形式不特定于o/s
和 processor
。
JVM
将字节码转换为.exe
文件,以便处理器能够理解,并根据从字节码接收到的每个函数提供内存分配。
JVM
还在控制结束其执行后从RAM中释放内存分配。
Java并不是平台无关的,因为它运行在JVM上。话虽如此,通过针对一个单一抽象机器进行编程,你可以获得平台无关性,这个抽象机器在大多数常见的操作系统平台(以及一些嵌入式设备)上有具体实现。
一个相关的概念是许多操作系统中存在的硬件抽象层,它允许同样的操作系统在不同的硬件上运行。
在你的原始问题中,Turbo C类似于javac程序,而JVM则是操作系统/硬件抽象层。
JVM(Java虚拟机)将会依赖于平台。
但是无论它生成什么,都将是平台无关的。[我们称之为字节码或者简单地说...类文件],因此Java被称为平台无关的。
你可以在Mac和Windows上运行相同的类文件,但需要JRE。
关于JVM和JIT编译的讨论,有一点需要注意。 这与C#和CLR以及Python在某种程度上是相同的原理。当有人说代码直接运行在硬件上时,实际上是正确的,因为已经编译的指令将能够利用正在运行的机器/CPU上的优化。因此,即使模块的初始编译速度较慢,下次运行此模块时,执行的代码将以本地速度运行,因此可以说直接运行在硬件上。
Javac 是一个编译器,可以将源代码转换为字节码。 JVM 是一个解释器,可以将字节码转换为机器语言代码。
众所周知,Java是一种基于编译器和解释器的语言。一旦Java代码(也称为源代码)被编译,它就会被转换为本地代码,即字节码,这是可移植的,并且可以在所有操作系统上轻松执行。生成的字节码通常以十六进制格式表示。该格式在每个平台上都相同,无论是Solaris工作站、Macintosh、Windows还是Linux。在编译后,解释器读取生成的字节码,并根据主机机器进行翻译。字节码由Java虚拟机解释,该虚拟机可用于我们安装的所有操作系统。因此,要将Java程序移植到新平台,只需要移植解释器和一些库例程。
希望对您有所帮助!!!
当我们编译C源代码时,它会生成本地代码,可以被当前操作系统理解。 当我们将此源代码移动到其他操作系统时,由于本地代码的表示方式从一个操作系统到另一个操作系统发生了变化,因此操作系统无法理解它。 因此,C或C++是平台相关的。
现在,在Java的情况下,编译后我们得到的是字节码而不是本地代码。当我们运行字节码时, 它会通过JVM转换为本地代码,然后执行。
因此,Java是跨平台的,而C或C++则不是跨平台的。
就 Java 开发者而言,Java 在平台无关方面是独立的,但对于最终用户来说情况并非如此,他们需要具有平台相关的 JVM 才能运行 Java 代码。基本上,当 Java 代码被编译时,通常会生成一个平台无关的字节码。因此,开发人员必须为整个平台系列编写单一代码。但是,这种好处会给最终用户带来麻烦,因为他们需要安装 JVM 才能运行已编译的代码。这个 JVM 每个平台都不同。因此,依赖性只对最终用户产生影响。
.exe
文件。最多只需要运行时库(在一个.dll
文件中),而不是整个编译器。 - Javier