当需要JVM运行时,如何与Java平台无关?

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

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

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

有人可以请说什么时,Java被称为“平台无关”?

通常情况下,编译的代码是CPU“执行”程序的精确指令集。 在Java中,编译后的代码是一组精确的“虚拟CPU”指令,每个物理机器上都需要相同的指令。

所以,从某种意义上讲,Java语言的devise者决定语言和编译代码将独立于平台,但由于代码最终必须在物理平台上运行,他们select将所有依赖于平台的代码JVM。

这个对于JVM的要求与你的Turbo C例子相反。 使用Turbo C,编译器将生成与平台相关的代码,并且不需要JVM工作,因为编译的Turbo C程序可以由CPU直接执行。

使用Java,CPU执行与平台相关的JVM。 这个正在运行的JVM然后执行独立于平台的Java字节码,只要你有一个JVM可供它执行。 您可能会说,编写Java代码,您不会编写要在物理机器上执行的代码,而是编写要在Java虚拟机上执行的代码。

所有这些Java字节码在所有Java虚拟机上都能正常工作的唯一方法就是为Java虚拟机的工作方式编写了相当严格的标准。 这意味着无论您使用什么物理平台,Java字节码与JVM接口的部分都保证只能以一种方式工作。 由于所有JVM的工作原理完全相同,因此相同的代码在各处都是一样的,不需要重新编译。 如果你不能通过testing,以确保它是相同的,你不能把你的虚拟机称为“Java虚拟机”。

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

  Technical Article on How java is platform indepedent? 

在深入细节之前,首先你要了解平台的意义是什么? 平台由计算机硬件(主要是微处理器的体系结构)和操作系统组成。 平台=硬件+操作系统

任何独立于平台的东西都可以在任何操作系统和硬件上运行。

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

这是因为操作系统独立的字节代码的魔力。 当java编译器编译任何代码时,它会生成字节码而不是机器本地代码(不像C编译器)。现在这个字节码需要一个解释器在一台机器上执行。这个解释器是JVM。所以JVM读取这个字节码机器独立)和执行它。 不同的JVM是针对不同的操作系统devise的,字节码可以在不同的操作系统上运行。

如果是C或C ++(不是独立于平台的语言)编译器生成操作系统依赖的.exe文件,所以当我们在另一个操作系统上运行这个.exe文件时,它将不会运行,因为这个文件是操作系统dependents另一个操作系统。

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

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

不,这是相反的。 这是因为你使用了Java程序得到独立的虚拟机。

虚拟机不是独立的,你必须安装一个专门用于你的系统types的虚拟机。 虚拟机在操作系统之上创build一个独立的平台。

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

也就是说,这允许程序员与虚拟系统(JVM)进行通信并利用其function,而不是特定的机器和OSfunction。 由于Java只依赖于JVM,因此它是独立于平台的(如果平台安装了JVM)。

所以简而言之,Java不是平台独立的,它需要为所有运行的系统安装JVM。 但是,它将在所有安装了JVM的系统上运行。

JVM从具体平台抽象出来。 你的程序只依赖于JVM,由于JVM可用于Windows和Linux等不同的平台,你的程序是独立于平台的(但依赖于jvm)。

在c / c ++中,使用编译器编译后的源代码(c程序文件)直接转换为本地机器代码(这对于编译代码的特定机器是可以理解的)。 因此,c / c ++的编译代码无法在不同的操作系统上运行。

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

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

在c / c ++中:只有源代码是独立于机器的。 在Java中:源代码和编译代码都是独立于平台的。

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

java不是平台独立的,本身就是一个平台,基于那个平台的java应用程序运行,但是java平台本身是平台依赖的

1:jvm (即java虚拟机)是一个包含大量文件的程序集合,这些文件提供了作为被调用packages提供文件夹中的各种function(即中级格式的程序集合)。 jvm有助于不会在o/s上重载,只有它自己才有助于仅执行.class文件或java应用程序。它有助于在java编译器编译之后使其中等级格式化,然后提供字节码( .class文件)不是特定于o/sprocessor reprsentation。
2:jvm将字节码转换为.exe文件,以便处理器在收到frm字节码后可以理解和分配每个函数的内存分配。
3:jvm在控制结束执行后也释放内存。

Java是平台无关的,因为它具有JVM(Java虚拟机)。 让我们用一个真实的例子来说明它。 假设你对你的家庭成员是免费的。 但为什么?

因为你很了解他们,他们也了解你。 但是,你对我的家庭成员是不自由的。 因为你不认识他们,他们也不认识你。 但是,如果我是你的朋友,当我可以向你介绍我的家人时,你就可以自由地与他们交谈。

以类似的方式,如果你是一个代码,我是一个JVM。 另外,你的家庭是Windows平台,我的是Linux平台。 如果你是一个C或其他平台相关的语言,你只知道你的家庭成员,反之亦然。 这就是为什么只有你写的平台知道Code并且会支持它。 但是,如果你是一个JAVA代码,当你来到我的家庭即, Linux平台,如果你find我,JVM,那么我可以把你介绍给我的家庭,Linux平台,你将能够与之互动。

