Java虚拟机——从Java源码到字节码到底经历了什么

javac编译器将Java源码编译成字节码主要会经历4个步骤:

词法解析 ➙ 语法解析 ➙ 语义分析 ➙ 生成字节码


词法解析:

词法解析要做的事情就是将Java源码中的关键字和标识符等内容转换为符合Java语法规范的Token序列,然后按照指定的顺序规则进行匹配校验。

那什么是符合Java语法规范的Token序列?Token序列是一组枚举类型的常量,符合Java语法规范并与源码字符集合相对应。

源码字符集合是如何转换成Token的?在转换之前,先会将每一个字符集合都转换为一个对应的Name对象,然后会将Token中的所有枚举常量全部转换为Name对象并存储在Name对象内部类Table中,这样就建立起了源码字符集和Token之间的关系。

将源码字符集合转换成Token后,词法解析器又是采用什么方式保存?源码字符集和Token之间的对应关系是保存在Keywords类中的数组key中。

校验Token的匹配规则,这也是词法解析的核心。按照Token的匹配规则依次解析出package、import关键字声明,这些Token都匹配成功后开始解析class主体信息。

 

语法解析:

语法解析就是将匹配后的Token序列整合为一颗结构化的抽象语法树。

其实词法解析中对Token的匹配规则的解析校验和语法解析是同时在一个方法下完成的,当词法解析完成某个关键字的转换,匹配成功后就会根据这个Token对应的Name对象解析出相应的语法节点。语法解析按照Token序列指定的顺序规则依次用不同的方法解析出package语法节点、import语法树点以及class语法树。最终将package语法节点、import语法树点和class语法树等内容信息全部整合到一颗语法树。

到此可以说编译器在生成字节码之前,编译雏形已经成功构建好了。但是毕竟只是雏形,语法解析后的这颗结构化抽象语法树是不完善的,还不能直接进入字节码编译阶段。

 

语义分析:

语义分析就是为了完善之前语法解析后产生的那颗语法树。

语义分析主要做以下一些工作:

  • 为没有构造方法的类型添加默认无参构造方法

  • 检查任何类型的变量在使用前是否都已经初始化

  • 检查变量类型是否与值匹配

  • 将String类型的常量进行合并处理

  • 检查代码中的所有操作语句是否可达

  • 异常检查

经历这一系列语义分析步骤之后就构成了一个扩充后的完善的语法树。

 

生成字节码:

调用相关方法将最终的这颗语法树编译为符合Java虚拟机规范的字节码文件。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值