2010-07-05 155 views

回答

39

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编译的结果,替换字节码。通过这样做,程序的所有未来执行都将像程序从一开始就本地编译一样执行。

+0

“像PHP这样的解释型语言完全独立于系统” - 并非完全正确:['pow(2,36) '](http://www.php.net/manual/en/function.pow.php)将在32位系统上提供'6.87194767360e + 10',在64位系统上提供'68719476736'。 – amphetamachine 2010-07-05 20:39:36

+0

一个小小的挑逗 - 但字节码是机器语言。有没有什么能阻止你拥有一个实现JVM规范的物理机器。在这种情况下,字节码将直接在硬件上执行,并且不需要软件层或解释。 – emory 2010-07-06 00:20:48

+1

@amphetamachine公平不够,“有效”如何? – 2010-07-06 02:04:26

6

这是一个很长的话题,你最好读一下JIT。简而言之,Java被编译为字节码,稍后将字节码编译(在JVM中)为机器码。

+0

什么是简单的JIT? – JavaUser 2010-07-05 15:00:23

+4

@JavaUser大约需要10分钟才能读取这个答案。 – ant 2010-07-05 15:02:57

1

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

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

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

解释:您知道小程序是什么吗?这是Java推出时的“杀手级”应用程序。您的浏览器从网站下载小程序并在浏览器中运行小程序代码。这不是很酷。但是,相同的小程序在Windows,Linux,Macs,Solaris上运行...因为运行/解释媒介语言:字节码。

+2

答案是非常抽象的。你可以推荐使用 – JavaUser 2010-07-05 15:03:03

2

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

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

2

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

它被认为是一种“解释”语言,因为在字节码编译后,它可以在任何安装了JVM的机器上运行。 Java就是这样一种解释型语言,它在很大程度上不依赖于正在运行的平台。这种行为与Perl,Python,PHP等其他解释型语言相似。

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

11

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

因为源代码(.java文件)是编译成字节码(.class文件),然后执行解释Java Virtual Machine(也称为JVM)(在JVM可以做进一步的优化,但此是另一个故事)。

什么优势在这个(被编译/解释)

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

1

Java是一种完整的面向对象的编程语言。它是独立的平台 ,通常被解释而不像C/C++那样编译。 Java使用独立的体系结构中立的字节码。也就是说,它被设计成与机器无关。字节代码由Java虚拟机(JVM)解释和执行。