JVM笔记-前端编译与优化

1. 概述

所谓”编译“,通俗来讲就是把我们写的代码“翻译“成机器可以读懂的机器码。而编译器就是做这个翻译工作的。

Java 技术中的编译器可以分为如下三类:

  • 前端编译器:把 *.java 文件转变为 *.class 文件的过程。比如 JDK 的 Javac。

  • 即时编译器:Just In Time Compiler,常称 JIT 编译器,在「运行期」把字节码转变为本地机器码的过程。比如 HotSpot VM 的 C1、C2 编译器,Graal 编译器。

  • 提前编译器:Ahead Of Time Compiler,常称 AOT 编译器,直接把程序编译成与目标机器指令集相关的二进制代码的过程。比如 JDK 的 Jaotc,GNU Compiler for the Java。

其中后面两类都属于后端编译器。

本文主要分析前端编译器 Javac 的相关内容,后文再介绍后端编译器。

2. Javac 编译器

Javac 的编译过程大致可以分为 1 个准备过程和 3 个处理过程:

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

  2. 解析与填充符号表过程

    1. 词法、语法分析:将源码中的字符流转变为标记集合,构造抽象语法树

    2. 填充符号表:产生符号地址和符号信息

  3. 插入式注解处理器的注解处理过程

  4. 分析与字节码生成过程

    1. 标注检查:对语法的静态信息进行检查

    2. 数据流及控制流分析:对程序的动态运行过程进行检查

    3. 解语法糖:将简化代码编写的语法糖还原为原来的样子

    4. 字节码生成:将前面各个步骤所生成的信息转化为字节码

2.1 解析与填充符号表

2.1.1 词法、语法分析

  • 词法分析

将源码中的字符流转变为标记(Token)集合的过程。关键字、变量名、运算符等都可作为标记。比如下面一行代码:

int a = b + 2;

在字符流中,关键字 int 由三个字符组成,但它是一个独立的标记,不可再分。

该过程有点类似“分词”的过程。虽然这些代码我们一眼就能认出来,但编译器要逐个分析过之后才能知道。

  • 语法分析

根据上面的标记序列构造抽象语法树的过程。

抽象语法树(Abstract Syntax Tree,AST)是一种用来描述程序代码语法结构的树形表示方法,每个节点都代表程序代码中的一个语法结构(Syntax Construct),比如包、类型、修饰符等。

通俗来讲,词法分析就是对源码文件做分词,语法分析就是检查源码文件是否符合 Java 语法。

2.1.2 填充符号表

符号表(Symbol Table)是一种数据结构,它由一组符号地址和符号信息组成(类似“键-值”对的形式)。

符号由抽象类 com.sun.tools.javac.code.Symbol 表示,Symbol 类有多种扩展类型的符号,比如 ClassSymbol 表示类、MethodSymbol 表示方法等。

符号表记录的信息在编译的不同阶段都要用到,如:

  • 用于语义检查和产生中间代码;

  • 在目标代码生成阶段,符号表是对符号名进行地址分配的依据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值