Java程序员编写的程序
进入Javac编译器
前端编译器:把*.java文件转变成*.class文件的过程;
编译期优化:降低程序员的编码复杂度、提高编码效率。
编译过程大致分为一个准备过程和三个处理过程:
1.准备过程:
初始化插入式注解处理器。
2.解析与填充符号表过程,包括:
词法、语法分析。将源代码的字符流转变为标记集合,构造出抽象语法树。
词法分析是将源代码的字符流转变成标记集合的过程,单个字符是程序编写时的最小单位,但标记才是编译时的最小元素。
语法分析是根据标记序列构造抽象语法树的过程。(抽象语法树是一种用来描述程序代码语法结构的树形表示方式)
填充符号表。产生符号地址和符号信息。
符号表是由一组符号地址和符号信息构成的数据结构。
3.插入式注解处理器的注解处理过程:
插入式注解处理过器的执行阶段。
4.分析与字节码生成过程:
标注检查步骤要检查的内容诸如变量使用前是否已被声明,变量与赋值之间的数据类型是否匹配。在标注检查中还会顺便进行一个称为常量折叠的优化。
数据流分析和控制流分析是对程序上下文逻辑的进一步验证,它可以检验出诸如程序局部变量使用前是否有赋值、方法的每条路径是否都用返回值、是否所有的受查异常都被正确处理了等问题(编译期的数据流分析与控制流分析和类加载时的数据流分析与控制流分析的目的可以看作是一致的,但是校验的范围会有所区别)。
解语法糖,语法糖指计算机语言中添加的某种语法,这种语法对语言的编译结果和功能并没有什么实际影响,但是可以方便程序员使用该语言。语法糖可以减少代码量,增加程序的可读性,从而减少程序代码出错的机会。
字节码生成不仅仅是把前面生成的信息写在磁盘中,编译器还会进行少量的代码添加和转换工作。(添加init()和clinit():代码收敛编译器会把语句块(对于实例构造器而言是{}块,对于类构造器而言是static{}),变量初始化(实例变量和类变量),调用父类的实例构造器(仅实例构造器))。
即时编译器:运行期把字节码转变成本地机器码的过程;
运行期优化:支撑了程序执行效率的不断提升。
提前编译器:直接把程序编译成与目标机器指令集相关的二进制代码的过程。