我们都知道,计算机只能识别二进制语言,是不能直接识别java c c++等高级语言的。将高级语言转化成计算机可以是别的二进制语言,这个过程就叫编译。
有次面试,面试官问了一道“java的编译原理是什么”,当时给懵了,只知道是把java文件转换成class文件,然后由jvm执行,具体流程就不知道了。今天看了许令波编著的《深入分析java web技术内幕》一书,其中有一章讲的就是javac的编译原理,看了一遍,感觉有点云里雾里,不是很明白,接下还得多看看几遍,多上网查查资料深入透彻的学习一下。
今天先将javac编译的整体流程总结一下,然后再仔细分析学习各个流程的细节。
编译器是将源码编译成目标机器码,即计算机可以识别的二级制码,也即cpu执行的指令集合。而javac编译器和c c++ 汇编语言等不太一样的地方,是javac是将java这种高级语言编译成java虚拟机(Jvm)能够识别的一种语言,然后再由jvm将jvm语言转换当前机器能够识别的机器语言,这就是java可以跨平台的最根本原因。javac的任务是将java源码编译成java字节码,也是通常说的将.java文件转化成.class文件。
javac编译的基本流程:
1、词法分析
读取源代码,一个字节一个字节的读取,找出其中我们定义好的关键字(如java中的if else for等关键字,识别哪些if是合法的关键字,哪些不是),这就是词法分析器进行词法分析的过程,其结果是从源代码中找出规范化的Token流。
2、语法分析
通过语法分析器对词法分析后Token流进行语法分析,这一步检查这些关键字组合再一次是否符合java语言规范(如在if后面是不是紧跟着一个布尔判断表达式),词法分析的结果是形成一个符合java语言规范的抽象语法树。
3、语义分析
通过语义分析器进行语义分析。语音分析主要是将一些难懂的、复杂的语法转化成更加简单的语法,结果形成最简单的语法(如将foreach转换成for循环 ,注解等),最后形成一个注解过后的抽象语法树,这个语法树更为接近目标语言的语法规则。
4、生成字节码
通过字节码生产器将经过注解的抽象语法树转化成符合jvm规范的字节码。
javac的主要模块有4个,分别是词法分析器、语法分析器、语义分析器、代码生成器。