Javac编译原理

来源:互联网 发布:淘宝时间校准器 编辑:程序博客网 时间:2024/05/01 03:10

JVM(Java Virtual Machine)原理 篇一
Javac 编译原理
javac编译器的任务就是将符合Java语言规范的Java的源代码转化成符合JVM语言规范的class字节码。也就是说将源代码转化成JVM能够识别的一种语言,之后JVM负责将其转化成机器能够识别的机器语言。
总述示意图
Javac编译器工作原理:
工作原理示意图
1.词法分析:如,package zxy.demo.com
Lexer的实现类Scanner和JavacParser,JavaParser规定哪些词符合Java语言规范;Scanner负责单个读取Java源代码,然后解析符合Java语言规范的Token序列。如,package zxy.demo.com;
Token.PACKAGE = package,
Token.IDENTIFIER = zxy.demo.com,(这部分又分为读取第一个token,为zxy,判断下一个token是否为“.”,是的话接着读取下一个Token.IDENTIFIER类型的token,反复直至下一个token不是”.”,也就说明下一个不是Token.IDENIFIER类型的token。)
Token.SEMI = ;
至于以上是如何匹配的,KeyWords类负责此任务。
每个字符集合都是一个Name对象,储存在Name.Table的内部类当中。KeyWords将每个Token.name转化为Name对象建立与Token的对应关系,如果在token对应的Name.Table中找不到的话,那就是Token.IDRNIFIER.如,原本Name.Table中有很多关键字,比如package,读取第一个token是package,在Name.table中查找,找到,保存在KeyWords的key数组中;zxy.demo.com在Name.table中找不到就为Token.IDENIFIER。
这句代码就分析完毕,形成Token流。
2.语法分析
将上一步的每一个token组成一个语句。形成package语法树。
每个语法节点都会实现一个xxxTree,比如packageTree,都是JCTree的子类。
JCTree的属性Tree tag:每个语法节点都会以整数的形式表示,下一个节点在上一个节点上1;
package…;
import..;
如,package为1,import就为2。
pos:储存的是这个语法节点在源代码中的初始位置;
type:表示这个节点是什么Java类型。
3.语义分析
符号出入到符号表:将属于此类的符号(包括类中出现的符号、继承的符号等)输入到类自身的符号表中;
添加默认构造函数:如果类中没有构造函数,则自动添加默认构造函数,有构造函数则不会添加;
标注:检查语义的合法性并进行逻辑判断,比如:类型是否匹配,使用前是否进行初始化,等;
数据流分析:检查使用前是否正确赋值,final修饰的变量不能被重复赋值,等;
对语法树进行语义分析,如消除无用的代码、解除语法糖、如foreach解析成for循环,in到Integer的自动装箱等。
4.代码生成器
将Java方法中的代码块转化成符合JVM语法的命令形式,因为JVM操作都是基于栈。所以讲表达式转化为字节码,比如int a=1;
float b=3.0;return (a+b);
用javap专门用于分析字节码的工具,转化为JVM就是

0:iconst_11:istore_12:fconst_3.03:fstore_24:iload_15:fload_2;6:fadd7:freturn
0 0
原创粉丝点击