Javac编译概述

将.java源文件编译成.class文件,这一步大致可以分为3个过程:

1、把所有的源文件解析成语法树,输入到编译器的符号表;

2、注解处理器的注解处理过程;

3、分析语法树并生成字节码。

javac编译过程.png

Parse and Enter

1.词法分析: 通过Scanner将源码的字符流解析成Token流

通过词法分析器分析源文件中的所有字符,将所有的单词或字符都转化成符合规范的Token,规范化的token可以分成一下三种类型:

java关键字:public, static, final, String, int等等;

自定义的名称:包名,类名,方法名和变量名;

运算符或者逻辑运算符等符号:+、-、*、/、&&,|| 等等。

int x=y+1;

这一行代码解析成token流如下:

token流.png

2.语法分析: 根据token流,利用TreeMaker,以JCTree的子类作为语法节点来构建抽象语法树

抽象语法树(Abstract Syntax Tree)是一种用来描述程序代码语法结构的树形表示方式,语法树的每一个节点都代表着程序代码中的一个语法结构, 如包、类型、修饰符、运算符、接口、返回值都可以是一个语法结构。

package com.example.adams.astdemo;

public class TestClass {

int x = 0;

int y = 1;

public int testMethod(){

int z = x + y;

return z;

}

}

对应的抽象语法树如下:

抽象语法树.png

3.将java类中的符号输入到符号表中

符号表是由一组符号地址和符号信息构成的表格;符号表中所登记的信息在编译的不同阶段都要用到,在语法分析中, 符号表所登记的内容将用于语义检查和产生中间代码。在目标代码生成阶段, 符号表是当对符号名进行地址分配时的依据。

将所有类中出现的符号输入到类自身的符号表中,所有类符号、类的参数类型符号(泛型参数类型)、超类符号和继承的接口类型符号等都存储到一个未处理的列表(To Do List)中;

将这个未处理的列表中所有的类都解析到各自的类符号列表中,这个操作是在MemberEnter.complete()中完成(默认构造器也是在这里完成的)。

Annotation Processing

在JDK 1.5之后,Java语言提供了对注解(Annotation)的支持,注解与普通的Java关键字一样,而在JDK 1.6中实现了JSR-269规范JSR-269:Pluggable Annotations Processing API(插入式注解处理API)。提供了一组插入式注解处理器的标准API在编译期间对注解进行处理;在注解处理期间,我们可以获取到所有的抽象语法树,可以对抽象语法树进行增删改查;语法树被修改过之后,编译器将回到解析及填充符号表的过程重新处理,直到所有插入式注解处理器都没有再对语法树进行修改为止。

Parse and Enter

1.语义分析

语义分析的主要任务是对结构正确的源程序进行上下文有关性质的审查,过程分为标注检查和数据及控制流分析两个步骤:

标注检查

检查语义合法性、进行逻辑判断,如变量使用前是否已被声明、变量与赋值之间的数据类型是否能够匹配等;

数据及控制流分析

在Javac的源码中,数据及控制流分析的入口是图中的flow(),由com.sun.tools.javac.comp.Flow类来完成,作用是对程序上下文逻辑更进一步的验证,检查局部变量在使用前是否有赋值、方法的每条路径是否都有返回值、是否所有的受查异常都被正确处理了等问题。

2.解语法糖

语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,Java中最常用的语法糖主要是的泛型擦除、变长参数、自动装箱/拆箱、条件编译等,解语法糖就是还原回简单的基础语法结构。

3.生成字节码

字节码生成是Javac编译过程的最后一个阶段,由com.sun.tools.javac.jvm.Gen类来完成;把前面各个步骤所生成的信息(语法树、符号表)转化成字节码,再将字节码输出到*.class文件中。

总结

通过javac的编译原理可以得出:

1.抽象语法树是一种描述程序代码语法结构的树形表示方式;

2.对java源文件经过词语法分析,构建出抽象语法树;

3.我们可以在注解处理器中获取到抽象语法树。

