Java 编译器编译为二进制,就像
gcc
编译 C 代码一样?或者它只是编译成另一种类型的“语言”,由另一种事物解释?
我无法运行它。我想,一定是JVM
吧?
那么,Java其实并不是真正的编译型语言,是解释型语言?
Java其实并不是真正的编译型语言,是解释型语言?
嗯...
Java is 已编译。但不是机器码,而是编译为字节码。 JVM 可以解释它。或者,它可以进一步将其编译为机器代码。这实际上是通过所谓的 Hotspot Just-In-Time 编译器发生的(至少对于部分代码而言),它是标准 JVM 的一部分。
它与 Perl 或 Python 等“真正的”解释语言(即使它们也“编译”为内部表示)的区别在于,您发布的代码不再需要编译器来运行,只需要运行时。另一方面,Perl 和 Python 需要能够在运行时“评估”新程序。
Java 是两者的混合体。 Java 代码被编译成 Java 字节码(这是一种中间语言并且与体系结构无关)。 它将在运行时编译成机器代码(就像编译 C 时生成的代码)。据我所知,Java运行时也在运行时做了一些优化。
Java 最初是一种解释性语言,并且仍然存在 JVM 使用解释器来执行字节码的情况。
请参阅此 fopr 更多信息:http://searchsoa.techtarget.com/definition/Java-virtual-machine
Java 是一种介于编译型语言和解释型语言之间的语言。
当编译Java程序时,Java源代码被翻译成与平台无关的字节码。该字节码既不是人类可读的(它与汇编程序非常相似),也不是大多数 CPU 可读的。
当编译后的程序运行时,该字节码由 Java 虚拟机解释并翻译成 JVM 运行平台的本机指令。
就性能而言,与编译为本机代码相比,此方法既有缺点也有优点。
缺点是转换为机器代码需要时间。必须在应用程序首次执行时(导致启动时间变慢)或在执行时执行(导致运行时性能降低)。
但另一方面,运行时编译允许针对软件实际运行的平台优化生成的机器代码,而预编译软件通常针对特定 CPU 进行优化。运行时编译还允许即时优化。虽然普通编译器需要猜测程序的哪些部分最常执行,但 JIT 优化器可以在程序实际执行时监视程序,并使用此信息来更改程序,使其在运行时更加高效。
希望对你有帮助
java编译器的工作方式
或者它只是编译成另一种类型的“语言” 被其他事物解释?
所有编译语言都是这种情况 - 它们被编译为另一种语言,该语言将被某些东西解释 - 例如真实机器的处理器或模拟虚拟机的程序。
Java 在某种意义上既是解释型的又是编译型的,因为它必须被编译成独立于平台的 JAR 文件才能在主机 JVM 上执行。编译器将其转换为 Java 字节码,这是一组独立于平台的指令,类似于(但不是)主机 CPU 能够直接运行的机器语言。
当 Java 程序在 JVM 上执行时,第一遍编译的字节码由解释器在第一遍解释,然后将其输入到分析即时编译器(简称为 C1)中,该编译器实际上编译了代码分解为机器特定语言,当 JVM 感觉需要时,由 C1 编译和分析的代码会被反编译回 Java 字节码,并输入到一个名为 C2 的极其积极的优化 JIT 编译器中。这是 Java 程序如何运行的一般要点,大多数时候解释器几乎不用来执行代码,因为运行时内的 C1 和 C2 编译并执行大部分代码以提供尽可能最佳的性能,因此从技术上讲,你可以说 Java 不是解释型的——因为你编写的代码几乎没有一个最终会在解释器中完成
值得注意的一件有趣的事情是,Java 的解释器不是标准的解释器,而是一种特殊的解释器,称为模板解释器。对我来说太复杂了,无法在一篇小文章中描述,但本质上这意味着 Java 运行时中的“解释器”实际上是一个冒充解释器的编译器。