需要JVM运行时,Java平台如何独立?


79

我刚开始学习Java,但对平台独立性这个主题感到困惑。

“独立”是否意味着Java代码应该在任何计算机上运行并且不需要安装特殊软件?但是,JVM必须存在于计算机中。

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

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


4
@aaa:最后我检查了一下,可以在Borland的网站上免费下载。
dan04'5

1
是的,列为古董软件...(edn.embarcadero.com/article/20841)。
马修·弗拉申

2
不需要Turbo C(或任何其他“本机”编译器)来执行已编译的程序。编译器生成一个.exe文件。它最多需要一个运行时库(在.dll文件中),而不是整个编译器
Javier 2010年

Answers:


111

通常,编译后的代码是CPU“执行”程序所需的确切指令集。在Java中,编译后的代码是“虚拟CPU”的一组精确指令,在每台物理计算机上都必须运行相同的指令。

因此,从某种意义上讲,Java语言的设计人员认为该语言和编译后的代码将独立于平台,但由于该代码最终必须在物理平台上运行,因此他们选择将所有与平台相关的代码放入JVM。

JVM的这一要求与您的Turbo C示例相反。使用Turbo C,编译器将生成依赖于平台的代码,并且不需要进行类似JVM的工作,因为编译后的Turbo C程序可以直接由CPU执行。

使用Java,CPU执行依赖平台的JVM。然后,此运行中的JVM将执行与平台无关的Java字节码,前提是您具有可用于执行的JVM。您可能会说,编写Java代码,不是编写要在物理机上执行的代码,而是编写要在Java虚拟机上执行的代码。

所有这些Java字节码可在所有Java虚拟机上工作的唯一方法是,针对Java虚拟机的工作方式制定了相当严格的标准。这意味着无论您使用什么物理平台,都保证Java字节码与JVM接口的部分只能以一种方式工作。由于所有JVM的工作原理完全相同,因此相同的代码在任何地方都可以完全相同,而无需重新编译。如果您无法通过测试以确保其相同,则不允许将您的虚拟机称为“ Java虚拟机”。

当然,有一些方法可以打破Java程序的可移植性。您可以编写一个程序,查找仅在一个操作系统上找到的文件(例如,cmd.exe)。您可以使用JNI,它可以有效地将已编译的C或C ++代码放入一个类中。您可以使用仅适用于特定操作系统的约定(例如假设“:”分隔目录)。但是可以保证,除非您做特别特别的事情(例如JNI),否则永远不必为其他计算机重新编译程序。


1
“由于所有JVM的工作原理完全相同,因此相同的代码无需重新编译就可以在所有地方完全相同”。这句话是什么意思?每当您在安装了JVM的不同系统上运行同一程序时,我们始终会执行“ javac filename.java”。(例如,使用任何简单的程序)如果不需要再次重新编译该程序,那么为什么会说“我们可以在任何地方运行相同的代码而无需重新编译?”。请解释。
卡兰·塔卡

3
您需要编译Java源代码,因此需要编译“ javac filename.java”。但是,您只需要编译一次,而不是在使用它的每台计算机上编译一次(这与C和C ++不同)。如果更改CPU,32/64位系统,字节顺序等,代码仍将运行。这是因为输出“ filename.class”包含字节码,这是对JVM的指令。由于所有JVM在功能上都是相同的,因此在编译代码之后,您就可以在任何Java虚拟机上运行该字节码,而无需源代码。试试看,它有效。另外,您使一些注释使编译与重新编译混淆。
Edwin Buck

@KaranThakkar-我认为Edwin的意思应该是扩展,可以轻松地在任何平台上的项目中使用相同的.jar文件,而无需对其进行编译。
vanguard69 2013年

54
            Technical Article on How java is platform indepedent?

在进行详细介绍之前,首先您必须了解平台的含义是什么?平台由计算机硬件(主要是微处理器的体系结构)和操作系统组成。平台=硬件+操作系统

与平台无关的任何内容都可以在任何操作系统和硬件上运行。

Java是平台独立的,因此Java可以在任何操作系统和硬件上运行。现在的问题是,平台如何独立?

