相当多新生的java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖虚拟机的底层改进来支持,java中即时编译器地运行期的优化过程对于程序运行来说更重要,而前端编译器在编译期的优化过程对于程序编码来说关系更加密切。
Javac编译器
编译过程大致可以分为3个过程,分别是解析与填充符号表过程,插入式注解处理器的注解处理过程,分析与字节码生成过程。其步骤之间的关系与交互顺序如图所示:
解析与填充符号表
解析步骤包括词法分析和语法分析两个过程。词法分析是将源代码的字符流转变为标记(Token)集合;语法分析是根据Token序列构造抽象语法树的过程。
符号表是由一组符号地址和符号信息构成的表格。
语义分析与字节码生成
语义分析的主要任务是对结构上正确的源程序进行上下文有关性质的审查。语义分析过程分为标注检查以及数据及控制流分析两个步骤。标注检查步骤检查的内容包括变量使用前是否已被声明、变量与赋值之间的数据类型是否能够匹配等。数据及控制流分析是对程序上下文逻辑更进一步的验证,可检查出诸如程序局部变量是使用前是否有赋值、方法的每条路径是否都有返回值、是否所有的受查异常都被正确处理了等。编译时期的数据及控制流分析与类加载时的数据及控制流分析的目的基本上是一致的,但检验范围有所区别,有一些校验项只有在编译期或运行期才能进行的。
字节码生成是java编译过程的最后一个阶段。字节码生成阶段不仅仅是把前面各个步骤所生成的信息转化成字节码写到磁盘中,编译器还进行了少量的代码添加和转换工作。
Java语法糖
语法糖虽然不会提供实质性的功能改进,但是它们或能提高效率,或能提升语法的严谨性,或能减少编码出错的机会。
泛型与类型擦除,自动装箱、拆箱与遍历循环,条件编译。