Jav*_*ser 19 java compiler-construction terminology
为什么我们说Java是一种编译和解释语言?
这有什么好处(编译和解释)?
Chr*_*son 46
Java在编译时被编译为中间"字节代码".这与在编译时编译为机器语言的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编译的结果,替换字节代码.通过执行此操作,程序的所有未来执行将执行,就好像程序从头开始本地编译一样.