主要介绍Javac的实现过程及原理。java
首先弄明白什么是Javac?jvm
Javac是一种编译器,将一种语言转换为另外一种语言规范。编译器的做用就是将符合java语言规范的源代码转化为JVM虚拟机可以识别的字节码文件的过程。函数
对于java而言。javac任务就是将java源代码转换为jvm可以识别的二进制码。将.java文件转换为.class文件,这些.class文件也就是字节码文件只有JVM可以识别。spa
编译过程的原理:对象
一、词法分析:首先将源代码按照字节的方式读取,而后找出定义的语法关键字(if/else/for等),而后判断哪些关键字是符合java语言规范的,通过整理分析返回一些规范化的Token流blog
二、语法分析:对Token流进行分析。分析出这些关键字组合在一块儿是否符合java语言规范,通过分析以后会产生一个符合java规范的抽象语法树。抽象语法树就是一个结构化的语法表达式,做用就是将词法用一个结构化的形式组合在一块儿。继承
Java的语法树使java源码更加结构化,每一个语法树上的节点都是一个JCTree实例接口
JCTree类有三个重要属性:其实这三个属性很好理解,为了分辨出树中的每个节点而出现的,定义了这三个属性,能够很快速的找到节点在树中的层次结构和位置。编译器
三、语义分析:对生成的抽象结构树进一步分析,将复杂的语法结构转换为简单的,易于理解和阅读的语法结构。例如:将加强for循环foreach转换为for循环结构。通过语义分析以后会产生一个更加具体的抽象结构树。源码
语义分析实现的步骤;
语义分析主要是在Enter类中完成的,这个类主要有两个步骤
(1)将全部类中出现的符号都输入到类自身的符号表中,全部的类符号,类参数列表,超类符号,和继承的接口类型符号都会存储到未处理的符号列表中(由于类除了自身的符号以后还有其余类中的引用,因此要进行分类)
(2)在未处理的符号列表中,将全部类符号解析到各自的类符号中,在MemberEnter.complete()类中完成。(解析语法树,将全部的符号都添加到符号表中)
在Enter类解析的步骤中,还有一个辅助操做:
数据流分析实现的步骤:
一、检查变量在使用以前是否赋值,除了8中基本数据类型以外,还有String类型和其余对象的引用在使用以前都须要赋值。
二、使用final修饰的变量不会被从新赋值,若是重复复制会报错;同时若是变量是静态成员变量在定义的时候就必须赋值
三、分析方法返回值类型
四、全部的Checked Exception都必须向上抛出或者捕获。
五、全部的语句都会被执行,这个分析的是return语句以后是否还有语句,由于return以后的语句不会被执行。
四、字节码:通过了上面的三个步骤以后,java源代码就能够被转换成为java虚拟机(JVM)可以别的字节码文件。
代码生成器:
整个业务流程:
关于javac的基本原理就介绍到这里,有兴趣的能够研究下Javac的源码,能够从OpenJdk下载到源码。