首页 > 代码库 > java的编译机制

java的编译机制

    我们通常写的文件都是java文件,最后要在JVM上运行则需要将java文件编译成class(二进制文件).

各厂商在实现JDK时通常会符合java语言规范的源码编译为class文件的编译器.编译器的好坏很大程度上决定了最后程序在机器上执行效率.通常使用Sun JDK(javac).

javac将java源码编译成class文件有以下主要的三个步骤:

分析和输入到符号表(parse and enter)

    parse过程为词法分析和语法分析.词法分析主要是将字符串转成token序列;语法分析是根据语法将token生成抽象语法树.

   enter是将符号输入到符号表.通常包括确定类的超类型和接口、根据需要添加默认构造器、将类中出现的符号输入类自身的符号表中等。


注解处理(annotation processing)

    主要处理用户自定义的注解,我们通常会根据注解来生成一代码或做一些特殊的检查。而在编译时就会生成相关代码。然后再做parse and enter操作。


语义分析和生成class文件(analyse and generate)

    analyse是基于抽象语法树进行一系列的语义分析,包括将语法树中的名字、表达式等元素与变量、方法、类型等联系到一起;检查变量前是否申明;推导泛型方法的类型参数;检查类型匹配;进行常量折叠;检查所有语句都可到达;检查所有exception都被捕获或抛出;检查变量的确定性赋值;将泛型转为java;精减语法结构等;

    在完成了语义分析后,开始生成class文件:首先将实例成员初始化器收集到构造器中,将静态成员初始化器收集为<clinit>();接着将抽象语法树生成字节码,采用的方法为后序遍历语法树,并进行最后的少量代码转换(如将string转变为stringBuffer操作);最后从符号表生成class文件。

    class文件中并不仅仅存放了字节码,还存放了很多辅助JVM来执行class的附加信息。

java的编译机制