JAVA虚拟机(五):Javac编译原理

1、Javac编译器的基本结构

Javac主要有4个模块:词法分析、语法分析、语义分析、代码生成。

2、词法分析

(1)功能:读取源文件的字符流,解析出符合Java语言规范的Token序列。

(2)关键类:

com.sun.tools.javac.parser.Scanner:读取源文件的字符流,解析出符合Java语言规范的Token序列。

com.sun.tools.javac.parser.Tokens$TokenKind:规定了Java语言所有的合法关键词,如 Token.CLASS,Token.INT 等。

com.sun.tools.javac.util.Names:用来存储和表示解析后的词法。

(3)词法分析解析出Token序列示例:

代码:

package compile;

public class Cifa {
  
}

解析后的Token序列:

3、语法分析

(1)功能:将Token序列构造成更加结构化的抽象语法树。

(2)关键类:

com.sun.tools.javac.tree.TreeMaker:构建生成语法节点。

com.sun.tools.javac.tree.JCTree:抽象语法树的每个节点都是JCTree的子类,并且每个语法节点都会实现一个类如 IfTree、MethodDeclTree 的接口。例如,JCMethodDecl 语法节点(即方法语法节点)继承了 JCTree 并且实现了 MethodDeclTree 接口。

(3)语法分析构造出的抽象语法树示例:

代码:

public class Yufa {
    int a;

    private int c = a + 1;

    public int getC() {
	return c;
    }
}

构成成的抽象语法树:

4、语义分析

(1)功能:在语法分析生成抽象语法树的基础上再做一些处理。比如,给类添加默认构造函数,检查变量在使用前是否已经初始化,检查操作变量类型是否匹配,解除Java的语法糖,等等。

(2)关键类:

com.sun.tools.javac.comp.Enter:将在类中出现的符号输入到类自身的符号表中;给类添加默认构造函数。

com.sun.tools.javac.processing.JavacProcessingEnvironment:处理annotation(注解)。

com.sun.tools.javac.comp.Attr(标注):检查语义的合法性并进行逻辑判断。例如:变量的类型是否匹配;变量在使用前是否已经初始化;推导泛型方法的参数类型;字符串常量的合并,等等。

com.sun.tools.javac.comp.Flow:数据流分析和进一步语义分析。例如:检查变量在使用前是否都已经被正确赋值;保证final修饰的变量不会被重复赋值;变量的自动转换,如将 int 自动包装成 Integer 类型;解除语法糖,如将 foreach 转化成更简单的 for 循环形式。

5、代码生成

(1)功能:遍历语法树,生成最终的Java字节码。

(2)关键类:

com.sun.tools.javac.jvm.Gen:遍历语法树,生成最终的Java字节码。

注:以上内容学习自《深入分析JavaWeb技术内幕》。

猜你喜欢

转载自blog.csdn.net/lercent/article/details/81032445