javac编译原理简介

本文详细介绍了javac编译器的七个阶段:parse、enter、process、attr、flow、desugar和generate,涵盖了词法分析、语法分析、符号表生成、注解处理、语义分析、数据流分析、语法糖去除和字节码生成等内容,帮助读者深入理解Java源代码到字节码的转换过程。
摘要由CSDN通过智能技术生成

javac这种将源代码转化为字节码的过程在编译原理上属于前端编译,不涉及相关代码的生成和优化。

JDK中的javac本身是用Java语言编写的,在某种意义上实现javac语言自举。javac没有使用类似的YACC和Lex这样的生成器工具,所有词法分析和语法分析等功能都是自己实现,代码精简高效

通过以下学习,我们可以知道javac编译过程的七个阶段和各阶段作用

1:javac的七个阶段

1 ) parse:读取java源文件,做词法分析(LEXER)和语法分析(PARSER)
2 ) enter: 生成符号表
3 ) process: 处理注解
4) attr: 检查语义合法性、常量折叠
5) flow: 数据流分析
6) desugar:去除语法糖
7 ) generate:生成字节码
接下来我们逐一介绍各项内容。

1.1 第一阶段:parse

parse阶段的主要作用是读取.java源文件并做词法分析和语法分析

词法分析( lexical analyze)将源代码拆分为一个个词法记号(Token),这个过程又被称为扫描( scan),比如代码i=2 +2在词法分析时会被拆分为五部分: i、=、2、+、2。这个过程会将空格、空行、注释等对程序执行没有意义的部分排除。词法分析与我们理解英语的过程类似,比如英语句子“i am studying"在我们大脑中会被拆分为i、am、studying三个单词。

javac中的词法分析由com.sun.tools.javac.parser.Scanner 实现,以语句“intk=i+j;"
Scanner会读取源文件中的内容,将其解析为Java语言的Token序列,这个过程如下图所示。
在这里插入图片描述

词法分析之后是进行语法分析( syntax analying),语法分析是在词法分析的基础上分乐单间之间的关系,将其转换为计算机易于理解的形式,生成抽象语法树( Abttct SyntaxTree,AST)。AST是一个树状结构,树的每个节点都是一个语法单元,抽象语法树是后续的语义分析、语法校验、代码生成的基础。与其他多数语言一样,javac也是使用递归下降法来生成抽象语法树。如下图
在这里插入图片描述

解析CSV,JSON,XML本质也是语法分析和一部分语义分析的过程

1.2 第二阶段:enter

enter阶段的主要作用是解析和填充符号表(symbol table),主要由com.suntools.javac.comp.Enter和com.sun tools javac.comp.MemberEnter类来实现。符号表是由标识符、标识符类型、作用域等信息构成的记录表。在遍历抽象语法树遇到类型、变量、方法定义时,会将它们的信息存储到符号表中,方便后续进行快速查询。

 int x=5;//定义int型字段,初始化为5
 public long add(long a,long b){
   
            return a+b;
        }

javac使用Symbol类来表示符号,每一个符号都包含名称,类别和类型这三个关键属性。如下
name:表示符号名,如上的x,add都是符号名
kind:表示符号类别,上面的x符号类别是Kinds.VAR,表示这是一个变量符号,add的符号类型是Kinds,MTH,表示这是一个方法符号
type:表示符号类型,上面的x的符号类型是int,add方法的符号类型是null

Symbol类是一个抽象类,常见的有VarSymbol,MethodSymbol

Symbol定义了符号是什么,作用域则指定了符号的有效范围,由com.sun tools javac.code.Scope,如下

    public void  test(){
   
        int x=0;
    }
        public void  test1(){
   
        int x=0;
    }

test函数和test1函数都定义了一个名为x的int变量,这两个变量可以独立使用,在超出各自的方法体作用域后就对外不可见,外部也访问不到

注意:enter阶段除了上述生成符号表,还会在类文件中没有默认构造方法的情况下,添加< init >构造方法等

1.3 第三阶段:process

process用来做注解的处理,这个步骤由com.sun.tools.javac processing JavacProcessing-Environment类完成。**从JDK6开始,javac 支持在编译阶段允许用户自定义处理注解,大名鼎鼎的lombok框架就是利用了这个特性,通过注解处理的方式生成目标class 文件,比在运行时反射调用性能明显提升。**会在以后单独进行介绍,这里不再展开。

1.4 第四阶段:attr

attrt 阶段是语义分析的一部分, 主要由com.sun.tools.javac comp.Attrt类实现,这个阶段会做语义合法性检查、常量折叠等,由com.sun.tools.javac.comp 包下的Check、Resolve、ConstFold、Infer 几个类辅助实现。

  • com. sun. tools. javac. comp.Check类的主要作用是检查变量类型、方法返回值类型是否合法,是否有重复的变量、类定义等,比如下面这些场景。
  • </
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值