前端编译器
1、概述
在JVM中编译器有三种:前端编译器、即时编译器(JIT编译器,Just In Time)、AOT编译器。
- 前端编译器是指将 .java文件转换为.class文件的编译器
- JIT编译器是指将字节码转换为本地机器码的编译器
- AOT编译器是指将~.java文件转换为本地机器码的编译器
在Java类库中的javac.exe就是一个前端编译器。
虚拟机设计团队把对性能的优化集中到了后端的即时编译器中。
2、前端编译器的过程
Javac的编译过程解释:
-
解析与填充符号表:
-
解析:解析步骤分为词法分析和语法分析
- 词法分析:将源代码的字符流转变为**标记(Token)**集合
- 语法分析:根据Token序列来构造抽象语法树的过程,抽象语法树是一种用来描述程序代码语法结构的树形表达方式
经过这个步骤后,编译器就基本不会再对源代码文件进行操作了,后续的操作都建立在抽象语法树上
-
填充符号表:略,这个部分为黑盒子。对于这部分的内容没有必要理解
-
-
注解处理:
- 注解(Annotation)可以看成为插件,可以读取、修改、添加抽象语法树中的任意元素。如果这些插件在处理注解期间对语法树进行了修改,那么编译器将回到解析及填充符号表的过程重新处理,直到所有的插入式注解处理器都没有再对语法树进行修改为止。
-
分析与字节码生成:
- 解决泛型、自动装箱、拆箱、循环遍历、条件编译这些Java的特点,使这些变化的代码(Java代码)变为确定的代码(字节码)
- 最后生成字节码
ava代码)变为确定的代码(字节码)
- 最后生成字节码