【发布时间】:2011-03-11 23:05:33
【问题描述】:
为什么我们说 Java 是一种编译型和解释型语言?
这样做有什么好处(被编译和解释)?
【问题讨论】:
标签: java compiler-construction terminology
为什么我们说 Java 是一种编译型和解释型语言?
这样做有什么好处(被编译和解释)?
【问题讨论】:
标签: java compiler-construction terminology
Java 在编译时被编译为中间“字节码”。这与在编译时编译为机器语言的 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 编译的结果,替换字节码。通过这样做,程序的所有未来执行都将执行,就好像该程序是从一开始就本机编译的一样。
【讨论】:
pow(2,36) 在 32 位系统上会给出 6.87194767360e+10,在 64 位系统上会给出68719476736。
为什么我们说 Java 是编译型和解释型语言。
因为源代码(.java 文件)编译成字节码(.class 文件),然后由Java Virtual Machine(也称为JVM)执行(JVM可以做进一步的优化,但这是另一个故事)。
与此相比有什么优势(正在编译/解释)
便携性。只要安装了JVM,相同字节码就可以在任何平台上执行(“编译一次,随处运行”)。
【讨论】:
这是一个很长的话题,你最好阅读一下JIT。简而言之,Java 被编译为字节码,字节码随后被编译(在 JVM 中)为机器码。
【讨论】:
Java 被认为是一种“编译”语言,因为代码被编译成字节码格式,然后由 Java 虚拟机 (JVM) 运行。这在性能和代码优化方面带来了一些优势,更不用说确保代码的正确性了。
它被认为是一种“解释型”语言,因为在编译字节码后,它可以在任何安装了 JVM 的机器上运行。正是通过这种方式,Java 很像一种解释性语言,因为在很大程度上,它不依赖于正在运行的平台。这种行为类似于 Perl、Python、PHP 等其他解释型语言。
Java 程序可以在没有源代码的任何系统上运行这一事实的一个理论上的缺点是,虽然这种分发方法确保了跨平台兼容性,但开发人员没有理由发布他们的源代码,在“跨平台”和“开源”这两个词的意识形态含义之间产生分歧。
【讨论】:
Java 被编译成字节码而不是二进制文件。字节码不能直接执行,需要Java虚拟机及时编译,运行时再编译成机器码。
在非常基本的层面上,它将程序员编写的代码与 JVM 运行所在的本地机器分开,因此具有更好的可移植性。编译为字节码有助于提高即时编译的性能,减少文件大小,或多或少有助于隐藏真实代码。 (它也消除了一些编译时错误)
【讨论】:
已编译:在程序启动之前,您的程序在语法上是正确的 Java 程序。
解释:在不同平台上运行相同的(字节)代码。
编译:当您的程序编译正确时,您可以控制 80% 的软件错误。而且您的代码不会因为您没有正确关闭代码块等而停止。
解释:你知道小程序是什么吗?它是 Java 出现时的“杀手级”应用程序。您的浏览器从网站下载小程序并在您的浏览器中运行小程序代码。这不是很酷。但是,同样的小程序可以在 Windows、Linux、Mac、Solaris 上运行……因为运行/解释了一种中间语言:字节码。
【讨论】: