Javac 编译原理

Posted 丨核桃牛奶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javac 编译原理相关的知识,希望对你有一定的参考价值。

写在前面 JDK & JRE 

 

JRE(Java Runtime Enviroment)是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。


JDK(Java Development Kit)又称J2SDK(Java2 Software Development Kit),是Java开发工具包,它提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提 供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运行Java程序的平台。JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具tools.jar和Java标准类库 (rt.jar)。

JDK also could be called as SDK(Software Development Kit) for Java.


 

1.Javac是什么?

Javac是一种编译器,能将一种语言规范转化为另外一种语言规范通常编译器都是将便于人理解的语言规范转化成机器容易理解的语言规范

Javac的任务就是将java源码编译成java字节码,也就是JVM能够识别的二进制码。表面上来看就是将.java文件转化为.class文件,实际上是将java的源代码转化成一连串有格式的二进制数字,只有JVM能够正确识别它们到底表达了什么意思。

 

2.Javac的工作流程及类比

  2.1 寻找语法关键词 比如if else for while 等,这个过程称为词法分析  (词法分析的结果是从源代码中找出一些规范化的Token流

  类比:人类语言中分辨 词语 标点符号 动词 名词

  2.2 检查这些关键词组合在一起是否符合Java语言规范,这个过程称为语法分析 (语法分析的结果是一个符合Java规范的抽象语法树

  类比: 人类语言中是不是有主谓宾 主谓宾组合的是否正确 语法是否正确

  2.3 将难懂的、复杂的语法转化为更加简单的语法,这个过程称为语义分析 (比如说将foreach转成for,结果是生成了一个注解过后的抽象语法树,这棵树更加接近目标语言的语法规则)

  类比:人类语言中将难懂的文言文翻译为白话文

  2.4 通过字节码生成器生成字节码,将经过注解的抽象语法树生成字节码,也就是将一个数据结构转化为另一个数据结构

  类比:将中文词语翻译为英文单词后,按照英文语法组装成英文语句 

 

  综上所述,Javac主要有四个模块,分别是词法分析器、语法分析器、语义分析器和代码生成器。

 

3.词法分析器

1 package compile;
2 
3 public class Cifa {
4   int a;
5   int c = a+1;
6 }      

 

词法分析器的分析结果就是将这个类中的所有关键词匹配到token类的所有项中的任何一项。上述代码的匹配结果如下图

4.语法分析器 

词法分析器的作用是将Java源文件的字符流转变成对应的Token流,而语法分析器是将Token流组建成更加结构化的语法树,也就是将一个个单词组装成一句话。

 1 public class Yufa{
 2   int a;
 3   private int c =a +1;
 4   
 5   public int getC(){
 6       return c;
 7   }
 8 
 9   public void setC(int c){
10      this.c = c;
11   }
12 }

这段代码对应的语法树

5.语义分析器

经过语法分析器生成的语法树过于粗糙,此时需要在这颗语法树的基础上再做一些处理,比如给类添加构造函数、检查变量在使用前是否初始化、将一些常量进行合并处理,检查操作变量类型是否匹配,检查所有的操作语句是否可达,检查checked exception异常是否已经捕获或抛出,接触Java语法糖(泛型,装拆包),去除一些永不为真的条件判断,内部类会被分离出去但是持有一个外部类的引用

 

6.代码生成器

将Java方法中的代码块转化成符合JVM语法的命令形式,JVM的操作都是基于栈的,所有的操作都必须经过出栈和进栈来完成。

按照JVM的文件组织格式将字节码输出到以class为扩展名的文件中

 

 

 

 

 

 

 

以上是关于Javac 编译原理的主要内容,如果未能解决你的问题,请参考以下文章

Javac编译原理

深入分析 Javac 编译原理

Question20180104 对比编译器解释器与Javac编译原理

Knowledge Point 20180303 对比编译器解释器与Javac编译原理

javac实现原理

javac 编译与 JIT 编译