Java是编译语言还是解释编程语言?

144 java compilation interpretation

在过去,我使用C++作为编程语言.我知道用C++编写的代码经过编译过程,直到它成为目标代码"机器代码".

我想知道Java在这方面是如何工作的.用户如何编写由计算机运行的Java代码?

Meh*_*ari 200

Java实现通常使用两步编译过程.Java编译器将Java源代码编译为字节码.字节码由Java虚拟机(JVM)执行.现代JVM使用称为即时(JIT)编译的技术将字节码编译为硬件CPU在运行时即时理解的本机指令.

JVM的某些实现可能会选择解释字节码而不是JIT将其编译为机器代码,并直接运行它.虽然这仍然被认为是"解释器",但它与读取和执行高级源代码的解释器完全不同(即在这种情况下,Java源代码不直接解释,字节码,Java编译器的输出,是.)

从技术上讲,可以提前将Java编译为本机代码并运行生成的二进制文件.也可以直接解释Java代码.

总而言之,根据执行环境,字节码可以是:

  • 提前编译并作为本机代码执行(类似于大多数C++编译器)
  • 及时编译并执行
  • 解读
  • 由支持的处理器直接执行(字节码是某些CPU的本机指令集)

  • 实际上,一些HotSpot JVM首先解释字节码,只有在找出值得编译的内容后才将它们编译成本机代码,并收集一些关于代码运行方式的统计数据; 例如,找出每个条件分支中采用的最常见路径. (16认同)
  • 您可以使用-Xcomp在HotSpot中关闭解释器.值得尝试一个应用程序,看看它是个坏主意. (4认同)
  • 因此,术语“热点”:) 它针对经常运行的内容进行此操作,以获得优化。 (2认同)

dis*_*ame 76

在此输入图像描述

用Java编写的代码是:

  • 首先通过名为javac的程序编译为字节码,如上图左侧所示;
  • 然后,如上图的右侧部分所示,另一个名为java的程序启动Java运行时环境,它可以使用Java Interpreter/JIT编译器编译和/或解释字节码.

java何时解释字节码以及何时编译它?最初解释应用程序代码,但JVM监视频繁执行的字节码序列,并将它们转换为机器代码,以便在硬件上直接执行.对于仅执行几次的字节码,这节省了编译时间并减少了初始延迟; 对于频繁执行的字节码,在慢速解释的初始阶段之后,JIT编译用于高速运行.此外,由于程序花费大部分时间执行其少量代码,因此缩短的编译时间非常重要.最后,在初始代码解释期间,可以在编译之前收集执行统计信息,这有助于执行更好的优化.


参考文献:

1:http://techwelkin.com/compiler-vs-interpreter

2:http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

3:https://en.wikipedia.org/wiki/Just-in-time_compilation#Startup_delay_and_optimizations

  • @sedulam:"大量记忆"是一种模糊的陈述.Java的内存管理非常简单 - 三代是JVM用于创建和维护其对象的内容.这个[另一个SO答案](/sf/ask/244750971/)可能对您有用. (2认同)

sta*_*lue 55

术语"解释语言"或"编译语言"没有意义,因为任何编程语言都可以被解释和/或编译.

至于Java的现有实现,大多数涉及到字节码的编译步骤,因此它们涉及编译.运行时也可以动态加载字节码,因此总是需要某种形式的字节码解释器.该解释器可能会或可能不会在内部使用编译到本机代码.

目前,部分即时编译用于许多曾被认为是"解释"的语言,例如Javascript.

  • 此外,谷歌的V8 JavaScript执行引擎不只是进行部分即时编译.它*总是*编译为本机代码,事实上,V8甚至没有*一个解释器.它只有*编译器(类似于Maxine,但不像Maxine V8只有一个编译器).所有这三个例子(GCJ,Maxine和V8)都更加强烈地证明了你的观点:没有解释语言或编译语言这样的东西.不解释或编译语言.语言只是*是*(这实际上是Shriram Krishnamurthi的引用). (4认同)
  • 你为什么在java问题中谈论javascript? (3认同)
  • @KorayTugay 举个例子。我当然不想暗示 Java 和 Javascript 除了名字的前四个字母之外有任何共同点。 (2认同)

Noo*_*ilk 51

Java被编译为字节码,然后进入Java VM,它解释它.

  • ......但不严格准确. (31认同)
  • cletus:*在*JIT之后,它将被直接执行.JIT正在读取一段字节码(例如**complete*方法),然后**编译**到机器码并跳转到它. (7认同)
  • JVM可能选择不"解释"字节码.它可以JIT编译并直接执行它. (2认同)

may*_*eye 11

两种都有.首先java编译(有些人更喜欢说"翻译")到字节码,然后根据JIT的情绪编译或解释.

  • 这是一个先进的软件,已经发展出情绪:) (29认同)
  • JIT确实是一个非常复杂的软件,它可以根据运行时信息(如分析器)进行优化,这是一个提前编译器无法做到的(因为它没有关于运行时行为的信息)提前计划).但它可能并没有真正的情绪... :-) (5认同)

Sam*_*ell 10

Java是一种编译的编程语言,但它不是直接编译成可执行的机器代码,而是编译成称为JVM字节代码的中间二进制形式.然后编译和/或解释字节代码以运行程序.


pri*_*ime 8

Java同时进行编译和解释,

在 Java 中,程序不会被编译成可执行文件;它们被编译成字节码(如前所述),然后由 JVM(Java 虚拟机)在运行时解释/执行。当我们使用 javac 编译器时,Java 源代码被编译成字节码。字节码以文件扩展名 .class 保存在磁盘上

当程序要运行时,字节码被转换,字节码可以被转换,使用即时(JIT)编译器。结果是机器代码,然后将其送入内存并执行。

JavacJava Compiler,它将 Java 代码编译成字节码。JVM 是 Java 虚拟机,它运行/解释/将字节码转换为本地机器代码。在 Java 中,虽然它被认为是一种解释型语言,但当字节码在 JVM 中时,它可能会使用 JIT(即时)编译。JIT 编译器读取许多部分(或完整,很少)中的字节码,并将它们动态编译成机器码,以便程序可以更快地运行,然后缓存并在以后重用,而无需重新编译。所以 JIT 编译结合了编译代码的速度和解释的灵活性。

一个解释语言是一种类型的编程语言,其中大部分其实现方式的直接和自由地执行指令,而无需先前编译程序成机器语言指令。解释器直接执行程序,将每条语句翻译成一系列已经编译成机器码的一个或多个子程序。

编译语言是一种编程语言,其实现方式是通常的编译器(即从源代码生成机器代码转换器),而不是解释(步骤一步的源代码执行者,其中没有预运行时转换发生)

在像 Java 这样的现代编程语言实现中,提供这两种选择的平台越来越受欢迎。