这是因为操作系统不依赖字节码的魔力。当Java编译器编译任何代码时,它会生成字节代码而不是机器本机代码(与C编译器不同)。现在,此字节代码需要一个解释器才能在计算机上执行。该解释器是JVM。因此,JVM读取(独立于机器的)字节代码并执行它。不同的JVM是为不同的OS设计的,字节码能够在不同的OS上运行。

如果使用C或C ++(非平台无关的语言),则编译器将生成OS依赖的.exe文件,因此当我们在另一个OS上运行此.exe文件时,该文件将无法运行,因为该文件是OS依赖的,因此与另一个操作系统。

最后,一个独立的中间操作系统字节代码使Java平台独立。


5
这是一个愚蠢的答案。Java平台独立的原因是Java依赖于VM。只要VM满足对OS操作的调用,它就不必关心它在什么操作系统上运行。VM本身并不是独立于平台的。您使用C / C ++语言提供的比较是虚假的,只需在该平台上编译源代码即可运行,为什么将那组指令带到不同的平台上并愚蠢地期望它将运行?您可以将Java源代码带到ARM并期望它在为我的custom_processor编译的VM上运行吗?
Abhinav Gauniyal,2016年

JVM的设计是相同的。Oracle会努力为每台机器设计不同的JVM。唯一的区别是要在某些计算机上运行的程序的字节码。每个程序都会生成不同类型的字节码。字节码文件采用十六进制格式,以便JVM和CPU理解并执行指令集。
卡兰·塔卡

26

这意味着Java程序员(理论上)不需要知道机器或OS的详细信息。这些细节确实存在,并且JVM和类库可以处理它们。此外,与C形成鲜明对比的是,Java二进制文件(字节码)通常可以移至完全不同的系统,而无需修改或重新编译。


10
“ ... Java二进制文件(字节码)通常可以移至完全不同的体系结构而无需重新编译。” 实际上,他们总是可以的。仅在将为较新的JVM编译的代码移动到较旧的JVM时才需要重新编译。
斯蒂芬C

@Stephen,我将其更改为“系统”。有许多因素会阻碍可移植性,包括使用JNA或JNI链接到仅针对单个体系结构编写的库​​。
马修·弗拉申

1
对我来说,JNA或JNI似乎是唯一的因素,而这些在现实世界中很少见。即使这样,字节码仍然可以始终移动而无需重新编译-只是您可能还必须重新编译JNI期望存在的库。字节码仍然是可移植的。
Kendall Helmstetter Gelner'5

同意...但是在任何情况下都不会重新编译“ Java二进制文件(字节码)”!
斯蒂芬C

我有一个问题,编译后的Java字节码是否与OS内核交互?如果是这样,由于内核功能不同,那么相同的字节码不能应用于不同的内核,可以吗?还是JVM包含了每个不同内核的所有内核功能,这
简直

9

不,这是另一回事。这是因为您使用了Java程序独立的虚拟机。

虚拟机不是独立的,您必须安装专门针对您的系统类型的虚拟机。虚拟机在操作系统之上创建一个独立的平台。


8

JVM是可以安装在不同系统上的“模拟机”。这样,相同的Java代码可以在不同的系统上运行,因为它依赖于JVM,而不依赖于操作系统本身。

也就是说,这允许程序员与虚拟系统(JVM)通信并利用其功能,而不是特定的机器和OS功能。由于Java仅依赖JVM,因此它与平台无关(如果平台已安装JVM)。

简而言之,Java并非独立于平台,因此它需要在所有应运行的系统上安装JVM。但是,它将在安装了JVM的所有系统上运行。


4

Java具有JVM(Java虚拟机),因此与平台无关。让我们用一个真实的例子来说明它。假设您有家人自由。但为什么?

因为您非常了解他们,他们也了解您。但是,您对我的家人没有自由。因为你不认识他们,他们也不认识你。但是,如果我是您的朋友,并且在可以向您介绍我的家人时,您就可以与他们自由交谈。

