java自举_JAVA编译器学习之一

这篇博客深入探讨了JAVA的编译过程,分为编译前期和后期。前期由javac或ECJ完成,将.java文件转化为.class字节码文件,包括词法分析、语法分析、符号表输入和注解处理等步骤。后期涉及JIT或AOT编译器,将字节码转为机器码。文章详细阐述了javac的编译流程,从源码解析到生成字节码的每个阶段,揭示了JAVA编译的内在机制。
摘要由CSDN通过智能技术生成

JAVA编译期一般被分为两大部分:编译前期 和 编译后期

编译早期是指把符合JLS的*.java的文件转变成符合JVMS的*.class文件的过程,这一过程由前端编译器完成(如Sun/Oracle的javac,Eclipse JDT中的增量编译器ECJ);

编译晚期则主要指JIT编译器(把字节码转变成机器码的过程)或AOT编译器(直接把*.java文件编译成本地代码)。

===============================================

Javac(java complier),是一种以自举方式实现的编译器,通过自举实现了从.java源文件到.class字节码文件的编译。但是确切来说,只是完成了java部分的编译(Bootstrap),

所以不能完全认为是完成了java自举编译,除非结合纯java编写的后端编译器/JVM。

Javac的编译过程大致如下图所示:

ad3255c515fcab4805a7998f74203586.png

19bf61f9eb818d4495f477e00bd36db6.gif

Javac的编译动作入口即为com.sun.tools.javac.main.JavaComplier类,以下是官方注释:

/**This class could be the main entry point for GJC when GJC is used as a

* component in a larger software system. It provides operations to

* construct a new compiler, and to run a new compiler on a set of source

* files.

* ......*/

整个前端编译任务(即上图Javac编译的三个步骤)主要通过该类中的compiler()和compiler2()实现。

具体有如下几个步骤:

准备过程:初始化插入式注解处理器;

initProcessAnnotations(processors);

一、词法分析、语法分析(Parse);

parseFiles(sourceFileObjects)

二、输入至符号(Enter);

enterTrees(stopIfError(CompileState.PARSE, parseFiles(sourceFileObjects)))

三、注解处理(Annotation Processing);

processAnnotations(

enterTrees(stopIfError(CompileState.PARSE, parseFiles(sourceFileObjects))),

classnames);

四、进行属性标注与检查(Attr or Check)-数据流分析(Flow)-将泛型类型转换为裸类型(TransTypes)-解语法糖(Lower) 操作,并最终生成字节码文件(Gen)。

while (!todo.isEmpty())

generate(desugar(flow(attribute(todo.remove()))));

======================================================

详细说明各个步骤:

词法、语法分析:

这部分分为两个阶段。在词法分析阶段,通过com.sun.tools.javac.parser.Scanner类相关方法将源文件从字符流转化为Token集合。随后

由com.sun.tools.javac.parser.Parser类相关方法将Token序列构造JCTree类型的抽象语法树(AST),随后的操作将建立在此抽象语法树基础上。

其中com.sun.tools.javac.tree.JCTree类是com.sun.source.Tree类的实现。

输入至符号表:

符号表是由一组符号地址和符号信息构成的表格,可以是有序符号表、树状符号表、栈结构符号表等。

(未完待续)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值