[javac add python list feature 9] 简要总结 javac 编译文件的过程
看了好久javac的源代码,来一个简单总结:
Scanner->Parser->Annotation(optional)->Enter->Attribute->Flow->Desugar->Generate
而贯穿整个过程的数据结构,就是Abstract Syntax Tree(抽象语法树),关于AST的结构查看 AST。
Scanner是将源文件按照单词一个一个的读入
Parser是将读入的单词按照语法(Syntax)构造成最初的AST。之后跟源文件就没有关系了,完全是对AST的操作。
Annotation是对Annotation的处理,这一步是可选的
Enter是获取类和类的成员信息,分两步,一是输入所有的类名称。二是对每一个类,完成它的成员的输入。这个时候会得到一个符号表,里面只包含类符号,类中定义的成员的符号,不会包含成员函数内部(即局部变量)的符号
Attribute是为AST添加额外的信息。这个过程的结果,主要是为所有的AST节点添加符号信息,包含类型,名字。并且做Type check(如赋值号右边的值能否赋给左边),name resolution(名字解析,可能会涉及到定义在其他文件中的类;检查命名是否重复),Constant fold(比如String a="a"+"b"会被变成String a="ab").这里面也会用到符号表,并且符号表是完全的符号表,包含局部变量的信息。但是这个符号表在Attribute结束后就被丢弃了。
Flow是流分析。包括Liveness analysis(检查是否每个语句都会被执行到),Exception analysis(保证exception是定义过的,并且被处理),Definite assignment analysis(保证每个变量使用时都已经被初始化),Definite unassignment analysis(保证final不会被改变)
Desugar是移除一些特殊语法,比如匿名内部类,foreach循环等
Generate是生成代码和文件