欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[javac add python list feature 9] 简要总结 javac 编译文件的过程

最编程 2024-07-13 13:11:16
...
3月16日,北京源创会 —— “数据库,2024 开炫”

看了好久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是生成代码和文件