Java 编译器/解释器
为什么我们说Java是一种编译和解释的语言?
这有什么好处(正在编译和解释)?
为什么我们说Java是一种编译和解释的语言?
这有什么好处(正在编译和解释)?
Java在编译时被编译为中间的“字节码”。这与像C这样的语言相反,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编译的结果,替换字节码。通过这样做,程序的所有未来执行都将像程序从一开始就以本机编译一样执行。
为什么我们说Java是编译和解释的语言。
因为源代码(文件)被编译成字节码(文件),然后由Java虚拟机(也称为JVM)解释以执行(JVM可以进行进一步的优化,但这是更糟糕的故事)。.java
.class
这有什么优势(正在编译/解释)
可移植性。只要安装了JVM,就可以在任何平台上执行相同的字节码(“编译一次,在任何地方运行”)。