【问题标题】:Does JVM generate bytecode or run bytecode?JVM 是生成字节码还是运行字节码?
【发布时间】:2015-08-14 13:16:34
【问题描述】:

我在这里有点困惑,JVM 是代表字节码(生成它)还是只是将编译后的 .class 文件(字节码)加载到内存中?!还是 JVM 只是以独立于平台的方式运行字节码的规范?!非常感谢。

【问题讨论】:

  • JDK 使用编译器(javac)生成字节码,JVM 运行它。

标签: java compiler-construction jvm javac bytecode


【解决方案1】:

Java 编译器 (javac) 将人类可读的代码转换为字节码,然后在 JVM 中运行。

来自oracle docs

必须将程序转换为 Java VM 可以理解的形式 任何具有 Java VM 的计算机都可以解释和运行该程序。 编译 Java 程序意味着将程序员可读的文本放入 您的程序文件(也称为源代码)并将其转换为 字节码,它们是 Java 平台无关的指令 虚拟机。

【讨论】:

    【解决方案2】:
    1. JVM = JIT 编译器 + Java 解释器 + 垃圾收集器
    2. JRE = JVM + 库类
    3. JDK = JRE + 开发工具

    Sun JVM 是用 C 编写的,Oracle JVM 是用 C++ 编写的

    Java 编译器 javac 将源代码转换为字节码。 JVM 内部的 JIT Compiler 和 Java Interpreter 将字节码转换为相应的机器码。

    在 java 中,只有源代码(.java 文件)和字节码(.class 文件)可用。而且我们无法保存机器代码(.exe 文件),因为 .exe 文件只能在运行时形成,并在程序完全执行后立即从 RAM 中消失。

    在我们的系统中,javac.exe(用于编译java源代码,例如:javac HelloWorld.java)和java.exe(用于通过JVM执行java字节码,例如:java HelloWorld)都被调用,它们在.仅 exe 格式(javac.exe 和 java.exe)。 所以 Java 编译器 javac 和 JVM 不是用 Java 编写的。如果它们是用 Java 编写的,那么它们可能有 javac.class 和 java.class 格式。

    javac 属于 JDK 而不是 JVM。请记住,JVM 仅在运行时工作,即在源代码编译为字节码之后..但在此之前 javac 将源代码编译为字节码。 JVM通过JIT Compiler和Java Interpreter将字节码转换成对应的机器码。

    对于不同的操作系统,Oracle 公司提供不同的 JDK 和 JRE 软件;所以JVM(JRE下)和javac Compiler(JDK下)都是Platform Dependent的。所以确认javac Compiler和JVM不是用Java写的。因为Java语言总是平台无关的。

    【讨论】:

    • 我认为这个答案是对问题的确切回答
    【解决方案3】:

    当您说javac file 时,Java 编译器(称为 javac)会将您的代码转换为中间形式(字节码)。它不会直接将其转换为特定于平台的机器语言,因此您可以将类文件(字节码)提供给任何平台上的任何人。这就是“一次编写,随处运行”的工作原理。它不是编译为特定于平台的机器语言,而是编译为通用字节码。

    当您说java file 时,JVM 将获取字节码并将其“动态”(在运行时)分块转换为本地机器语言并执行它们。它使用 JIT 编译器执行此操作(这可能会造成混淆,因为这与 javac 不同)。顺便说一下,JDK 和 javac 是不一样的。 JDK 是一个 SDK(软件开发工具包),包含 Java 中的所有内容,包括 JVM 和 javac。

    【讨论】:

      【解决方案4】:

      JVM 运行字节码,Java compiler 生成它。

      但是,应用程序可以在运行时generate the bytecode,但生成的字节码会再次由 JVM 执行。

      【讨论】:

        【解决方案5】:

        JVM,根据平台,将字节码转换为 m/c 码。 更准确地说,JVM 内部的 JIT(即时)编译器 可以做到这一点。 字节码由 javac.exe 生成。 而 java.exe 在 jvm.dll(在 windows 中)的帮助下将此字节码转换为 m/c 码。

        【讨论】:

        • 次要的 nitpick:JIT 编译器通常生成机器代码,而不是汇编代码。汇编代码是(非常接近)机器代码的文本表示。
        【解决方案6】:

        JDK(javac) 生成字节码(.class 文件)。现在这个字节码可以通过该平台的JVM在任何平台上运行。

        【讨论】:

          【解决方案7】:

          简而言之Java 虚拟机运行/解释/翻译字节码为本地机器码。它不会生成字节码。我们可以将 JVM 视为解释器。

          以下内容将有助于理解以上内容,

          字节码,也称为可移植代码或 p 码,是一种指令集形式,旨在由软件解释器高效执行。它介于人类可读的源代码和机器可读的机器代码之间。字节码程序可以通过解析和直接执行指令来执行,一次一个。这种字节码解释器非常便携。一些称为动态翻译器或即时 (JIT) 编译器的系统在运行时根据需要将字节码翻译成机器码。这使得虚拟机特定于硬件,但不会失去字节码的可移植性。参考this

          编译器是将用一种编程语言(源语言)编写的计算机代码转换成另一种编程语言(目标语言)的计算机软件。 Java 编译器是编程语言 Java 的编译器。 Java 编译器输出的最常见形式是包含平台无关 Java 字节码的 Java 类文件

          对于 Java,它有一个名为 Javac 的专用编译器。 Javac 将您的 Java 代码编译成字节码。然后我们就有了使用该字节码的JVM

          【讨论】:

            【解决方案8】:

            enter image description here现在有一个内置工具,称为 Java Visual VM(JDK 版本 6 之后,更新 7),您可以在 bin 中找到它,该目录是 javac.exe 所在的目录。只需打开这个监控使用 JVM(分析器)的进程的工具。如果您在 Visual VM 打开时执行它,它将显示 javac、eclipse 等作为在 JVM 上运行的 Java 进程。

            【讨论】:

              【解决方案9】:

              Jdk 为带有 .java 扩展名的给定文件生成字节码。 JVM将字节码转换成机器语言,然后执行。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-01-15
                • 1970-01-01
                • 2014-03-05
                • 2012-12-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多