java虚拟机笔记(九)前端编译器和后端编译器

前端编译器:
将java文件编译成class文件的编译器。
java很多提高效率和友好度的语法糖都是依赖前端编译器实现的。
javac就是一个典型的前端编译器。
执行过程如下:
1.准备阶段:
初始化插入式注解处理器
2.解析与填充符号表阶段:
词法 语法分析,将源代码转变为标记集合,构建抽象语法树
填充符号表,产生符号地址和符号信息。
3.插入式注解处理器的执行阶段:
会影响javac的行为,比如说添加一些编译期的校验等。
4. 分析与字节码的生成:
检查静态信息,数据流检查,解语法糖,字节码生成

词法解析:
将源代码的字符流转为标记(token)集合的过程,token是编译时的最小单位,关键字 变量名 运算符等都可以作为标记。

语法分析:
根据标记序列构造抽象语法树,抽象语法树是一种描述程序代码语法结构的树形表示,树的每一个节点代表程序代码中的一个语法结构,比如说
包,类型,修饰符,运算符等。

生成语法树之后,后续的操作都是对语法树进行操作。

填充符号表:
符号表是一组符号地址和符号信息构成的数据结构,当对符号名进行地址分配时,符号表是地址分配的直接依据。

注解处理器:
jdk5 时候提出了注解,原本设计上和普通java代码一样, 是程序运行期间发挥作用。但是在jdk6之后,设计了一组 插入式注解处理器的api,
可以提前至编译期对代码中的特定注解进行处理,当这些插件工作时,允许读取修改 添加抽象语法树中的任意元素。
如果插入式注解处理器对语法树进行过修改,那么编译器就会重新回到解析以及填充符号表的阶段。
比如说lombok的实现原理,就是通过插入式注解处理器来在编译期对特定的注解处理,生成get set方法等。

语义分析与字节码生成
抽象语法树能表示一个结构正确的代码,但是无法保证代码是符合逻辑的。
语义分析则是对结构上正确的程序进行检查,比如说类型检查,控制流检查,数据流检查。
比如说 int a=1; bool b=true; char c=a+b; 这种 ,就可以在语义分阶段被检查出来,
在IDE上看到报红下划线的错误,就是语义分析得出来的结果。

检查主要有:
1.标注检查
检查类型是否匹配,变量使用前是否声明等
2.数据和控制流分析
检查局部变量使用前是否赋值
方法的每条路径是否都有返回值
所有必检异常是否都被处理了

解语法糖:
语法糖,在计算机语言中添加某种语法,对编译和功能没影响,但是更方便程序员使用该语言。
java常见的语法糖有泛型,变长参数,自动装箱拆箱,等等,java虚拟机其实并不支持这些语法,这些语法会在编译期被还原回原始的样子。
泛型 obejct ,变长参数 数组参数, 自动装箱 拆箱 integer.valueof() 等

字节码生成;
将之前步骤所生成的信息,语法树 符号表等 转化成字节码指令。
除此之外,添加实例构造器()方法和 ()方法,这个动作是将{}里面的代码块都收集起来 放到()方法里面
或者将static{} 里面的代码都收集汇集到一起 放到()方法里面去。

java语法糖

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值