Javac的实现过程

主要介绍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类有三个重要属性:其实这三个属性很好理解,为了分辨出树中的每个节点而出现的,定义了这三个属性,能够很快速的找到节点在树中的层次结构和位置。编译器

  1. TreeTag:每一个语法数节点都用整形常熟表示,每一个节点数值都是在前一个节点的基础上执行加一操做,顶点节点TopLevel是1,那紧接着的Import节点就在TopLevel的基础上加一,等于2  
  2. pos:整数。表示位置
  3. type:表示节点的类型

 

 

 

 

三、语义分析:对生成的抽象结构树进一步分析,将复杂的语法结构转换为简单的,易于理解和阅读的语法结构。例如:将加强for循环foreach转换为for循环结构。通过语义分析以后会产生一个更加具体的抽象结构树。源码

语义分析实现的步骤;

语义分析主要是在Enter类中完成的,这个类主要有两个步骤

(1)将全部类中出现的符号都输入到类自身的符号表中,全部的类符号,类参数列表,超类符号,和继承的接口类型符号都会存储到未处理的符号列表中(由于类除了自身的符号以后还有其余类中的引用,因此要进行分类)

(2)在未处理的符号列表中,将全部类符号解析到各自的类符号中,在MemberEnter.complete()类中完成。(解析语法树,将全部的符号都添加到符号表中)

在Enter类解析的步骤中,还有一个辅助操做:

  • 添加默认的构造函数;
  • 接着下一步是处理注解:在JavaProcessingEnvironment类中完成;
  • 数据流分析,在Flow类中完成。  

    数据流分析实现的步骤:

    一、检查变量在使用以前是否赋值,除了8中基本数据类型以外,还有String类型和其余对象的引用在使用以前都须要赋值。

    二、使用final修饰的变量不会被从新赋值,若是重复复制会报错;同时若是变量是静态成员变量在定义的时候就必须赋值

    三、分析方法返回值类型

    四、全部的Checked Exception都必须向上抛出或者捕获。

    五、全部的语句都会被执行,这个分析的是return语句以后是否还有语句,由于return以后的语句不会被执行。

  • 语义分析器的最后一个步骤,进一步处理语法树,解决的问题
    •   消除无用的代码,例如:if条件永远为false不会被执行的代码块  
    •         解除语法糖:说白了就是将例如加强的foreach循环转换为for循环
    •         变量自动类型转换:例如:int类型和Integer类型之间相互转换

四、字节码:通过了上面的三个步骤以后,java源代码就能够被转换成为java虚拟机(JVM)可以别的字节码文件。

代码生成器:

  •   将源代码转换成符合JVM语法规范的命令形式,JVM的全部操做都是基于栈操做的,所以全部的操做都在进栈和出栈中完成。
  •         按照JVM文件组织的形式将字节码输出到后缀名为class的字节码文件中

整个业务流程:

 

 关于javac的基本原理就介绍到这里,有兴趣的能够研究下Javac的源码,能够从OpenJdk下载到源码。

相关文章
相关标签/搜索