以类似的方式,如果您是代码,而我是JVM。另外,您的家庭是Windows平台,而我的家庭是Linux平台。如果您使用的是C或其他平台相关的语言,则您只会认识家庭成员,反之亦然。这就是为什么只有编写您的平台才能知道该代码并会对其进行支持的原因。但是,如果您是JAVA代码,并且当您来到我家时,也就是。Linux平台,如果您找到了我JVM,那么我可以向您介绍我的家庭Linux平台,您将可以与它进行交互。

对于平台相关的语言,没有像JVM这样的朋友可以将自己介绍给任何平台系列。这就是Java与平台无关的方式。:)


3

JVM从具体平台中提取。您的程序仅依赖JVM,并且由于JVM可用于Windows和Linux等不同平台,因此您的程序是独立于平台的(但取决于jvm)。


3

在c / c ++中,使用编译器进行编译后的源代码(c程序文件)被直接转换为本机代码(对于您在其上编译代码的特定机器可以理解)。因此,c / c ++的编译代码无法在不同的OS上运行。

但是在Java的情况下:java(.java)的源文件将使用JAVAC编译器(存在于JDK中)进行编译,该文件提供了字节码(.class文件),该字节码对于任何安装在任何OS(物理系统)上的JVM都可以理解。

在这里,我们需要为要在其中运行代码的不同操作系统使用不同的JVM(取决于平台),但是.class文件(编译后的代码/中间代码)保持不变,因为安装的任何JVM都可以理解。在任何操作系统上。

在c / c ++中:仅源代码与机器无关。在Java中:源代码和编译后的代码均与平台无关。

这使得Java平台(机器)独立。


3

Java不是平台独立的,它本身是一个平台,基于该平台的Java应用程序运行,但是Java平台本身是依赖于平台的


2

1:jvm(即Java虚拟机)是程序的集合,其中包含许多文件,这些文件提供称为的文件夹上存在的各种功能(即中级格式的程序的集合)packagesjvm有助于避免o/s仅在其.class自身仅执行文件或Java应用程序的地方过载。它有助于在Java编译器编译后使其相等性成为中间层格式,然后提供字节码(.class文件)表示不特定于o/sprocessor
2:jvm将字节码保存到.exe文件中,以使处理程序易于理解,并在收到frm字节码后为每个功能分配内存。
3:jvm还可以在控制完成执行后从ram释放内存分配。


2

JVM取决于操作系统。对于每个不同的JVM。

所有JVM的“ .class”都相同。因此,每个JVM都能理解“ .class”文件数据。

Windows依赖的JVM向Windows提供Windows依赖的指令linux依赖的JVM向Linux提供Linux的依赖指令。

就像其他操作系统一样。因此,java可在任何操作系统上运行。

这就是为什么Java是OS独立的。


2

简单来说:

Java编程语言 与平台无关。

JVM取决于平台


1

Java不是平台独立的,因为它在JVM上运行。话虽这么说,您可以通过针对一台抽象机进行编程来获得平台独立性,该抽象机在大多数常见的OS平台(和某些嵌入式设备)上都有具体的实现。

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

在您最初的问题中,Turbo C与javac程序类似,而JVM是OS / HAL。


1

独立不是意味着Java代码应该可以在任何计算机上运行并且不需要安装特殊软件(在这种情况下,必须在计算机中安装JVM)吗?

使用Java,您可以在Windows上编译源代码,并且可以在运行JVM的任何平台上执行(解释)编译后的代码(准确地说是字节码)。因此,是的,您需要一个JVM,但是JVM可以运行任何已编译的代码,该已编译的代码与平台无关

换句话说,您既具有源代码的可移植性,又具有编译后的代码的可移植性。

像,例如,我们需要拥有Turbo C编译器才能编译C / C ++源代码然后执行它。机器必须具有C编译器。

该计算机不必具有C编译器,而该计算机必须使用特定于平台的二进制文件。使用C或C ++,编译后的代码特定于每种体系结构,并且与平台无关

换句话说,使用C / C ++,您可以具有源代码的可移植性(需要一定的纪律),而不能具有已编译代码的可移植性:您需要将每种体系结构重新编译为平台特定的二进制文件。


