为什么我们说Java是一种编译型和解释型语言?
这样做的好处是什么(被编译和解释)?
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编译的结果,替换字节码。通过这样做,程序的所有未来执行都将像该程序从一开始就被本机编译一样执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)