当Java平台需要JVM运行时,它是如何独立的?
我刚开始学习Java,我对平台独立性这个话题感到困惑。
“独立”是否意味着Java代码应该在任何机器上运行而不需要安装特殊软件? 然而,JVM需要存在于机器中。
例如,我们需要使用Turbo C编译器来编译C / C ++源代码然后执行它。 机器必须有C编译器。
当Java被描述为“平台无关”时,有人可以说是什么意思吗?
23个解决方案
101 votes
通常,编译的代码是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)。
Edwin Buck answered 2019-05-16T00:45:26Z
53 votes
Technical Article on How java is platform indepedent?
在进入细节之前,首先你必须了解平台的意思是什么?平台由计算机硬件组成(主要是微处理器的架构)和OS。平台=硬件+操作系统
任何与平台无关的东西都可以在任何操作系统和硬件上运行。
Java独立于平台,因此java可以在任何操作系统和硬件上运行。现在的问题是它是如何独立于平台的?
这是因为Byte Code的魔力是OS独立的。当java编译器编译任何代码时,它会生成字节代码而不是机器本机代码(与C编译器不同)。 现在这个字节代码需要在机器上执行解释器。 这个解释器是JVM。 所以JVM读取那个字节代码(即机器独立)amd执行它。不同的JVM是针对不同的操作系统而设计的,字节码可以在不同的操作系统上运行。
在C或C ++(不是平台独立的语言)的情况下,编译器生成操作系统依赖的.exe文件,所以当我们在另一个操作系统上运行此.exe文件,它将无法运行,因为此文件是操作系统依赖,因此与另一个操作系统不兼容。
最后,一个中间OS独立的字节代码使java平台独立。
Jatin Khurana answered 2019-05-16T00:46:27Z
24 votes
这意味着Java程序员(理论上)不需要了解机器或操作系统的详细信息。 这些细节确实存在,JVM和类库处理它们。 此外,与C形成鲜明对比的是,Java二进制文件(字节码)通常可以移动到完全不同的系统而无需修改或重新编译。
Matthew Flaschen answered 2019-05-16T00:46:53Z
8 votes
不,这是相反的方式。 这是因为您使用Java程序独立的虚拟机。
虚拟机不是独立的,您必须安装专门为您的系统类型制作的虚拟机。 虚拟机在操作系统之上创建独立平台。
Guffa answered 2019-05-16T00:47:25Z
7 votes
JVM是一个“模拟机器”,可以安装在不同的系统上。 通过这种方式,相同的Java代码可以在不同的系统上运行,因为它依赖于JVM,而不依赖于操作系统本身。
也就是说,这允许程序员与虚拟系统(JVM)通信并利用其功能,而不是特定的机器和OS功能。由于Java仅依赖于JVM,因此它与平台无关(如果平台安装了JVM)。
简而言之,Java本身并不是平台独立的,它需要为应该运行的所有系统安装JVM。 但是,它将在安装了JVM的所有系统上运行。
Lars Andren answered 2019-05-16T00:48:05Z
4 votes
Java与平台无关,因为它具有JVM(Java虚拟机)。 让我们用现实生活中的例子来说明它。 我们假设您的家人可以自由。 但为什么?
因为你很了解他们,他们也了解你。 但是,你对我的家人没有自由。 因为你不认识他们,他们也不认识你。 但是,如果我是你的朋友,当我可以把你介绍给我的家人时,你就可以自由地与他们交谈。
以类似的方式,如果你是一个代码,我是一个JVM。 此外,您的家庭是Windows平台,我的是Linux平台。 如果您是C语言或其他依赖于平台的语言,您只知道您的家庭成员,反之亦然。 这就是为什么只有你编写的平台知道Code并且会支持它。 但是,如果你是一个JAVA代码,当你来到我的家庭时。 Linux平台,如果你找到我,JVM,那么我可以向你介绍我的家庭,Linux平台,你将能够与它进行交互。
对于依赖于平台的语言,没有任何像JVM这样的朋友可以将自己介绍给任何平台系列。 这就是Java与平台无关的方式。:)
Tazwar Utshas answered 2019-05-16T00:48:52Z
3 votes
JVM从具体平台中抽象出来。 您的程序仅依赖于JVM,并且由于JVM可用于Windows和Linux等不同平台,因此您的程序与平台无关(但是jvm依赖)。
deamon answered 2019-05-16T00:49:16Z
3 votes
在c / c ++中,使用编译器编译后的源代码(c程序文件)直接转换为本机机器代码(对于编译代码的特定机器可以理解)。 因此,c / c ++的编译代码无法在不同的OS上运行。
但是在Java的情况下:java(.java)的源文件将使用JAVAC编译器(存在于JDK中)进行编译,该编译器提供Byte代码(.class文件),这对于安装在任何OS(物理系统)上的任何JVM都是可理解的。。
在这里,我们需要为我们想要运行代码的不同操作系统提供不同的JVM(与平台相关),但.class文件(编译代码/中间代码)保持不变,因为任何安装的JVM都可以理解 任何操作系统。
在c / c ++中:只有源代码与机器无关。在Java中:源代码和编译代码都是独立于平台的。
这使得Java平台(机器)独立。
PRATHIKSHA JAIN answered 2019-05-16T00:50:10Z
3 votes
java不是平台独立,本身就是一个平台,基于java平台运行的平台,但java平台本身依赖于平台
user3647490 answered 2019-05-16T00:50:35Z
2 votes
1:jvm(即java虚拟机)是一个程序集合,其中包含许多文件,这些文件提供文件夹上存在的各种功能(即中等级格式的程序集合),如packages.jvm所示,有助于不在o/s上重载,它有助于执行 只有.class文件或java应用程序只能单独使用。它有助于在java编译器补充之后使其等级中等级格式,然后它提供字节代码(.class文件)reprsentation,这不是特定于o/s和processor。
2:jvm使字节代码为.exe文件,供处理器理解,并在收到frm字节码后为每个函数提供内存分配。
3:在控制完成执行后,jvm还会从ram中释放内存分配。
ranjan answered 2019-05-16T00:51:18Z
2 votes
JVM依赖于os。对于每个os JVM都不同。
所有JVM的“.class”都是相同的。所以,每个JVM都能理解“.class”文件数据。
Windows依赖JVM为Windows提供Windows依赖指令linux依赖JVM给linux提供linux依赖指令。
就像其他操作系统一样。所以,java可以在任何操作系统上运行。
这就是为什么java是独立的。
time pass answered 2019-05-16T00:52:13Z
1 votes
Java不是独立于平台的,因为它在JVM上运行。 话虽如此,通过针对在大多数常见操作系统平台(以及一些嵌入式设备)上具体实现的单个抽象机器进行编程,您可以获得平台独立性。
一个相关的想法是许多操作系统中存在的硬件抽象层,它允许相同的OS在不同的硬件上运行。
在原始问题中,Turbo C类似于javac程序,JVM是OS / HAL。
John Percival Hackworth answered 2019-05-16T00:52:55Z
1 votes
不独立意味着Java代码应该能够在任何机器上运行,并且不需要安装特殊软件(在这种情况下JVM必须存在于机器中)?
使用Java,您可以在Windows上编译源代码,并且可以在运行JVM的任何平台上执行(解释)编译的代码(准确的字节码)。 所以是的,你需要一个JVM,但JVM可以运行任何已编译的代码,编译的代码是独立于平台的。
换句话说,您既具有源代码的可移植性,又具有已编译代码的可移植性。
例如,我们需要使用Turbo C Compiler来编译C / C ++源代码然后执行它。机器必须有C编译器。
机器不必具有C编译器,机器必须使用特定于平台的二进制文件。 使用C或C ++,编译的代码特定于每个体系结构,它与平台无关。
换句话说,使用C / C ++,您可以获得源代码(具有某些规则)的可移植性,但不能编译已编译代码的可移植性:您需要将每个体系结构重新编译为特定于平台的二进制文件。
Pascal Thivent answered 2019-05-16T00:53:58Z
1 votes
JVM将取决于平台。
但无论它产生什么,都将与平台无关。 [我们称之为字节码或者只是你可以说......类文件]。 为什么Java被称为独立于平台。
您可以在Mac上以及在Windows上运行相同的类文件,但它需要JRE。
Nitz answered 2019-05-16T00:54:39Z
1 votes
简单来说:
Java编程语言与平台无关。
JVM依赖于平台
Mohan answered 2019-05-16T00:55:15Z
0 votes
字节码不是平台独立的,而是它的JVM使字节码独立。 字节码不是匹配代码。 字节码是紧凑的数字代码,常量和引用(通常是数字地址),它们编码程序对象的类型,范围和嵌套深度等内容的解析和语义分析结果。 因此,它们比直接解释源代码具有更好的性能。 字节码需要在执行之前解释,这总是由JVM解释器完成。
ScoRpion answered 2019-05-16T00:55:42Z
0 votes
关于JVM和JIT编译的讨论只是旁注。这与C#和CLR的原理相同,在某种程度上也在Python中,当有人说代码“直接在硬件上运行”时,实际上已经编译的指令将能够利用优化 在机器/ cpu上运行它。 因此,即使模块的初始编译速度相当慢,下次运行此模块时,正在执行的代码也会以本机速度运行,因此可以直接在硬件上运行。
answered 2019-05-16T00:56:10Z
0 votes
Java在java开发人员方面是独立于平台的,但对于需要具有平台相关JVM来运行Java代码的最终用户而言,情况并非如此。 基本上,当编译java代码时,生成通常与平台无关的字节代码。 因此,开发人员必须为整个平台系列编写单个代码。 但是,对于需要安装JVM以运行此编译代码的最终用户来说,这种好处令人头疼。 这个JVM对于每个平台都不同。 因此,依赖性仅对最终用户生效。
user1641361 answered 2019-05-16T00:56:37Z
0 votes
Javac - 将源代码转换为字节代码的编译器。JVM-解释器,将字节代码转换为机器语言代码。
我们知道java既是编译**又是 **基于口译员的语言。 一旦编译了java代码也称为源代码,它就会被转换为本地代码,称为BYTE CODE,它是便携式的。 可以在所有操作系统上轻松执行。 生成的字节代码基本上以十六进制格式表示。 在Solaris工作站或Macintosh,Windows或Linux的每个平台上,此格式都是相同的。 在编译之后,解释器读取生成的字节代码& 根据主机进行翻译。。 字节代码由Java虚拟机解释,可与我们安装的所有操作系统一起使用。 因此,要将Java程序移植到新平台,只需移植解释器和一些库例程即可。
希望能帮助到你!!!
answered 2019-05-16T00:57:15Z
0 votes
当我们编译C源数据时,它会生成当前操作系统可以理解的本机代码。当我们将此源代码移动到另一个操作系统时,操作系统无法理解它,因为本机代码意味着表示从O.S变为O.S.所以C或C ++是平台相关的。
现在在java的情况下,在编译之后我们得到字节代码而不是本机代码。 当我们运行字节码时,它在JVM的帮助下转换为本机代码,然后执行。
因此Java独立于平台,C或C ++不依赖于平台。
Monis Majeed answered 2019-05-16T00:57:56Z
0 votes
好的问题但是当源代码被编译器改成中间本地字节代码时,它通过在整个检查之后立即给出错误(如果找到)将程序转换为字节代码然后程序需要一个解释器将逐行检查程序并直接将其更改为机器代码或目标代码,并且由于某些安全原因,默认情况下每个操作系统都不能有java解释器,因此您需要不惜一切代价在不同的OS平台上运行jvm你在这里所说的独立性意味着程序可以在任何操作系统中运行,如unix,mac,linux,windows等,但这并不意味着每个操作系统都能够运行代码而没有jvm,这说明了规范,实现,和实例一样,如果我通过更改你的电脑的配置来推进,这样你就可以拥有一个甚至可以打开字节码的类加载器,那么你也可以执行java字节码,小程序等。-by nimish :)祝你好运
Nimish Maskara answered 2019-05-16T00:58:26Z
0 votes
{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能够读取ByteCode并根据底层操作系统响应响应当JVM与OS同步时。
所以我们发现,我们需要JVM与Sync with Platform。
但最重要的是程序员不必了解平台的具体知识,并编写应用程序,并牢记一个特定的平台。
这种Java编写程序的灵活性---编译到ByteCode并在任何机器上运行(是的,需要平台相关JVM来执行它)使Java平台独立。
RishiKesh Pathak answered 2019-05-16T00:59:44Z
-2 votes
编辑:不完全。 见下面的评论。
Java不会直接运行任何东西。 它需要由JVM转换为字节码。
因为所有主要平台都存在JVM,所以这使得Java平台独立于JVM。
Amy B answered 2019-05-16T01:00:25Z