1

JVM将取决于平台。
但是无论产生什么,都将与平台无关。[我们称其为字节码,或者简单地说就是...类文件]。因此,为什么Java被称为独立于平台。
您可以在Mac和Windows上也可以在Mac上运行相同的类文件,但这需要JRE。


0

字节码不是独立于平台的,而是其使字节码独立的JVM。字节码不是matchine代码。字节码是紧凑的数字代码,常量和引用(通常为数字地址),它们对诸如程序对象的类型,范围和嵌套深度之类的事物的解析和语义分析的结果进行编码。因此,它们比直接解释源代码具有更好的性能。字节码需要在执行之前进行解释,这通常由JVM解释器完成。


0

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


0

Java在Java开发人员方面与平台无关,但是对于最终用户而言,情况并非如此,最终用户需要具有平台相关的JVM才能运行Java代码。基本上,当编译Java代码时,会生成一个通常与平台无关的字节码。因此,开发人员必须为整个平台系列编写一个代码。但是,对于需要安装JVM才能运行此编译代码的最终用户而言,这种好处会带来很多麻烦。对于每个平台,此JVM都不相同。因此,依赖关系仅对最终用户有效。


0

Javac –将源代码转换为字节码的编译器。 JVM-将字节码转换为机器语言代码的解释器。

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

希望能帮助到你!!!


0

当我们编译C源数据时,它将生成可被当前操作系统理解的本机代码。当我们将此源代码移至其他操作系统时,操作系统无法理解它,因为本机代码意味着表示形式从OS更改为OS,因此C或C ++依赖于平台。

现在以Java为例,编译后我们得到的是字节码而不是本机代码。当我们运行字节码时,它将在JVM的帮助下转换为本地代码,然后将其执行。

因此,Java与平台无关,而C或C ++与平台无关。


0

很好的问题,但是当编译器将源代码更改为中间本机字节代码时,通过在一次整体检查(如果找到)后给出错误,该程序将程序转换为字节代码,然后程序需要一个解释器,会逐行检查程序并将其直接更改为机器代码或目标代码,并且由于某些安全原因,默认情况下每个操作系统默认都没有Java解释器,因此您需要不惜一切代价让jvm在该不同的OS平台上运行它如您在这里所说的独立性意味着该程序可以在任何操作系统上运行,例如unix,mac,linux,windows等,但这并不意味着每个操作系统都可以在没有jvm的情况下运行代码。和实例如果我通过更改PC的配置来进行升级,那么您可以拥有一个甚至可以打开字节码的类加载器,那么您还可以执行Java字节码,小程序等。-by nimish :)祝您好运


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一起使用}

这是怎么回事?

回答:ByteCode由于JVM与OS同步,因此JVM具有根据底层OS进行读取和响应的能力。

因此,我们发现,我们需要具有与平台同步的JVM。

但是最主要的是程序员不必了解平台的特定知识,也不必在意某个特定平台的情况下对其应用程序进行编程。

Java编写程序的这种灵活性-ByteCode可以在任何计算机上编译并运行(是的,需要具有平台依赖的JVM才能执行),这使得Java平台独立。


-1

当我们编译Java文件时,将生成该程序的.class文件,该.class文件包含字节码。该字节码与平台无关,字节码可以在使用Java虚拟机的任何操作系统上运行。平台独立性不仅与操作系统有关,还与硬件有关。当您在32位的16位计算机上运行Java应用程序时,不必担心会根据目标系统转换数据类型。您可以在任何体系结构上运行您的应用程序,并且每种应用程序都将获得相同的结果。


-3

编辑:不太。请参阅下面的评论。

Java不能直接在任何东西上运行。它需要由JVM转换为字节码。

因为JVM适用于所有主要平台,所以这使得Java平台无关的JVM。


1
JVM解释或JIT字节码。它不能编译。
马修·弗拉申

是。“对于JVM”更为准确。
多基因

1
jopdesign.com〜 可能会再试一次。这些家伙说它可以直接在硬件上运行。
jcolebrand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.