既然Java(语言)是跨平台的,为什么JVM不是跨平台的呢?

16

我很好奇知道当Java变成平台无关的时候,JVM为什么还是平台相关的。


9
你实际上在问什么? - nos
6
个人认为这个问题不应该被关闭(投票重新开放)。这个问题可能表述不够清晰,但其中包含了一个“真正”的问题(尽管对于某些人来说,答案乍一看似乎很明显)。 - ChristopheD
@ChristopheD - 你能否请澄清一下问题? - KatieK
15个回答

21

JVM执行Java代码,但是它是用诸如C/C++/ASM等平台特定语言编写的。JVM并非用Java编写,因此不能做到跨平台。


2
实际上,有几个JVM是用Java编写的:Maxine和Jikes只是其中两个例子。 - Jörg W Mittag
2
因為需要一個小的平台相關 C 載入程序來啟動引導程序,所以不管有誰說什麼,JVM 並不是100%的Java :) - Chris Kannon
1
你说得对。虚拟机通常使用C的方式更像是数据描述语言而不是编程语言。它们主要依赖于C编译器来布置数据结构,使其符合操作系统的期望,而不是依靠C的语义。你可能可以编写一个Java程序来生成正确的内存布局,但为什么要这样做呢?平台的C编译器已经包含了所有复杂的布局逻辑。 - Jörg W Mittag
1
Maxine在特定的三个地方使用C语言:第一个是一个小型引导程序,它仅执行mmap VM映像,将mmap地址写入映像中的特定位置,然后跳转到映像内的预定义位置。第二个地方是调试器:Maxine使用平台本地的调试工具,之所以使用C语言编写是因为它们从GDB中提取出来的,因为平台文档太糟糕了,无法从头开始编写调试器。第三个地方是非常低级别的线程代码:Maxine使用本地线程。 - Jörg W Mittag
2
实际上,我忘了一个:JNI代码也包含一些C代码,因为它主要涉及与C数据结构的互操作,因此使用C作为数据定义语言是有意义的。但是,请注意列表中没有的东西:垃圾收集器、内存分配器、本地编译器、本地汇编器。所有这些都是用Java编写的。 - Jörg W Mittag

20

我发现这是一个非常好的问题答案:

JVM将字节码翻译成机器语言

每个Java程序都被编译成一种称为Java字节码的中间语言。JVM用于将字节码翻译成特定计算机的机器语言,并实际执行相应的机器语言指令。JVM和字节码结合在一起,使Java成为“可移植”语言。

机器语言依赖于操作系统

结合前面提到的信息,可以更容易地得出答案。由于JVM必须将字节码翻译成机器语言,并且由于机器语言取决于使用的操作系统,因此很明显JVM是平台(操作系统)相关的。通过尝试下载JVM可以验证这一点 - 您将会看到针对不同操作系统的JVM列表,并且您需要选择针对正在运行的操作系统的JVM。

引用自JVM是否平台相关?


18

除非你有一种可以直接执行Java字节码的CPU(确实有这样的东西),否则你需要能够与操作系统进行交互(例如读取文件,连接到网络,向屏幕显示等)。

你可以使用其他语言(如JavaJavaScript)编写JVM,但最终仍需要有某些东西能够与底层操作系统进行交互。


10

JVM 必须是平台相关的,以便让您的 Java 在特定平台上运行。Windows 的 JVM 会将您的 Java 翻译成不同于 OS X 的系统调用。


5
由于需要某种方法将独立于平台的应用程序的Java调用转换为与底层操作系统兼容的调用。

4
不,JVM并不是平台无关的。实际上,它们是由供应商提供的特定于平台的运行时环境。每个平台(Windows、UNIX、Mac等)都有自己的JVM来运行Java应用程序。虽然字节码支持连接到多个数据库...
可以将其类比为在MP3播放器、CD播放器和老式的盒式录音机(Boom Box)中播放音乐。输出始终相同,即音乐。但输入(媒体,例如MP3播放器的.mp3文件,CD播放器的CD和盒式录音机的盒式磁带)因系统而异[这里的系统将是各种操作系统,如Windows、UNIX、Mac等]。希望我能够解决您的问题。

1

JVM依赖于操作系统。为了使代码独立,需要有一些东西是依赖的,这就是JVM。在下载JDK时,它会询问您要为哪个操作系统下载。这清楚地说明JVM是平台相关的。


1

JVM不是平台无关的。

关键在于JVM依赖于操作系统-因此,如果您运行的是Mac OS X,则拥有的JVM与如果您运行Windows或其他操作系统时所拥有的JVM不同。这个事实可以通过尝试为特定机器下载JVM来验证-当尝试下载它时,您将会得到一个对应于不同操作系统的JVM列表,并且显然会选择针对您正在运行的操作系统定位的JVM。


0

简单来说 - * - 变成了 +。

我们都知道 Java 是跨平台的

但是我们编写代码的操作系统是平台相关的

而输出应该是跨平台的,因此我们使 jvm(介于 jre 中并安装在其中)与平台相关,以便输出独立。


有点像。这种语言是平台无关的,但它必须在该平台上运行。用于实现这一点的机制将取决于它所运行的平台。 - vonbrand

0
不,JVM是平台相关的。用Java编写的代码并不是平台相关的。如果你在Windows操作系统上编写Java代码,你可以在Linux或其他操作系统上运行该代码。但是Windows和Linux的JVM是不同的。JVM可以在JRE中找到,当你从Oracle下载JRE时,它会说JRE适用于Windows、Linux和其他操作系统。

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