简单学习下Java编译过程

  • 准备一个Demo

    public class HelloWorld {
    
        public static void main(String[] args) {
            System.out.println("Hello World");
        }
    }
    
  • 打开CMD,运行javac HelloWorld.java,得到一个对应的class文件
    image-20210512220909038

  • Javac 背后做了哪些事情?当然是编译啦 hhh
    大概就是这个流程:
    image-20210512222041654

  • 词法分析器:读取源代码,一个一个字节读取,找出最小的关键字(Java中的关键字,如:if、else、for、while、int 等关键词,识别哪些是合法的关键词,哪些不是),有点类似mysql原子,不可再拆分的那种。这就是词法分析器进行词法分析的过程,其结果是从源代码中找出规范化的Token流。
  • 语法分析器:通过语法分析器对词法分析后Token流进行语法分析,抽象语法树的每一个节点都代表者程序代码中的一个语法结构。例如包、类型、修饰符、运算符、接口返回值甚至连代码注释等都可以是一种特定的语法结构,这一步检查这些关键字组合再一次是否符合Java语言规范(如在if后面是不是紧跟着一个布尔判断表达式),词法分析的结果是形成一个符合Java语言规范的抽象语法树。
  • 语义分析器:语义分析的主要任务是对结构上正确的源程序进行上下文有关性质的审查,比如进行类型检查,控制流检查,数据流检查,解语发糖(将一些难懂的、复杂的语法转化成更加简单的语法,结果形成最简单的语法(如将foreach转换成for循环 ,好有注解等)
  • 代码生成器:将前面几步生成的信息(语法树、拆解的关键字)转化成字节码存到磁盘,进而生成我们想要的.class文件。

照一张网图:.class文件中包含的内容,正好有利于我后面学习常量池 O(∩_∩)O哈哈~:
image-20210512223840718

Q.E.D.


一个热爱生活的95后精神小伙