JDK—编译

1、编译分类:

    1)前端编译器:将java文件编译成.calss文件;

    2)JIT 编译器:将字节码转换成机器码(java团队将优化主要集中在这个过程中,兼容性好,屏蔽不同语言区别);

    3)  AOT 编译器:将java文件直接转换成机器码文件的过程;

2、javac 源码调试

3、编译的三个过程

(1)解析与填充符号表的过程;

        1)词法、语法分析

           词法分析: 将字符流转换成标记(token)集合;字符是程序编写的最小元素,集合是编译过程中的最小元素(关键字、变量名、字面量、运算符等);

        语法分析:生成抽象语法树;每一个树节点代表一个程序代码中的一个语法结构(包、类型、修饰符、运算符、接口、返回值、注释等);

此过程之后,编译器的操作都建立在这个语法树上;

        2)填充符号表:

        enterTrees ()方法中实现 符号地址和符号信息构成;

(2)插入式注解处理器处理过程

(3)分析与字节码生成;

        1)标注检查

            检查变量是否已被声明、变量与赋值之间类型是否匹配等;

            特例:常量折叠( int a = 1+2 与 int a =3 执行效率等效)

        2)数据及控制流检查

           检查局部变量使用前是否赋值、方法的每条路径是否都有返回值,是否所有的受查异常都被处理等;编译时期的数据及控制流分析与类加载控制流分析目的基本一致;

        3)解语法糖

                语法糖也成为糖衣语法;java 相对于其他语言(C#)是低糖语言;

                 java 中最常用的语法糖是泛型,变长参数、自动拆装箱、for-each等;而虚拟机是不支持这些语法,所以在编译阶段这些代码被还原成简单的基础语法结构;

        4)字节码生成

            由com.sun.tools.javac.jvm.Gen 类完成,字节码生成阶段不仅仅是把前面各个步骤所生成的信息(语法树、符号表)转化成字节码写到磁盘中;

4、泛型:

    (1)泛型与类型擦除

    (2)自动装箱、自动拆箱、遍历

    (3)条件编译

5、插入式注解处理器

 

参考:周志明《深入理解 java 虚拟机》

 

转载于:https://my.oschina.net/u/4032854/blog/3023502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值