虚拟机(十二).编译器的编译过程(一)

实现从代码变成字节码的过程

1.编译器编译过程:

        (1).解析以及填充符号表

        (2).插入式注解处理器的处理

        (3).语义分析,解语法糖以及生成字节码

 

2.解析以及填充符号表

        (1).解析 = 词法解析 + 语法解析

            1).词法解析:将字符流变成标记集合

            ==>字符流是程序编码的基本单位,标记是编译过程的基本单位

            2).语法解析:将标记序列转化成抽象语法树

            ==>抽象语法树是语法结构的树的表现形式

            ==>语法解析之后,编译器不会再对源代码有操作,所有的操作都是基于抽象语法树

        (2).填充符号表

            1).符号表 = 一系列的符号地址 + 一系列的符号信息

            2).符号表在后面的编译过程中会用到

            ==>在语义分析时,符号表用于语义检查和生成中间代码

            ==>在生成字节码时,当对符号名进行地址分配时,符号表是地址分配的依据

 

3.插入式注解处理器的处理

        可以将插入式注解处理器认为是编译阶段的一个插件,通过这个插件可以对抽象语法树进行查询、增加、修改。

        注:只要对抽象语法树进行了操作,就需要重新走一遍解析及填充符号表的过程

 

4.语义分析,解语法糖以及生成字节码

    上述只是从语法层面保证代码正确,但是逻辑层面不能保证。下面操作一定程度上进行上下文有关性质审查。

        (1).语义分析 = 标注检查 + 数据及控制流分析

            1).标注检查

            检查变量是否声明,变量和赋值的数据类型是否一致,常量折叠

            2).数据及控制流分析

            检查变量初始化,检查方法的每条路径是否有返回值,检查审查异常是否都被解决

        (2).解语法糖

            ==>语法糖:对语义没有任何影响,但是有助于开发人员理解的一些写法

            1).泛型==>类型擦除

            2).自动装箱拆箱==>转化成对应的包装和还原方法

            3).变长参数==>数组

            4).循环遍历==>迭代器

            5).条件判断==>没走的那一部分就被擦除了

        (3).生成字节码

            1).将前面的所有操作都落地成字节码保存到磁盘

            2).进行一定程度的代码转换和添加

            ==>将语句块,变量初始化,创建父类构造器收敛到实例构造器和类构造器。保证先执行父类构造器,再执行初始化常量,再执行语句块

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏哥哥啊Aaaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值