java虚拟机中javac编译器编译的三个过程

java虚拟机中java编译器编译的三个过程

一 解析与填充符号表

1.词法分析:将源代码的字符流转变为标记token集合。单个字符是编写过程的最小元素,而标记则是编译过程的最小元素。

例如:int a=b+2 这样就会生成6个标记。int,a,=,b,+,2

2.语法分析:根据token序列构造抽象语法树的过程。抽象语法树是一种用来描述程序代码语法结构的树形表达形式,语法树的每一个节点都代表着程序代码中的一个语法结构。

3.填充符号表:符号表是由一组符号地址和符号信息构成的表格。符号表中所登记的信息,在编译的不同阶段都会用到。在语义分析中,用于语义检查和产生中间代码。在目标代码生成阶段,当堆符号名进行地址分配的时候,符号表是地址分配的依据。

二注解处理器

1.可以把它看成一个插件,在这个插件里面,可以读取,修改,添加语法树中的任意元素。

2.如果在注解期间有所更改,编译器则会回到解析及填充符号表重新处理,直到所有插入式注解器没有对语法树更为止。

三语义分析与字节码生成

语法树能够保证结构正确,但不能保证逻辑正确。

1.标注检查:变量使用前是否已经声明?变量与赋值之间的数据类型是否能够匹配?在这里还会进行常量折叠 ,比如int a=1+2在这里1+2直接会在语法树中折叠为字面量3

2.数据及控制流分析:对程序的上下文逻辑的进一步验证。局部变量在使用前是否有赋值?方法的每条路径是否都有返回值?是否所有的受查异常都能被正确处理?

3.解语法糖:指计算机语言中添加某种语法,对功能没有影响,但方便程序员的使用。

4.字节码的生成:把前面生成的信息转化为字节码写入到磁盘当中。另外还有少量的代码添加和替换工作。比如,实例构造器和类构造器就是在这个阶段添加到语法树当中的。又比如,代码替换主要是为了优化,字符串的加操作会替换为stringbuilder的append操作。

发布了415 篇原创文章 · 获赞 434 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_41901915/article/details/103631327
今日推荐