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