【学习笔记】深入理解Java虚拟机学习笔记——第10章 前端编译与优化
第10章 前端编译与优化
10.1 概述
1>前端编译器:Javac命令。 【.java文件->.class文件】
2>即时编译器:Hotspot.C1.C2 【.class文件->机器码】
3>提前编译器:JDK的Jaotc等【.java->机器码】
10.2 Javac 编译器
10.2.1 Javac的源码与调试
1>初始化插入式注解处理器
2>解析与填充符号表过程
3>插入式注解处理器,注解处理过程
4>分析与字节码生成
10.2.2 解析与填充符号表
1>词法分析、语法分析
词法:字符流=>标记
语法:标记=>抽象语法树
2>填充符号表
登记信息
10.2.3 注解处理器
lombook通过注解处理器影响了编译器的结果,在字节码中生成了代码
10.2.4 语义分析与字节码生成
1>标注检查
检查变量使用前是否已声明、数据类型匹配等
2>数据及控制流分析
局部变量赋值、方法路径等检查
3>解语法糖
方便于程序员开发的语法,如:泛型、自动装箱等都由在编译期还原为原始基础语法结构
10.3 Java语法糖的味道
10.3.1 泛型
1>Java与C#的泛型
Java:擦除式,字节码中会替换为裸类型,不可进行类型判断、创建对象及数组
c#:具现化式
2>泛型的历史背景
Java向后二进制兼容:JDK1.2的字节码能运行在1.2之后的全部JVM上
3>类型擦除
缺陷:
1.强制类型转换
2.无法使用原生类型作为泛型,不断装、开箱
3.无法获得泛型类型
List< String>与List< Integer>对于JVM来说是相同的
4>值类型与未来的泛型
略
10.3.2 自动装箱、拆箱、与遍历循环
略
10.3.3 条件编译
条件编译只能在if(常量)下成立,会自动消除无法达到的语句。
10.4 实战:插入式注解处理器
10.4.1 实战目标
略
10.4.2 代码实现
可以通过AbstractProcessor相关API,对抽象语法树进行修改,以重新生成词、语法并生成字节码