对于依赖于平台的语言,没有像JVM这样的朋友可以向他们介绍自己的平台系列。 这就是Java如何独立于平台。 🙂

Java不是平台独立的,因为它运行在JVM上。 话虽如此,通过针对在大多数常见OS平台(以及某些embedded式设备)上具有具体实现的单个抽象机器进行编程,您可以获得平台独立性。

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

在你原来的问题,Turbo C与javac程序类似,JVM是OS / HAL。

不独立意味着Java代码应该能够在任何机器上运行,并且不需要安装特殊的软件(这种情况下,JVM必须存在于机器中)?

使用Java,您可以在Windows上编译源代码,并且可以在运行JVM的任何平台上执行(解释) 编译后的代码 (准确地说是字节代码 )。 所以是的,你需要一个JVM,但是JVM可以运行任何编译的代码,编译后的代码是独立于平台的

换句话说,你既有源代码的可移植性,也有编译代码的可移植性。

就像我们需要Turbo C编译器来编译C / C ++源代码然后执行它。机器必须有C编译器。

机器不必具有C编译器,机器必须使用特定于平台的二进制文件。 使用C或C ++, 编译的代码是特定于每个体系结构的,它是独立于平台的

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

JVM将取决于平台。
但无论它会产生什么,都将是独立于平台的。 [我们称之为字节码,或者简单地说你可以说…类文件]。 为什么Java被称为平台独立。
你可以在Mac上运行相同的类文件,也可以在Windows上运行,但是它需要JRE。

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

“.class”对于所有的JVM都是一样的。 所以,每个JVM都明白“.class”文件的数据。

依赖于窗口的JVM给予依赖于Windows的指令,使得依赖于Windows的Linux依赖于Linux的Linux依赖指令。

这就像其他操作系统一样。 所以,Java可以在任何操作系统上运行。

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

字节码不是独立于平台的,而是其独立于字节码的JVM。 字节码不是匹配的代码。 字节码是紧凑的数字代码,常量和引用(通常是数字地址),它们对程序对象的types,范围和嵌套深度等内容进行parsing和语义分析。 因此,它们比源代码的直接解释具有更好的性能。 字节码需要在执行之前被解释,而JVM解释器总是这样做。

只是关于JVM和JIT编译的讨论的一个附注。 这与C#和CLR的原理是一样的,而且在某种程度上用Python来说,当有人说代码直接在硬件上运行的时候,这个代码实际上是真的,因为已经编译好的指令将能够利用优化在它正在运行的机器/ CPU上。 所以,即使模块的初始编译相当慢,下次这个模块运行时,正在执行的代码也会以本地速度运行,因此可以直接在硬件上运行。

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

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

正如我们所知,java是编译**解释器的基础语言。 一旦Java代码也被称为源代码被编译,它就被转换为本地代码,被称为BYTE CODE,它是可移植的,并且可以在所有操作系统上轻松执行。 生成的字节代码基本上以hex格式表示。 在Solaris工作站或Macintosh,Windows或Linux的每个平台上,这种格式都是一样的。 编译之后,解释器读取生成的字节码并根据主机进行翻译。 。 字节代码由Java虚拟机解释,可以在我们安装的所有操作系统上使用。 所以为了将Java程序移植到一个新的平台,所有需要的是移植解释器和一些库例程。

希望它有帮助!

当我们编译C源数据时,它会生成当前操作系统可以理解的本地代码。 当我们把这个源代码移动到另一个操作系统时,由于本地代码,操作系统无法理解,这意味着代表从OS到OS的变化。因此,C或C ++是平台相关的。

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

所以Java是平台独立的,C或C ++不是平台独立的。

这是一个很好的问题,但是当源代码被一个编译器改变成中间本地字节码时,编译器会通过在整个检查之后立即给出错误(如果find)将程序转换成字节码,然后程序需要一个解释器将逐行检查程序并直接将其更改为机器代码或目标代码,并且由于某些安全原因,每个操作系统默认情况下都不能有Java解释器,所以您需要有不计任何代价的jvm才能在该不同的OS平台上运行它独立性,就像你在这里所说的那样,意味着程序可以运行在任何操作系统上,比如unix,mac,linux,windows等等,但是这并不意味着每一个操作系统都可以运行代码而不需要jvm,和实例,如果我通过改变你的电脑的configuration,以便您可以有一个类加载器,甚至可以打开字节码,然后还可以执行Java字节码,小程序等,通过更改 – 通过nimish :)最好的 运气

{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}

这是怎么发生的?

答案:JVM有能力读取ByteCode和响应根据底层操作系统因为JVM与OS同步。

所以我们发现,我们需要与平台同步的JVM。

但最主要的是程序员不必知道平台的具体知识,并为他的应用程序编写一个特定的平台。

Java编写程序的灵活性 – 编译为ByteCode并运行在任何机器上(是需要平台独立的JVM执行它)使得Java平台无关。

编辑:不完全。 见下面的评论。

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

由于所有主要平台都存在JVM,因此通过JVM实现了与Java平台无关的function。