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