参考资料:深入分析JavaWeb技术内幕
1. 什么是Javac
Javac是一种编译器,将Java源代码编译成JVM能够识别的一种语言,JVM再把这种语言转变成机器能够识别的语言。从表面上看就是将.java文件编译成.class文件。.class文件中是一连串的 16 进制二进制流。
javac 编译器也称为前端编译器
2.Javac编译器的基本结构
Javac编译器工作步骤:
- 词法分析:识别关键词
- 语法分析:检查关键词组合在一起是不是符合语法规范
- 语义分析:将复杂的语法转换为简单的语法,如将foreach转为for
- 通过字节码生成器生成字节码
3. Javac工作原理
1.词法分析器
由图可知,两个Factory生成两个实现类:Scanner、JavacParser。
JavacParser规定哪些词符合Java语法规范,Scanner负责具体读取和归类不同词法,Token规定了所有Java语言的合法关键词,Names用来储存和表示解析后的词法。
词法分析过程在JavacParser的parseCompilationUnit方法中完成
//代码不贴了,整不明白
大致就是从源文件每个字符开始,按照语法规范找到关键字、属性、方法定义等构建一个语法树。
以下面的代码为例:
package compile
/**
* Cifa
* <p/>
* Author By: xulingbo
*/
public class Cifa{
int a;
int b = a + 1;
}
这个类对应的Token流:
Token.IDENTIFIER表示用户定义的名称,如类名、属性名、方法名。
JavacParser规定了要读取哪个Token,Token流要符合Java规范。比如package后必须跟包名。
Token与Name是对应关系
2. 语法分析器
语法分析器将Token流转化为更加结构化的语法树,也就是将单词组装成语句。