为什么我们说Java是一种既编译又解释的语言?
这种语言具有哪些优点(即编译与解释相结合)?
为什么我们说Java是一种既编译又解释的语言?
这种语言具有哪些优点(即编译与解释相结合)?
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 编译的结果,取代了字节码。通过这样做,程序的所有未来执行都将像从一开始就本地编译的程序一样执行。
.java
文件)被编译成字节码(.class
文件),然后由Java虚拟机(也称为JVM)进行解释执行(JVM可以进行进一步的优化,但这是另一个故事)。这就是为什么我们说Java是编译和解释语言的原因。Java被认为是一种"编译型"语言,因为代码被编译成字节码格式,然后由Java虚拟机(JVM)运行。这在性能和代码优化方面具有几个优点,而且可以确保代码正确性。
它被认为是一种"解释型"语言,因为在字节码编译完成后,它可以在安装了JVM的任何计算机上运行。从这个角度来看,Java很像解释型语言,因为它在很大程度上不依赖于运行平台。这种行为与其他解释型语言如Perl、Python、PHP等类似。
理论上,Java程序可以在没有源代码的情况下在任何系统上运行的一个缺点是,尽管这种分发方法确保了跨平台兼容性,但开发人员少了一个发布他们的源代码的理由,这在“跨平台”和“开源”的意义之间造成了隔阂。
Java被编译成字节码而不是二进制代码。这些字节码不能直接执行,需要Java虚拟机在运行时进行即时编译并将其重新编译为机器代码。
从非常基本的层面上讲,它将程序员编写的代码与JVM所运行的本地机器分离,因此具有更好的可移植性。将代码编译为字节码有助于即时编译的性能,减少文件大小,并且或多或少地帮助隐藏真实代码。(它还消除了一些编译时错误)
编译:在程序开始之前,您的程序是一个语法上正确的Java程序。
解释:在不同的平台上运行相同的(字节)代码。
编译:当您的程序已经正确编译,您可以确信有80%的软件错误得到了控制。您的代码不会因为没有正确关闭代码块等而停止。
解释:您知道什么是Applets吗?当Java推出时,它是“杀手级”应用程序。您的浏览器从网站下载小程序并在浏览器中运行小程序代码。这不是很酷。但是,同样的小程序在Windows、Linux、Macs、Solaris等系统上运行/解释一种中间语言:字节码。
pow(2,36)
将返回6.87194767360e+10
,而在64位系统上则返回68719476736
。 - amphetamachine