当Java需要JVM来运行时,它如何实现跨平台?

81

我刚开始学习Java,对于平台无关性这个主题感到困惑。

“无关性”难道不意味着Java代码应该可以在任何计算机上运行,并且不需要安装特殊软件吗?然而,JVM需要在计算机上安装。

例如,我们需要Turbo C编译器才能编译C / C ++源代码,然后执行它。计算机必须安装C编译器。

请问当Java被描述为“平台无关”的时候,这是什么意思?


4
据我最后查看的情况,它可以在 Borland 的网站上免费下载。 - dan04
1
是的,被列为古董软件...(http://edn.embarcadero.com/article/20841)。 - Matthew Flaschen
2
执行编译后的程序不需要Turbo C(或任何其他“本地”编译器)。编译器会生成一个.exe文件。最多只需要运行时库(在一个.dll文件中),而不是整个编译器。 - Javier
24个回答

2
简单来说:
Java编程语言是跨平台的。
JVM是与平台相关的。

2

JVM(即Java虚拟机)是一个包含大量文件的程序集合,提供各种在文件夹中存在的功能(即以中间层格式的程序集合),称为packagesJVM有助于不使操作系统过载,它仅通过自身执行.class文件或Java应用程序。它有助于在Java编译器编译之后将平等性变为中间级格式,然后提供字节码(.class文件)表示形式,该表示形式不特定于o/sprocessor
JVM将字节码转换为.exe文件,以便处理器能够理解,并根据从字节码接收到的每个函数提供内存分配。
JVM还在控制结束其执行后从RAM中释放内存分配。


1

Java并不是平台无关的,因为它运行在JVM上。话虽如此,通过针对一个单一抽象机器进行编程,你可以获得平台无关性,这个抽象机器在大多数常见的操作系统平台(以及一些嵌入式设备)上有具体实现。

一个相关的概念是许多操作系统中存在的硬件抽象层,它允许同样的操作系统在不同的硬件上运行。

在你的原始问题中,Turbo C类似于javac程序,而JVM则是操作系统/硬件抽象层。


1
“Independent” 意味着Java代码能够在任何机器上运行,不需要安装任何特殊的软件(在这种情况下,必须安装JVM)。使用Java,您可以在Windows上编译源代码,编译的代码(准确来说是字节码)可在任何运行JVM的平台上执行(解释)。因此,您需要一个JVM,但JVM可以运行任何已编译的代码,编译的代码是独立于平台的

换句话说,您既具有源代码的可移植性,也具有编译代码的可移植性。
“例如,我们需要Turbo C编译器才能编译C / C ++源代码,然后执行它…机器必须具备C编译器。”
机器不必具备C编译器,而必须使用特定于平台的二进制文件。对于C或C ++,编译的代码是针对每个架构特定的,它是独立于平台的
换句话说,对于C / C ++,您具有源代码的可移植性(需要一些规定),但没有编译代码的可移植性:您需要重新编译为每个架构生成特定于平台的二进制文件。

1

JVM(Java虚拟机)将会依赖于平台。
但是无论它生成什么,都将是平台无关的。[我们称之为字节码或者简单地说...类文件],因此Java被称为平台无关的。
你可以在Mac和Windows上运行相同的类文件,但需要JRE。


0

关于JVM和JIT编译的讨论,有一点需要注意。 这与C#和CLR以及Python在某种程度上是相同的原理。当有人说代码直接运行在硬件上时,实际上是正确的,因为已经编译的指令将能够利用正在运行的机器/CPU上的优化。因此,即使模块的初始编译速度较慢,下次运行此模块时,执行的代码将以本地速度运行,因此可以说直接运行在硬件上。


0
{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有能力读取ByteCode并根据底层操作系统做出响应,因为JVM与操作系统同步。
所以我们发现,我们需要与平台同步的JVM。
但最重要的是,程序员不必了解特定平台的知识,并在编写应用程序时考虑一个特定的平台。
Java编写程序的灵活性——编译成ByteCode并在任何机器上运行(需要具有平台相关的JVM才能执行它)使Java平台独立。

0

Javac 是一个编译器,可以将源代码转换为字节码。 JVM 是一个解释器,可以将字节码转换为机器语言代码。

众所周知,Java是一种基于编译器和解释器的语言。一旦Java代码(也称为源代码)被编译,它就会被转换为本地代码,即字节码,这是可移植的,并且可以在所有操作系统上轻松执行。生成的字节码通常以十六进制格式表示。该格式在每个平台上都相同,无论是Solaris工作站、Macintosh、Windows还是Linux。在编译后,解释器读取生成的字节码,并根据主机机器进行翻译。字节码由Java虚拟机解释,该虚拟机可用于我们安装的所有操作系统。因此,要将Java程序移植到新平台,只需要移植解释器和一些库例程。

希望对您有所帮助!!!


0

当我们编译C源代码时,它会生成本地代码,可以被当前操作系统理解。 当我们将此源代码移动到其他操作系统时,由于本地代码的表示方式从一个操作系统到另一个操作系统发生了变化,因此操作系统无法理解它。 因此,C或C++是平台相关的。

现在,在Java的情况下,编译后我们得到的是字节码而不是本地代码。当我们运行字节码时, 它会通过JVM转换为本地代码,然后执行。

因此,Java是跨平台的,而C或C++则不是跨平台的。


0

就 Java 开发者而言,Java 在平台无关方面是独立的,但对于最终用户来说情况并非如此,他们需要具有平台相关的 JVM 才能运行 Java 代码。基本上,当 Java 代码被编译时,通常会生成一个平台无关的字节码。因此,开发人员必须为整个平台系列编写单一代码。但是,这种好处会给最终用户带来麻烦,因为他们需要安装 JVM 才能运行已编译的代码。这个 JVM 每个平台都不同。因此,依赖性只对最终用户产生影响。


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