您的位置:首页 > 编程语言 > Java开发

Javac编译原理(基础理论知识)

2018-01-22 16:17 495 查看
Javac编译原理


1. javac编译器的基本结构



javac的各个模块就是完成了将java源代码转变成java字节码的任务,所以javac主要就有四大模块,分别是词法分析器、语法分析器、语义分析器和代码生成器。

2.Javac工作原理分析

1. 词法分析器

javac的主要词法分析器的接口类是com.sun.tools.javac.parser.Lexer,它的默认实现类是com.sun.tools.javac.parser.Scanner,Scanner会逐个读取java源代码的单个字符,然后解析出符合java语言规范的Token序列.

简而言之,词法分析器的作用就是将Java源文件的字符流转变成对应的Token流。

2. 语法分析器

语法分析器是将词法分析器分析的Token流组建成更加结构化的语法树,也就是将一个个单词组装成一句话,一个完整的语句。哪些词语组合在一起是主语、哪些是谓语、哪些是宾语、哪些是定语等,要做进一步的区分。

关于语法分析器还有一点要说明的是,所有语法节点的生成都是在TreeMarker类中完成的,TreeMaker实现了JCTree.Factory接口中定义的所有节点的构造方法,从该类中你也能够发现Java中到底有多少种语法节点。

3. 语义分析器

将复杂的语法转换成简单的语法(eg.注解、foreach转化为for循环、去掉永不会用到的代码块)并做一些检查,添加一些代码(默认构造器)

4. 代码生成器

经过语义分析器完成后的语法树已经非常完善了,接下来Javac会调用com.sun.tools.javac.jvm.Gen类遍历语法树生成最终的Java字节码.

生成Java字节码需要经过两个步骤:

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

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

3.设计模式解析之访问者模式

前面介绍的词法分析、语法分析器、语义分析器和代码生成器中有多次遍历语法树的过程。然而每次遍历这颗语法树都会进行不用的处理动作,对这颗语法树也要进行进一步的处理。那么这是如何实现的呢?这实际上就是采用访问者模式设计的,每次遍历都是依次访问者的执行过程。

至于设计结构啥的,一些细节,可以参考相关文章和百度,这里不做文字说明,只是标注有这个东西而已。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: