早期(编译期)优化(一)----编译过程

编译过程大致分为三个过程:

    解析与填充符号表过程

    插入式注解处理器的注解处理过程

    分析与字节码生成过程

下面详细说明这三个过程的主要内容

1.解析与填充符号表过程

    1.1解析

    包括词法分析和语法分析,

    词法分析是将源代码的字符流转变为标记(Token)集合。单个字符是程序编写过程的最小元素,而标记则是编译过程的最小元素,关键字、变量名、字面量、运算符都可以称为标记,“int a = b + 2”这句代码包含了int、a、=、b、+、2六个标记。

    语法分析是根据Token序列来构造抽象语法树的过程,抽象语法树(AST,Abstract Syntax Tree)是一种用来描述程序代码语法结构的树形表示方式。语法树能表示一个结构正确的源程序的抽象。

经过语法分析产生了AST之后,编译器基本不会再对源码文件进行操作,后续操作都建立在AST之上。

    1.2填充符号表

符号表(Symbol Table)是由一组符号地址和符号信息构成的表格。类似哈希表的K-V值对。

2、注解处理器

注解与普通的java代码一样,是在运行期间发挥作用的。JDK 1.6提供了插入式注解处理器的标准API在编译期间对注解进行处理,这些API类似插件,它们可以读取、修改、添加抽象语法树中的任意元素。如果这些插件在处理注解期间对语法树进行了修改,那么编译器将回到解析及符号填充表的过程重新处理,直到所有的插入式注解处理器都没有再对语法树进行修改为止,每一次循环称为一个Round。

我们可以通过Javac命令的“-processor”参数来执行编译时需要附带的注解处理器。如果有多个注解处理器的话,用逗号分隔。还可以使用-XprintRounds-XprintProcessorInfo参数来查看注解处理器运作的详细信息。

    例:

    javac zhujieA.java   //编译处理器zhujieA

    javac zhujieB.java //编译处理器zhujieB

    javac -processor zhujieA,zhujieB  beizhujie.java //对beizhujie.java文件,运行注解处理器zhujieA,zhujieB

3、语义分析与字节码生成

语义分析的主要任务是对结构上正确的源程序进行上下文有关性质的审查。语义分析过程分为标注检查、数据及控制流分析两个步骤。

    3.1标注检查

包括变量使用前是否已被声明,变量与赋值之间的数据类型是否能够匹配,等。还有一个重要的步骤是常量折叠。例代码中定义“int a = 1+ 2;”语法树上仍然能看到字面量“1”、“2”和操作符“+”号,但是经过常量折叠,他们将会被折叠为字面量“3”。由于编译期间进行了常量折叠,所以并不会增加程序运行期间CPU指令的运算量。

    3.2数据及控制流分析

数据及控制流分析是对程序上下文逻辑进一步的的验证,他可以检查出局部变量在使用之前是否有赋值、方法的每条路径是否都有返回值、是否所有的受查异常都被正确处理了等问题。

    3.3解语法糖(SyntacticSugar

语法糖指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。语法糖或能提高效率,或能提升语法的严谨性,或能减少编码出错的机会。虚拟机不支持这些语法,他们在编译阶段被还原回简单的基础语法结构,这个过程被称为解语法糖。Java中最常用的语法糖有自动装箱拆箱、变长参数、泛型等。泛型思想是用于提升语义准确性,与性能无关。

    3.4字节码生成

字节码生成阶段不仅把前面各个阶段所生成的信息(语法树、符号表)转化成字节码写到磁盘中,编译器还进行了少量的代码添加和转换工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值