javac       

javac

com.sun.tools.javac.comp.CompileStates

编译阶段


public enum CompileState {
    INIT(0),          //初始化
    PARSE(1),         //词法和语法分析 
    ENTER(2),         //建立符号表
    PROCESS(3),       //处理注解
    ATTR(4),          //属性计算
    FLOW(5),          //数据流分析
    TRANSTYPES(6),    //去除语法糖:泛型处理
    TRANSPATTERNS(7), //去除语法糖:模式匹配处理
    UNLAMBDA(8),      //去除语法糖:LAMBDA处理(转换成方法)
    LOWER(9),         //去除语法糖:内部类、foreach循环、断言等。
    GENERATE(10);     //生成字节码
    ...
}

processAnnotations(                             //3:处理注解
  enterTrees(stopIfError(CompileState.PARSE,    //2:建立符号表
    initModules(stopIfError(CompileState.PARSE, 
      parseFiles(sourceFileObjects))            //1:词法和语法分析
    ))
  ),classnames);

...
case SIMPLE:
  generate(                                       //10:生成字节码
    desugar(                                      //6~9:去除语法糖 
      flow(                                       //5:数据流分析
        attribute(todo))));                       //4:属性计算  

public class MyClass {
    public int a = 2+3;
    public int foo(){
        int b = a + 10;
        return b;
    }
}

ast作用域图

image-20200706080835227

参考

https://time.geekbang.org/column/article/252828