二千年六月二日,影星 Tom Curse... oops! Tom Cruse,不不不,我是说 Tom Cruise(汤姆克鲁斯)来台宣传新片 Mission: Impossible 2(不可能的任务 2)。虽然还没去看,但任谁都猜得出结果:咱们俊俏的 Tom 不会让全球影迷失望,在片中,他一定会再一次地完成了不可能的任务(可能还会有抱得美人归的 bonus)。依我看来,这种任务只能叫做「Mission: Difficult(有难度的任务)」,当然擅长行销的电影公司绝对不会取这么没号召力的名字,好象 Tom 是个 wimp 似的。
「连续完成了两次的任务,还说是不可能的任务,我看 Tom 在情报局的上司对任务的分级有问题 ......」我不免犯嘀咕。要称得上是不可能的任务,我心中倒是有一个,那就是「让 Java 透过虚拟机器的方式执行得比 native 的 C/C++ 快」。
在 HotSpot 虚拟机器 1.0 推出之前,Sun 用了约一年的时间在为 HotSpot 造势,天花乱坠的说法中,最让大家感兴趣的是他们所宣称的「HotSpot 可以大幅地提升 Java 的执行速度,使得执行效能逼近 C/C++,甚至超越 C/C++」。我的天!「甚至超越 C/C++」,这种超越极限的事,的确是值得大书特书的。但仔细想想,怎么可能超越 C/C++ 的 native code 呢?以编译器的原理来看,这根本就是不可能的!
一个程序要能执行,必须经过六大步骤,分别是:语汇分析、语法分析、语意分析、产生中间码、最佳化、产生目的码。纯直译式的语言不需要编译,执行的时候才由直译器进行这六个步骤;纯编译式的语言在程序执行前需要进行编译,完成上述的六大步骤之后得到执行档,此执行文件用到底下硬件平台的指令集和相关的函式库,所以直接就可执行,不需要直译器,这样的执行档我们称为 native code。
除了纯直译和纯编译的语言之外,还有一种叫做混合式语言,传统的 Java 就属于这一类。Java 程序需要编译器来进行前四大步骤(语汇分析、语法分析、语意分析、产生中间码),产生出来的中间码就是 class 檔。这些 class 档不能直接执行,需要直译器来进行最后的翻译步骤才能执行。
C/C++ 是纯编译式的语言,所以程序必须被编译成底下平台的指令集,执行时就不像 Java 需要直译器的翻译,所以 C/C++ 的执行档自然比 Java 的 class 档快许多。因此,只要 Java 程序是在虚拟机器上执行,不管使用什么样的算法来加速(包括 JIT Compiler),仍然不可能比 C/C++ 的 native code 快。
在我的这番说明之后,你应该也能体会 Java 为什么速度上的表现一直未能让我们满意。但为了得到跨平台的好处,这一点牺牲也是值得的。更何况新一代的的 Java 虚拟机器的执行效能一直都在进步,但再怎么进步还是不可能超越 C/C++ 的 native code。
什么!你说有人号称他们的虚拟机器可以让 Java 的执行效能「比汇编语言好」。我看这已经不是 Mission: Impossible,而是 Mission: Laughable 了。叫那些人去上一上「编译器原理」的课,别再出来贻笑大方了。