除了 Java 的编译器和虚拟机器之外还有一些相关的编译技术本文章试图做一个简单的说明
JIT 编译器
传统的 Java 虚拟机器很愚蠢将一道 bytecode 的指令翻译成机器码之后马上执行这些机器码执行完这批机器码之后就把这些机器码丢了接着再翻译下一道 bytecode 的指令继续下去 即使下次执行到以前执行过的 bytecode 指令依然要重新翻译成机器码才能执行如此一来效率当然不好
使用 JIT 编译器(JustInTime compiler)技术的虚拟机器比较聪明会把常常执行的部分在第一次先翻译好放在内存以后再次执行到这里时就不用再翻译直接从内存取出机器码即可执行这么一来只要你的内存够大JIT 编译器的技术够好你的 Java bytecode 执行速度也可以逼近纯编译式的程序
其它程序语言的编译器
任何档案只要符合 Java bytecode 的格式就可以被 Java 虚拟机器执行制造出 Java bytecode 的方式有许多种不一定要使用 Java 语言来写程序才能编译成 Java bytecodeJava 是语言也是平台你可以不使用 Java 语言(也就是 Java 编译器)只使用 Java 平台(也就是 Java 虚拟机器)只要某语言有提供编译器能将该语言的原始码编译成 Java bytecode 格式就可以在 Java 平台上执行
据我所知目前已经有下列语言提供兼容于 Java 平台的编译器(以英文字母顺序排列)AardappelAdaAgora BAMBOOBasicBistroBoleroCC++CLIPSCOBOLCorrelateDawnEEcmaScriptEiffelFooForthFortranFunnelHaskelHojojavascriptJickleJIFJinniLispLLLLPLogoLuckMINERVAMiniMLModulaNetRexxNiceOberonPascalPLANPnutsPrologPSIPythonSatherSchemeSELFSimkinSmall TalkTclWebLYasslYoixYoyo
原生编译器
如果你不在乎 Java 程序能否跨平台你希望 Java 程序能如同 C/C++ 一般被编译成机器码而非 Java bytecode那么你可以使用 Java 原生编译器(native compiler)目前已经有不少这样的产品可以使用
Java 原生编译器有两大类一类可以把 Java 的原始码编译成机器码另一类则可以把 Java bytecode 编译成机器码
反编译与混淆器
Java bytecode 因为档案格式简单信息保留完整且指令是最简单的堆栈式(stackbased)架构等因素所以很容易被反编译(decompilation)反编译指的是和编译相反的过程对 Java 来说反编译就是把 Java bytecode 转换成 Java 原始码的过程
为了防止你辛苦地开发出来的 Java bytecode 被他人反编译成原始码你可以透过混淆器(obfuscator)将你的 Java bytecode 转换成更混乱的 Java bytecode执行起来效果一样但是被混淆过的 Java bytecode 比较不容易被反编译你通常要为此付出一点代价因为混淆过的程序执行速度通常会变慢且混淆器只能增加反编译的难度不能保证你的程序一定无法被反编译成功毕竟道高一尺魔高一丈如果有人愿意花许多时间和精力反编译你的 Java bytecode你根本就无法拦阻
组译与反组译
汇编语言(assembly)是一种非常接近机器码的语言将汇编语言转成机器码的工具称为组译器(assembler)反过来将机器码转成汇编语言的工具称为反组译器(dissembler)
对于 Java 虚拟机器来说Java bytecode 就如同它的机器码有没有一种语言是很接近 Java bytecode 的呢?也就是说Java 有没有的汇编语言呢?基本上Sun 并未定义 Java 的标准汇编语言但是有一些人定义了自己的 Java 汇编语言并提供 Java 的组译器(甚至反组译器)例如 Jasmin 以及 javaa 都是 Java 组译器
前处理器
前处理器(preprocessor)也称为前编译器(precompiler)或前翻译器(pretranslator)其目的在将源码中不符合语言规范的部分转换成符合语言规范的形式比方说我们可能在 ??????????Java 源码中除了使用 Java 语言之外还穿插使用自订的语法这些自订的语法无法被 Java 编译器处理所以我们必须先透过一个前处理器来将自订语法的部分转换成 Java 语言然后就可以交由 Java 编译器处理
目前有不少 Java 的前处理器例如 iContractSQLJ都是用来扩充 Java 语言之用的
最佳化工具软件
一般来说最佳化有两种
让档案体积变小可以节省储存空间并加快网络传送速度
让执行速度变快
对于 Java 来说还有第三种最佳化
让程序结构变乱不容易被反编译也就是前面提到过的混淆(obfuscation)
这三个目的之间常常互相排挤结构变乱通常会使得程序变慢且体积变大体积变小通常会使得速度变慢且结构变整齐速度变快通常会使得体积变大且结构变整齐