Javac工作原理分析(4):代码生成器

经过语义分析器后的语法树已经非常完善了,接下来就是要遍历语法树生成最终的Java字节码,分为以下两个步骤:
1)将java方法中的代码块转化成符合JVM语法的命令形式,JVM的操作都是基于栈的,所有的操作都必须经过出栈和进栈来完成
2)按照JVM的文件组织形式将字节码输出到以class为扩展名的文件中
这个操作主要涉及到com.sun.tools.javac.jvm包三个类:
Gen:遍历语法树
Items:表示任何可寻址的操作项,包括本地变量、类实例变量或者常量池中用户自定义的常量等,这些操作项都可以作为一个单位出现在操作栈中
Code:存储生成的字节码,并提供一些能够映射操作码的方法
代码分析
来看一下这段代码的字节码生成过程:

public int add(int a, int b) {
    return a + b;
}

需要两个栈,一个是操作数栈,一个是操作符栈:遍历a + b对应的语法树,将”a”入操作数栈,”+”入操作符栈,”b”入操作数栈,然后弹出”+”操作符,计算a+b,将结果至于操作数栈栈顶。其实a+b变成字节后是一个逆波兰式(后缀表达式):ab+。下面再看一个转换:(a + b) * c——>ab+c*
操作栈上所有的操作单元都是Item对象,Gen.genExpr方法就是将代码中的每个元素转换成Item对象,在调用Item.load方法就可以将Item载入栈中了,不同的Item对应不同JVM操作码,如int类型的常数1放入操作栈中的JVM操作码iconst_1,float类型的常数1放入操作栈中的JVM操作码fconst_1。
Gen会遍历整棵语法树,最终生成JVM操作码序列结合,放到class文件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值