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

时间:2009-08-25 04:37:22

标签: java compilation interpretation

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

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

9 个答案:

答案 0 :(得分:183)

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

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

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

总结一下,根据执行环境,字节码可以是:

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

答案 1 :(得分:59)

enter image description here

用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

答案 2 :(得分:53)

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

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

目前,部分即时编译用于许多曾被视为“解释”的语言,例如Javascript。

答案 3 :(得分:47)

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

答案 4 :(得分:11)

两者都有。首先是java编译(有些人更喜欢说“已翻译”)到字节码,然后根据JIT的情绪进行编译或解释。

答案 5 :(得分:10)

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

答案 6 :(得分:2)

Java同时进行编译和解释,

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

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

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

interpreted language 是一种编程语言,其大多数实现都可以直接自由地执行指令,而无需事先将程序编译为机器语言指令。解释器直接执行程序,将每个语句转换为已编译为机器代码的一个或多个子程序的序列。

compiled language 是一种编程语言,其实现通常是编译器(从源代码生成机器代码的转换器),而不是解释器(源代码的逐步执行程序,没有发生运行前转换的地方)

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

答案 7 :(得分:-1)

Java是一种字节编译语言,面向一个名为Java Virtual Machine的平台,它基于堆栈,在许多平台上都有一些非常快速的实现。

答案 8 :(得分:-3)

来自:https://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster

的报价
  

应用程序开发人员可以在当今市场上可用的各种操作系统上开发应用程序代码。 Java语言在此阶段与操作系统无关。 Java应用程序开发人员编写的精彩源代码现在被编译为Java Byte代码,在Java术语中称为客户端编译。这种Java Byte代码编译使Java开发人员能够“一次编写”。 Java Byte代码可以在任何兼容的OS和服务器上运行,因此使源代码与OS / Server无关。在Java Byte代码创建之后,Java应用程序与底层OS / Server之间的交互更加密切。旅程继续 - 企业应用程序框架在运行时环境中执行这些Java字节代码,该环境称为Java虚拟机(JVM)或Java运行时环境(JRE)。 JVM与底层操作系统和硬件关系密切,因为它利用了操作系统和服务器提供的资源。 Java字节代码现在编译为特定于平台的机器语言可执行代码。这称为服务器端编译。

所以我想说Java绝对是一种编译语言。