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