JVM是否生成字节码或运行字节码?

Moh*_*eif 3 java compiler-construction jvm bytecode javac

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

app*_*exm 5

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

来自oracle文档:

程序必须转换为Java VM可以理解的形式,因此任何具有Java VM的计算机都可以解释并运行该程序.编译Java程序意味着在程序文件中使用程序员可读的文本(也称为源代码)并将其转换为字节码,字节码是Java VM的独立于平台的指令.


小智 5

  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编译器(JDK下)都是Platform Dependent。所以可以确定javac Compiler和JVM不是用Java编写的。因为Java语言总是Platform Independent。