当Java平台需要JVM运行时,它是如何独立的?

Ser*_*ity 76 java cross-platform

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

"独立"是否意味着Java代码应该在任何机器上运行而不需要安装特殊软件?然而,JVM需要存在于机器中.

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

当Java被描述为"平台无关"时,有人可以说是什么意思吗?

Edw*_*uck 106

通常,编译的代码是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).

  • 你需要编译java源代码,因此"javac filename.java"但是,你只需要一次,而不是在每台使用它的机器上(这与C和C++不同).如果更改CPU,32/64位系统,字节顺序等,代码仍会运行.这是因为输出"filename.class"包含字节代码,它是JVM的指令.由于所有JVM在功能上都是相同的,因此一旦编译了代码,您就可以在任何Java虚拟机上运行该字节码而无需源代码.尝试一下,它有效.此外,您做的一些评论会混淆编译和重新编译. (2认同)

Jat*_*ana 54

            Technical Article on How java is platform indepedent?
Run Code Online (Sandbox Code Playgroud)

在进入细节之前,首先你必须了解平台的意思是什么?平台由计算机硬件(主要是微处理器的架构)和OS组成.平台=硬件+操作系统

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

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

这是因为Byte Code的魔力是OS独立的.当java编译器编译任何代码时,它会生成字节代码而不是机器本机代码(与C编译器不同).现在这个字节代码需要一个解释器在一台机器上执行.这个解释器是JVM.因此JVM读取该字节代码(即机器独立)并执行它.不同的JVM是针对不同的操作系统而设计的,字节码可以在不同的操作系统上运行.

在C或C++(非平台独立的语言)的情况下,编译器生成操作系统依赖的.exe文件,因此当我们在另一个操作系统上运行此.exe文件时,它将无法运行,因为此文件是操作系统依赖的,因此与另一个操作系统.

最后,一个中间OS独立的字节代码使java平台独立.

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

Mat*_*hen 25

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

  • "... Java二进制文件(字节码)通常可以移动到完全不同的体系结构而无需重新编译." 实际上,他们*总是*可以.只有将为较新JVM编译的代码移动到较旧的JVM时,才需要重新编译. (10认同)

Guf*_*ffa 8

不,这是相反的方式.这是因为您使用Java程序独立的虚拟机.

虚拟机不是独立的,您必须安装专门为您的系统类型制作的虚拟机.虚拟机在操作系统之上创建独立平台.


Lar*_*ren 7

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

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

简而言之,Java本身并不是平台独立的,它需要为应该运行的所有系统安装JVM.但是,它将在安装了JVM的所有系统上运行.


Taz*_*has 5

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

因为你很了解他们,他们也很了解你。但是,你对我的家人没有自由。因为你不认识他们,他们也不认识你。但是,如果我是你的朋友,什么时候我可以把你介绍给我的家人,那么你就可以和他们畅所欲言了。

同理,如果你是代码而我是JVM。还有,你家是windows平台,我家是Linux平台。如果您是 C 或其他依赖平台的语言,则您只认识您的家人,反之亦然。这就是为什么只有编写您的平台知道该代码并会支持它。但是如果你是一个JAVA代码并且当你来到我的家庭viz。Linux 平台,如果你在那里找到我,JVM,那么我可以向你介绍我的家人,Linux 平台,你将能够与它互动。

对于依赖平台的语言,没有像 JVM 这样的朋友可以向任何平台家族介绍自己。这就是 Java 与平台无关的方式。:)