Java虚拟机规范和Java规范是不一样的,他们都有自己的词法和语法解析规则。所以javac要将Java语言规范解析成Java虚拟机的语法规范,Javac作为‘翻译‘’。
Javac是什么?
机器能够识别和运行的都是机器码,但人去写机器码的话太困难,太不友好、所以人们通过编译器将高级语言转换成目标机器码。
javac编辑器就是将Java语言编译成jvm所能识别的语言,最后jvm将jvm语言转换成当前机器能够识别的语言。
这种转换虽然比其他语言多了一层步骤,牺牲了一些执行步骤,但是却拥有了平台无关性。
在Java编译原理中,将会了解到Javac的语法树结构、Javac的工作流程(包括词法分析、语法分析、符号表构建、annotation处理、标注和语法检查、数据流分析、类型转换、语法等)、java如何实现内部类、如何实行对异常的处理、javac与其他编译器的对比。
Javac将java语言转换到jvm语言需要经过以下几个步骤:
1、词法分析
2、语法分析
3、语义分析
4、代码生成
要读取源代码,就需要一个单词一个单词地读取,从中找出规范的token流,就像人类语言一样,要能识别出哪些是标点符号,哪些是动词,哪些是名次。
语法分析检查单词之前的组合是否符合Java规范,比如if后面是否接了布尔判断表达式,就像人类语言中主谓宾的组合是不是能够理解的。
语法分析形成一个符合Java语言规范的抽象语法树,抽象语法树是一个结构化的语法表达形式,它的作用是把语法的主要词法用一个结构化的形式来组织起来。
语义分析将复杂的语法解析成简单的语法,比如将foreach转为for,注解转为代码。
最后,通过字节码生成器生成字节码,将会根据经过注解的抽象语法树生成字节码,也就是将一个数据结构转为另一个数据结构。