摘自:深入理解JVM虚拟机

A、解析与填充符号表

B、注解处理

C、分析与字节码生成


A、解析与填充符号表(parseFiles):

1、词法、语法分析

词法分析:将源代码的字符流转化为标记集合(Token),单个字符是程序编写过程的最小元素,而标记则是编译过程的最小元素,关键字、变量名、字面量、运算符都可以成为标记

语法分析:根据Token序列构造抽象语法树的过程

2、填充符号表

完成语法分析和词法分析后,就是填充符号表的过程。符号表是由符号地址和符号信息组成的表格

B、注解处理

C、分析与字节码生成

语法树能确保一个结构正确的源程序抽象,但无法保证源程序是符合逻辑的。

1、语义分析过程分为标注检查以及数据集控制流分析。

标注检查:变量使用前是否声明、变量与赋值之间的数据类型是否能够匹配、常量重叠

2、数据及控制流分析

程序局部变量在使用前是否有赋值、方法的每条路径是否都有返回值、是否所有的受查异常都被正确处理

3、解语法糖

泛型、变长参数、自动装箱/拆箱

4、字节码生成

将上几步中生成的信息(语法树、符号表)转化成字节码写到磁盘中,还进行少量的代码添加和转换工作

比如实例构造器<init>()方法和类构造器<clinit>()方法就是在这个阶段被添加到语法树中的。

这两个构造器的产生过程实际上是一个代码收敛的过程,编译器会把语句块(对于实例构造器而言是{}块,对于类构造器而言是static{}块)、变量初始化(实例变量和类变量)、调用父类的实例构造器等操作收敛到<init>()和<clinit>()方法中,并且保证顺序是:父类的实例构造器、然后初始化变量、执行语句块的顺序行


完成了对语法树的遍历和调整之后,就会把填充了所有所需信息的符号表交给ClassWriter类,由这个类writeClass()方法输出方法码,最终生成的class文件,到此为止,整个编译过程宣告结束。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