java编译过程

摘自:深入理解JVM虚拟机

A、解析与填充符号表

B、注解处理

C、分析与字节码生成


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

1、词法、语法分析

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

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

2、填充符号表

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

B、注解处理

C、分析与字节码生成

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

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

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

2、数据及控制流分析

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

3、解语法糖

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

4、字节码生成

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

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

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


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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值