Java编译器/解释器

时间:2010-07-05 14:56:19

标签: java compiler-construction terminology

为什么我们说Java是一种编译和解释语言?

这有什么好处(编译和解释)?

7 个答案:

答案 0 :(得分:45)

Java在编译时被编译为中间的“字节代码”。这与在编译时编译为机器语言的C语言形成对比。 Java字节代码不能像编译C代码那样直接在硬件上执行。相反,字节代码必须在运行时由JVM(Java虚拟机)解释才能执行。像C这样的语言的主要缺点是,在编译时,该二进制文件只能在一个特定的体系结构(例如x86)上运行。

像PHP这样的解释语言实际上与系统无关,并且依赖于系统和体系结构特定的解释器。这导致更高的可移植性(相同的PHP脚本适用于Windows机器和Linux机器等)。但是,这种解释会导致性能显着下降。像PHP这样的高级语言需要更多的时间来解释,而不是硬件可以执行的特定于机器的指令。

Java寻求在纯编译语言(没有可移植性)和纯粹解释语言(速度明显变慢)之间找到折衷方案。它通过将代码编译成更接近机器语言的形式来实现这一点(实际上,Java字节代码是一种机器语言,仅用于Java虚拟机),但仍然可以在架构之间轻松传输。因为Java仍然需要一个软件层来执行(JVM),所以它是一种解释型语言。但是,解释器(JVM)在称为字节代码的中间形式上运行,而不是在原始源文件上运行。该字节代码由Java编译器在编译时生成。因此,Java也是一种编译语言。通过这种方式操作,Java可以获得编译语言的一些好处,同时还可以获得解释语言的一些好处。但是,它也继承了这两种语言的一些限制。

正如Bozho指出的那样,有一些策略可以通过使用Just in Time(JIT)编译来提高Java代码(以及其他字节代码语言,如.Net)的性能。实际过程因实现而异,但最终结果是原始代码在编译时被编译为字节代码,但在执行之前它会在运行时通过编译器运行。通过这样做,代码可以以接近原生的速度执行。一些平台(我相信.Net这样做)保存JIT编译的结果,替换字节代码。通过执行此操作,程序的所有未来执行将执行,就好像程序从头开始本地编译一样。

答案 1 :(得分:13)

  

为什么我们说Java是编译和解释语言。

因为源代码(.java文件)被编译到字节码(.class文件)中,然后由{{3} 解释用于执行的(也称为JVM)(JVM可以进行进一步的优化,但这是另一个故事)。

  

与此相比有什么优势(正在编译/解释)

可移植性。只要安装了JVM(“编译一次,随处运行”),相同字节码就可以在任何平台上执行。

答案 2 :(得分:6)

这是一个很长的主题,你最好阅读JIT。简而言之,Java被编译为字节码,字节码随后被编译(在JVM中)到机器代码。

答案 3 :(得分:3)

Java被认为是一种“编译”语言,因为代码被编译成为字节码格式,然后由Java虚拟机(JVM)运行。这在性能和代码优化领域提供了几个优势,更不用说确保代码正确性了。

它被认为是一种“解释”语言,因为在编译字节码之后,它可以在任何安装了JVM的机器上运行。正是通过这种方式,Java非常类似于解释性语言,在很大程度上,它并不依赖于正在运行的平台。此行为类似于其他解释语言,如Perl,Python,PHP等。

Java程序可以在没有源代码的情况下在任何系统上运行这一事实的一个理论上的缺点是,虽然这种分发方法确保了跨平台兼容性,但开发人员没有理由发布其源代码,在“跨平台”和“开源”这两个词的意识形态意义之间徘徊。

答案 4 :(得分:2)

Java被编译成字节码而不是二进制文件。字节代码不能直接执行,它们需要Java虚拟机及时编译并在运行时将它们再次编译成机器代码。

在最基本的层面上,它将程序员编写的代码与JVM操作的本地机器分开,从而实现更好的可移植性。编译为字节码有助于及时编译性能,减少文件大小,或多或少有助于隐藏真实代码。 (它还消除了一些编译时错误)

答案 5 :(得分:1)

已编译:在程序启动之前,您的程序在语法上是一个正确的Java程序。

解释:在不同平台上运行相同(字节)代码。

已编译:当您的程序编译正确时,您可能会有80%的软件错误受到控制。并且您的代码不会停止,因为您没有正确关闭代码块等。

解释:您知道Applet是什么吗?当Java出现时,它就是“杀手”应用程序。您的浏览器从网站下载applet并在浏览器中运行applet代码。那不是很酷。但是,同样的applet在Windows,Linux,Mac,Solaris上运行......因为运行/解释了一种中介语言:字节码。

答案 6 :(得分:0)

  

静态编译器将源代码直接转换为可以直接在目标平台上执行的机器代码,不同的硬件平台需要不同的编译器。

  Java编译器将Java源代码转换为可移植的JVM字节码,这些字节码是JVM的“虚拟机指令”。   第一代JVM完全被解释了。   下一代JVM使用即时(JIT)编译器来加速执行

  HotSpot执行过程结合了解释,分析和动态编译。 HotSpot不是在执行前将所有字节码转换为机器码,而是首先作为解释器运行,只编译“热门”代码 - 最常执行的代码。

在此处阅读更多内容 - https://www.ibm.com/developerworks/java/library/j-jtp12214/