Java编译器/解释器

Java编译器/解释器,java,compiler-construction,terminology,Java,Compiler Construction,Terminology,为什么我们说Java是一种编译和解释语言 这(被编译和解释)有什么好处?这是一个很长的主题,你最好阅读一下。简而言之,Java被编译成字节码,字节码随后(在JVM中)被编译成机器码。编译:在程序启动之前,您的程序在语法上是正确的Java程序 解释:在不同的平台上运行相同的(字节)代码 编译:当您的程序正确编译后,舒尔可以控制80%的软件缺陷。您的代码不会因为没有正确关闭代码块而停止,等等 你知道小程序是什么吗?Java问世时,它是“杀手级”应用程序。浏览器从网站下载小程序,并在浏览器中运行小程序

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


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

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

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

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

编译:当您的程序正确编译后,舒尔可以控制80%的软件缺陷。您的代码不会因为没有正确关闭代码块而停止,等等


你知道小程序是什么吗?Java问世时,它是“杀手级”应用程序。浏览器从网站下载小程序,并在浏览器中运行小程序代码。那不是很酷。但是,同样的小程序运行在Windows、Linux、Mac、Solaris等平台上。。。因为运行/解释了一种中介语言:字节码。

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

在一个非常基本的层次上,它将程序员编写的代码与JVM运行的本地机器分开,因此具有更好的可移植性。而编译成字节码有助于提高即时编译的性能,减少文件大小,或多或少有助于隐藏真实代码。(它还消除了一些编译时错误)

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

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

Java程序可以在没有源代码的情况下在任何系统上运行这一事实在理论上的一个缺点是,尽管这种分发方法确保了跨平台兼容性,但开发人员发布源代码的理由却少了一个,这就在“跨平台”和“开源”

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

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

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


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

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

答案是非常抽象的。你能不能把“像PHP这样的解释语言是完全独立于系统的”——不完全正确:将给出
6.87194767360e