为什么我们说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编译的结果,替换字节码。这样,程序的所有将来执行都将像从一开始就以本机编译的方式执行。