javac编译原理进阶

编译原理初阶:http://blog.csdn.net/dhcao1112/article/details/78336250


对于java的编译的四大过程,在“javac编译原理初阶”中已有大概了解。进一步,我们从javac源码侧再讨论java的编译过程


1、javac源码:源码取自OpenJDK7:com.sun.tools.javac.main.JavaCompiler


 initProcessAnnotations(processors);      line:821

           // These method calls must be chained to avoid memory leaks
           delegateCompiler =
            processAnnotations(  //执行注解处理(输出到符号表(词法、语法分析(Compil....)))
                  enterTrees(stopIfError(CompileState.PARSE, parseFiles(sourceFileObjects))),
                    classnames);

            delegateCompiler.compile2();
            delegateCompiler.close();
            elapsed_msec = delegateCompiler.elapsed_msec;
  case BY_TODO:
                while (!todo.isEmpty())
                    generate(desugar(flow(attribute(todo.remove()))));
   // 生成字节码(解语法糖(数据流分析(标注(todo.remove()))))

我们可以看出,编译执行的顺序:1、词法、语法分析。2、输出到符号表。3、执行注解处理。4、标注。5、数据流分析。6、解语法糖。7、生成字节码。


1、词法语法分析:


词法、语法分析之后,会形成语法树。


而且在此之后,编译器再不会对Java源码进行操作,后续操作都是针对语法树。


2-6、所有过程都可包含在语义分析器之中:


语义分析是针对不同的语义,用各自的类处理相应的信息,在上篇已经提到过。那么分别是怎么执行的呢。


1)填充符号表:com.sun.tools.javac.comp.Enter


 enterTrees()方法。符号表并不具有同一性,可以有有序符号表,树状符号表,栈结构符号表等等


2)注解处理器:   com.sun.tools.javac.procession.JavacProcessingEnvironment


 注解功能是JDK1.5之后出现的,本身是在运行期才作用。在JDK1.6中,提供了插入式注解处理API来在编译器处理注解。


这些API会对注解进行解读,根据不同的注解,来对语法树进行不同的修改。也就是说,每个注解的作用在编译期的体现


就是对语法树进行操作。


3)标注和数据流分析在前文已经说明得比较详细。


4)解语法糖:其实就是对Java语言进行包装拆除。


 比如:foreach循环拆开,本质是for循环、自动拆箱和装箱、泛型的解释、等等



7、字节码生成

 把前面生成的各种信息,在进行修饰和添加之后写入到磁盘。如何修饰和添加呢:生成实例构造器()和类构造器()


。这两个东西,在解读class文件的时候,或者利用javap命令分析字节码时,会看到多出的连个方法。就是在此时,javac编译器


增加进去的。

你可能感兴趣的:(java核心技术,JVM)