1、javac是什么?
javac是一种编译器,能够将一种语言规范转换成另一种语言规范。
通常编译器都是将便于人理解的语言规范转化成机器容易理解的语言规范。
javac的任务是将java源代码先转化成JVM能够识别的语言,然后由JVM将JVM语言转换成当前机器可以识别的语言。
Java语言向开发者屏蔽了很多与目标机器相关的细节,使得java语言的执行和平台无关,同时也成就了java语言的繁荣。
Javac的任务是将 java 源码编译成 java 字节码,也就是JVM能够识别的二进制码。
表面上看,就是将.java文件转换成.class文件,实际上是将java源码转换成一连串的二进制数字,这些二进制数字是有格式的,只有JVM能正确识别它们表达的意思。
2、Javac编译器工作步骤和基本结构
step1、读取源代码,一个字节一个字节的读进来,找出这些字节中哪些是我们定义的语法关键词,如java中 if、else、for等关键词;识别哪些if是合法的关键词,哪些不是,这个步骤就是 词法分析过程。
注: 词法分析的结果就是从源代码中找出一些规范化的Token流,就像人类语言中,给出一句话就能找出哪些是词语,哪些是标点,哪些是动词,哪些是名词等。
step2、对这些Token流进行 语法分析,这一步就是检查这些关键字组合在一起是否符合java语言规范, 如在if后面是不是跟着一个布尔判断表达式,就像人类语言中是不是有主谓宾,主谓宾结合的是否正确,语法是否正确。 语法分析结果就是形成一个符合java语言规范的抽象语法树。
语法树是一个结构化的语法表达形式,其作用就是把语言的主要语法用一个结构化的形式组织在一起,就像大学中学的离散数学,用数字的形式来表达非数字但又有复杂关系的物质世界。这颗语法树可以在后续步骤按照新的规则再次重新组织,这也是编译器的关键所在。
step3、接下来是 语义分析 ,上一步骤语法分析已经完成,也就是不存在语法问题,但是语义不一定正确。语义分析工作主要是把一些难懂的、复杂的语法转化成更加简单的语法。这个步骤对应到人类语言中,就是把难懂的文言文转化成便于理解的白话文,或者注解一下一些成语,编译更好的理解。
语义分析的结果就是将复杂的语法转化成简单的语法。对应到java中,如将foreach转成for循环结构,还有注解等,最后形成一个注解后的抽象语法树,这颗语法树更接近目标语言的语法规则。
step4、最后一步,通过字节码生成器生成字节码,根据经过注解的抽象语法树生产字节码,也就是一个数据结构转化为另一个数据结构, 就像将所有中文词语翻译成英文单词后,按照英文语法组装成英文语句。代码生成器的结果就是生成符合java虚拟机规范的字节码。