我想知道Java是否已经组装好,在我的阅读中,我发现编译器创建了字节代码,然后在Java虚拟机上运行。 JVM是否解释字节代码并执行它?
这就是为什么我很困惑。今天在课堂上,教授说“编译器采用高级语言,创建汇编语言,然后汇编器采用汇编语言并创建可以运行的机器语言(二进制)”。那么如果Java编译为字节码,它怎么能运行呢?
答案 0 :(得分:9)
有一个标准的编译器设置,例如用于C语言,然后是Java,它有很大不同。
标准C编译器将(通过几个内部阶段)编译成“机器指令”,这些指令可由x86处理器或其他任何内容直接理解。
另一方面,Java编译器编译为有时称为“字节码”的东西。这些是机器指令,但对于虚构的机器,Java虚拟机。因此,JVM解释字节码就像“真正的”机器处理它的机器指令一样。 (这样做的主要优点是编译成字节码的程序将在任何 JVM上运行,无论是在x86系统,IBM RISC盒还是Android中的ARM处理器上 - 这么长时间因为有一个JVM代码将运行。)(历史上有许多类似于Java的“虚拟机”,UCSD Pascal“P-code”系统是比较成功的系统之一。)
但它变得更复杂 -
解释“字节码”相当慢且效率低,因此大多数Java实现都有某种方案将字节码转换为“真正的”机器指令。在某些情况下,这是在一个单独的编译步骤中静态完成的,但最常见的是使用“即时编译器”(JITC),它在应用程序运行时将小部分字节码转换为机器指令。这些变得非常复杂,使用复杂的方案来决定哪些代码段将从转换为硬件机器指令中获益最多。但是,在大多数情况下,它们都可以实现它们的魔力而无需了解正在发生的事情,也无需编译Java代码来定位特定类型的处理器。
答案 1 :(得分:3)
将字节码视为JVM的机器语言。 (编译器不必生成必须组装的汇编代码,但是用这种方式编写它们会更容易。)
答案 2 :(得分:1)
只是澄清说明: 在java中称为“字节码”的那个在你的原始描述中是“创建可以运行的机器语言(二进制)”
所以如何运行java字节码的答案是: 你构建一个可以处理java字节码的处理器,就像你想要执行普通的x86代码一样,你可以构建一个cpu来处理它。
Javas二进制机器语言与其他cpus(如x86或powerpc)的二进制指令格式没有什么不同。并且存在可以直接执行java字节码的cpus。 (那将是正常的Intel / Amd cpu)。
另一个例子:你如何在普通的intel cpu上运行powerpc代码?您将构建一个软件,它将在运行时将powerpc二进制代码转换为x86代码。 java的情况并没有那么不同。因此,要在x86 cpu上运行java代码,需要一个将java二进制代码(也就是字节码)转换为x86二进制代码的程序。这就是jvm *的作用。它通过一次解释一个java指令,或者一次翻译大量指令(Called jit)来实现这一点。 jvm处理转换的确切方式取决于您使用的jvm实现及其设置。(java jvms有多个独立的实现,它们以不同的方式实现它们的转换)。
但有一点让java有点不同。与其他二进制指令格式(如x86)不同,java更新的设计可直接在cpu上运行。其二进制格式的设计方式使其易于将其转换为“普通”cpus的二进制代码,如x86或powerpc。
* jvm确实处理了更多,然后只是将java二进制代码转换为处理器依赖代码。它还处理java程序的内存分配,并处理java程序和用户操作系统之间的通信。这样做是为了使java程序相对独立于用户操作系统和平台细节。
答案 3 :(得分:0)
简短说明:JVM将Java字节代码转换为特定于机器的代码。然后由机器执行生成的机器特定代码。
Java编译器将JAVA转换为ByteCode。 JVM在运行时将ByteCode转换为Assembly(机器特定代码)。机器执行装配。