Java编译器/解释器

21

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

这种语言具有哪些优点(即编译与解释相结合)?

6个回答

51

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

解释性语言如PHP实际上是与系统无关的,并且依赖于系统和架构特定的解释器。这导致了更高的可移植性(相同的PHP脚本可以在Windows机器和Linux机器上工作等)。然而,这种解释方式会导致显著的性能下降。高级语言如PHP需要比可以由硬件执行的机器特定指令多花费更多的时间来解释。

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

正如 Bozho 提到的那样,有一些策略可以通过使用即时编译(JIT)来增加Java代码(和其他字节码语言,如.Net)的性能。实际处理过程因实现而异,基于要求,但最终结果是原始代码在编译时被编译成字节码,然后在执行前在运行时通过编译器进行编译。通过这样做,代码可以以接近本地速度执行。一些平台(我相信 .Net 这样做)保存了 JIT 编译的结果,取代了字节码。通过这样做,程序的所有未来执行都将像从一开始就本地编译的程序一样执行。


“像PHP这样的解释性语言完全独立于系统”——这并不完全正确:在32位系统上,pow(2,36)将返回6.87194767360e+10,而在64位系统上则返回68719476736 - amphetamachine
一个小问题 - 但是字节码是机器语言。没有任何阻止你拥有一个实现JVM规范的物理机器。在这种情况下,字节码将直接在硬件上执行,不需要软件层或解释。 - emory
1
很好,那就说“有效地”? - Chris Thompson
@emory - 是的,非常正确。我为了解释的简便性而进行了简化,我会编辑以使其更加正确。 - Chris Thompson
很棒的简单解释。 - Tintin

14
因为源代码(.java文件)被编译成字节码(.class文件),然后由Java虚拟机(也称为JVM)进行解释执行(JVM可以进行进一步的优化,但这是另一个故事)。这就是为什么我们说Java是编译和解释语言的原因。
可移植性。只要安装了JVM(“编译一次,在任何地方运行”),就可以在任何平台上执行相同的字节码。

6

这是一个较长的话题,你最好阅读有关JIT的内容。简而言之,Java被编译为字节码,然后在JVM中将字节码编译为机器码。


3

Java被认为是一种"编译型"语言,因为代码被编译成字节码格式,然后由Java虚拟机(JVM)运行。这在性能和代码优化方面具有几个优点,而且可以确保代码正确性。

它被认为是一种"解释型"语言,因为在字节码编译完成后,它可以在安装了JVM的任何计算机上运行。从这个角度来看,Java很像解释型语言,因为它在很大程度上不依赖于运行平台。这种行为与其他解释型语言如Perl、Python、PHP等类似。

理论上,Java程序可以在没有源代码的情况下在任何系统上运行的一个缺点是,尽管这种分发方法确保了跨平台兼容性,但开发人员少了一个发布他们的源代码的理由,这在“跨平台”和“开源”的意义之间造成了隔阂。


2

Java被编译成字节码而不是二进制代码。这些字节码不能直接执行,需要Java虚拟机在运行时进行即时编译并将其重新编译为机器代码。

从非常基本的层面上讲,它将程序员编写的代码与JVM所运行的本地机器分离,因此具有更好的可移植性。将代码编译为字节码有助于即时编译的性能,减少文件大小,并且或多或少地帮助隐藏真实代码。(它还消除了一些编译时错误)


1

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

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

编译:当您的程序已经正确编译,您可以确信有80%的软件错误得到了控制。您的代码不会因为没有正确关闭代码块等而停止。

解释:您知道什么是Applets吗?当Java推出时,它是“杀手级”应用程序。您的浏览器从网站下载小程序并在浏览器中运行小程序代码。这不是很酷。但是,同样的小程序在Windows、Linux、Macs、Solaris等系统上运行/解释一种中间语言:字节码。


2
答案非常抽象。您能否详细说明一下? - JavaUser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接