java抽象语法树_抽象语法树AST的全面解析(一)相关推荐

  1. java抽象语法树_抽象语法树(AST)

    抽象语法树(AST) 最近在做一个类JAVA语言的编译器,整个开发过程,用抽象语法树(Abstract SyntaxTree,AST)作为程序的一种中间表示,所以首先就要学会建立相对应源代码的AST和 ...

  2. python 抽象语法树_抽象语法树(Abstract Syntax Tree)

    一般来说,程序中的一段源代码在执行之前会经历下面三个步骤 1 分词/词法分析 这个过程会将由字符组成的字符串分解成有意义的代码快,这些代码块被称为词法单元.例如 var a = 4:会被分解成 var ...

  3. ast抽象语法树_新抽象语法树(AST)给 PHP7 带来的变化

    本文大部分内容参照 AST 的 RFC 文档而成:https://wiki.php.net/rfc/abstract_syntax_tree,为了易于理解从源文档中节选部分进行介绍. 我的官方群点击此 ...

  4. 编译原理抽象语法树_平衡抽象原理

    编译原理抽象语法树 使代码复杂易读和理解的一件事是,方法内部的指令处于不同的抽象级别. 假设我们的应用程序仅允许登录用户查看其朋友的旅行. 如果用户不是朋友,则不会显示任何行程. 一个例子: publ ...

  5. 抽象语法树AST的全面解析(一)

    Javac编译概述 将.java源文件编译成.class文件,这一步大致可以分为3个过程: 1.把所有的源文件解析成语法树,输入到编译器的符号表: 2.注解处理器的注解处理过程: 3.分析语法树并生成 ...

  6. python 抽象语法树_用python演示一个简单的AST(抽象语法树)

    假设对'a + 3 * b'进行解释,其中a=2,b=5 代码很简单,就不再进行详细的解释了. Num = lambda env, n: n Var = lambda env, x: env[x] A ...

  7. php ast 抽象语法树,AST抽象语法树的基本思想

    AST抽象语法树的基本思想 前言 AST概述 AST结构 AST解析 转换 生成 前言 在阅读java ORM框架spring data jpa的源码时,发现Hibernate(spring data ...

  8. java抽象语法树(ast),AST 抽象语法树

    AST 抽象语法树简介 AST(Abstract Syntax Tree)是源代码的抽象语法结构树状表现形式,Webpack.ESLint.JSX.TypeScript 的编译和模块化规则之间的转化都 ...

  9. AST抽象语法树的基本思想

    AST抽象语法树的基本思想 前言 AST概述 AST结构 AST解析 转换 生成 前言 在阅读java ORM框架spring data jpa的源码时,发现Hibernate(spring data ...

最新文章

  1. 《研磨设计模式》chap8 生成器模式Builder
  2. redis scan 效率太慢_Redis 基础、高级特性与性能调优(下)
  3. 11.Excel数据分析-复合型饼图与漏斗图
  4. python泰坦尼克号数据预测_机器学习入门之Python机器学习:泰坦尼克号获救预测一...
  5. Oracle11新特性:分区功能增强-Oracle新增复合分区 (转载)
  6. 【机器学习+NER】手把手教你用机器学习CRF模型构建NER系统(CCL2021)
  7. rabbitmq创建缓存连接工厂
  8. AutoCAD 百度网盘免费下载
  9. 2021-04-07
  10. Python-png转换成jpg
  11. ImageView显示灰色图片
  12. http://wsj356428476.iteye.com/blog/1655032
  13. 【宽创案例】青海牦牛文化馆:走进牦牛之都!
  14. 苹果手机计算机网络设置,苹果手机上网速度慢怎么办!手把手教你如何解决
  15. 诺基亚社招C++面试记录
  16. 用c语言如何制作抖动窗口,C语言实现自动给QQ好友发窗口抖动
  17. 【课后习题】 线性代数第六版第二章 矩阵及其运算 习题二
  18. VTK交互系统 2 交互器样式
  19. Java8新特性 - 04 - 方法引用05 - 方式四 【类名::new】
  20. 【我的Android进阶之旅】如何在Android Studio开发NDK的时候,通过addr2line或者ndk-stack来定位出错代码的位置

热门文章

  1. 图论总结(一)二分图最大匹配
  2. 无缝轮播——改ul的marginLeft
  3. 研华微型计算机biso,研华工控机BIOS设置通电自启动方法技巧
  4. 如何利用Python和win32编程避免重复性体力劳动(一)——开始、FindWindow和FindWindowEx
  5. IDEA给springboot项目改名(四个步骤)
  6. 环路补偿之“误差放大器” 分析
  7. 服务器向用户返回的状态码和提示信息
  8. Fusion设计平台概念-synopsys芯片设计技术篇(三)
  9. Md2All:好用的markdown文件转换工具,文章迁移微信公众号的利器
  10. 本地网站无服务器,0基础,无需域名服务器,手把手教你搭建本地电脑的影视播放网站...