java编译器源码解析-语义分析-生成字节码

生成字节码的逻辑大部分都在com.sun.tools.javac.jvm包中,核心对应Gen类,

 

 

但具体内容在ClassWriter.writeClass()完成.其中ClassWriter.writeClassFile()负责输出字节码。

要从AST生成字节码了,那么还需要完成一次转换,就是把AST的节点转换成可操作的实体Item。

com.sun.tools.javac.jvm.Items.Item还有很多子类,分别对应的是字节码可操作的实体,比如本地变量、字面量、方法、表达式等,

每个Item都支持一套标准的操作,能帮助生成字节码,最常用的方法load()、store()、invoke()、coerce()

load():生成把当前Item加载到栈的字节码
store():生成从栈顶保存到该 Item 的字节码
invoke():生成调用该Item对应的方法的字节码。
coerce():强制类型转换。

 

 

 

另外需要注意的是com.sun.tools.javac.jvm.Code类,它里面存放了生成各种字节码的指令的方法emitXXX(),所有jvm虚拟机的指令都能在这里找到。 com.sun.tools.javac.jvm.ClassWriter负责输出字节码

最后生成的字节码保存在 MethodSymbol 的 code 属性中。

posted @ 2022-04-15 15:16  Mars.wang  阅读(166)  评论(0编辑  收藏  举报