Java的魔法:字节码

Java能够同时解决前面提到的安全性问题和可移植问题的关键在于,Java编译器的编译结果不是可执行代码,而是字节码(bytecode).字节码是一系列设计用来由名为Java虚拟机(Java Virtual Machine,JVM)的java运行时系统执行的高度优化的指令.确切的讲,初始的Java虚拟机是一个字节码解释器.这可能会让你有些吃惊.因为如你所知,出于性能考虑,多数现代语言是用来被编译,而不是被解释的.然而,Java程序由JVM执行这一事实帮助解决了与基于web的程序相关的主要问题.下面就是原因所在.
讲java程序解释成字节码会使不同环境下的程序运行都变得十分轻松,因为只需要对每个平台实现Java虚拟机.一旦给定系统有了运行时包,那么在他上面就可以运行任何Java程序.切记,尽管平台之间的Java虚拟机不尽相同,但是他们都是可以理解相同的Java字节码.如果Java程序被编译成了本机代码,那么一个程序就要为于Internet连接的每种CPU准备一种不同的版本.显然,这不是一种可行的解决方案,因此,由JVM执行字节码是创建真正可移植程序的最简单的方法.
Java程序由JVM执行这一事实也是其更加安全.因为每一个Java程序的执行都处于JVM的控制之下,JVM可以包含程序,防止程序在系统外产生副作用.此外,Java语言中的一些限制也增强了安全性.
当一个程序被解释时,他的总体运行速度要比该程序被编译为可执行代码时的执行速度慢许多.然而,对于Java,两者的区别却并不是很明显.因为字节码已被高度优化,所以使用字节码会使JVM执行程序的速度比你想象的快许多.
尽管Java被设计为解释型的语言,但这在技术上并不妨碍Java的字节码也可以迅速编译为本机代码.基于这一原因,Sun在Java初始版本发布后不久就提供了其HotSpot技术.HotSpot提供了一个JIT(Just In Time)字节码编译器.当JIT成为JVM的一部分后,他可以根据逐条命令将字节码实时转换为可执行代码.因为Java执行的各种检查只有在运行时才进行,所以不可能将整个Java程序一次性编译为可执行代码,而是在执行期间需要时JIT才编译代码,理解这一点是非常重要的.而且,并不是所有字节码序列都要被编译,只有那些能够从编译收益的字节码才会被编译.其余的代码会被简单的解释.尽管如此,JIT方法也使得性能有了显著提升.因为JVM依然控制着执行环境,所以甚至是在对字节码进行动态编译时,可移植性与安全性也可以保证.