Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java是在运行时解释的?_Java_Gcc_Compiler Construction_Jvm - Fatal编程技术网

Java是在运行时解释的?

Java是在运行时解释的?,java,gcc,compiler-construction,jvm,Java,Gcc,Compiler Construction,Jvm,Java编译器编译成二进制,比如gcc编译C代码?或者它只是编译成另一种“语言”,由另一种东西来解释? 我跑不了。我猜它一定是JVM,对吧 那么,Java实际上不是一种真正的编译语言,对吗 这只是为了澄清一个问题。Java介于编译语言和解释语言之间 当编译Java程序时,Java源代码被翻译成与平台无关的字节码。这个字节码既不是人类可读的(它与汇编程序非常相似),也不是大多数CPU可读的 当编译的程序运行时,Java虚拟机将解释该字节码,并将其转换为JVM运行平台的本机指令 就性能而言,与编译为

Java编译器编译成二进制,比如
gcc
编译C代码?或者它只是编译成另一种“语言”,由另一种东西来解释? 我跑不了。我猜它一定是JVM,对吧

那么,Java实际上不是一种真正的编译语言,对吗


这只是为了澄清一个问题。

Java介于编译语言和解释语言之间

当编译Java程序时,Java源代码被翻译成与平台无关的字节码。这个字节码既不是人类可读的(它与汇编程序非常相似),也不是大多数CPU可读的

当编译的程序运行时,Java虚拟机将解释该字节码,并将其转换为JVM运行平台的本机指令

就性能而言,与编译为本机机器代码相比,这种方法既有缺点,也有优点

缺点是翻译成机器码需要时间。必须在第一次执行应用程序时(导致启动时间变慢)或在执行应用程序时(导致运行时性能降低)执行此操作

但另一方面,运行时编译允许为软件实际运行的平台优化生成的机器代码,而预编译软件通常针对特定CPU进行优化。运行时编译还允许实时优化。虽然普通编译器需要猜测程序的哪些部分执行得最频繁,但JIT优化器可以在程序实际执行时观察程序,并使用此信息在程序运行时更改程序以提高效率

Java实际上不是一种真正的编译语言,对吗

Java是编译的。但不是机器代码,而是编译成字节码。JVM可以解释的。或者,它可以反过来将其进一步编译为机器代码。这实际上是通过所谓的Hotspot即时编译器实现的(至少是部分代码),它是标准JVM的一部分


它与Perl或Python等“真正的”解释语言(即使这些语言也“编译”为内部表示)的区别在于,您提供的代码不再需要编译器运行,只需要运行时。另一方面,Perl和Python需要能够在运行时“评估”新程序。

Java是两者的混合体。 Java代码被编译成Java字节码(这是一种与体系结构无关的中间语言)。 它将在运行时编译成机器代码(就像编译C时生成的代码一样)。据我所知,Java运行时也会在运行时进行一些优化

Java最初是一种解释语言,现在仍然有JVM使用解释器执行字节码的情况


查看此fopr更多信息:

我希望它能帮助您

java commpiler的工作方式

或者它只是编译成另一种类型的“语言”,这将是 被另一件事解释


所有编译语言都是这种情况-它们被编译成另一种语言,这种语言将被某种东西解释-比如真实机器的处理器或模拟虚拟机的程序。

Java在某种意义上既是解释的,也是编译的,给出了如何将其编译成独立于平台的JAR文件,以便在主机JVM上执行。编译器将其转换为Java字节码,这是一组与平台无关的指令,类似(但不是)主机CPU能够直接运行的机器语言

当Java程序在JVM上执行时,第一次编译的字节码在第一次编译时由解释器解释,然后将其输入到一个称为C1的分析实时编译器中,该编译器实际上将代码编译为机器特定语言,当JVM感觉它是这样的时候,C1编译和分析的代码被反编译回Java字节码,并输入到一个非常积极的优化JIT编译器C2中。这是Java程序如何运行的一般要点,大多数情况下,解释器几乎不用于执行代码,因为运行时中的C1和C2编译并执行大部分代码,以提供最佳性能,因此,从技术上讲,您可以说Java是不被解释的——因为您编写的代码几乎都不会在解释程序中结束


值得注意的一件有趣的事情是,Java的解释器不是标准解释器,而是一种称为模板解释器的特殊解释器。这对我来说太复杂了,无法在一篇小帖子中描述,但本质上这意味着Java运行时中的“解释器”实际上是一个伪装成解释器的编译器。

是和否:字节码是一种中间语言非常确定这个问题已经被回答了好几次,在过去的一个月内一次,但我找不到参考。See的可能重复:更准确的说法是Java既是一种编译语言又是一种解释语言。这个回答听起来像“是的,是解释的”(翻译成本机指令=解释)是所有编译成相同字节码然后解释的点网络语言。。。通过CLR或字节码是特定于语言的。。。C#和VB.net有什么不同吗?(我基本上是一个从未在.net上工作过的Java开发人员,但出于好奇,我想知道)@AurA CLR代表公共语言运行时。所有.NET语言都编译为相同的字节码规范。对于CLR来说,使用什么语言来创建字节码并不重要。顺便说一下,除了Java之外,还有其他语言可以编译成Java字节码。例如Scala,如果说CPU“解释”实际的机器代码,它只是运行它,这有点误导。该术语通常用于描述具有