Java代码的编译过程(没写完,不要点进来)

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java代码的编译过程(没写完,不要点进来)相关的知识,希望对你有一定的参考价值。

文章目录

编译过程:

从Javac代码的总体结构来看,编译过程大致可以分为1个准备过程和3个处理过程,它们分别如下所示:

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

  2. 解析与填充符号表过程,包括:

    • 词法、语法分析,将源代码的字符流转变为标记集合,构造出抽象语法树。

    • 填充符号表,产生符号地址和符号信息。

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

    在Javac源码中,插入式注解处理器的初始化过程是在initPorcessAnnotations()方法中完成的,而它的执行过程则是在processAnnotations()方法中完成。这个方法会判断是否还有新的注解处理器需要执行,如果有的话,通过JavacProcessing-Environment类的doProcessing()方法来生成一个新的JavaCompiler对象,对编译的后续步骤进行处理。

  4. 分析与字节码生成过程,包括:

    • 标注检查,对语法的静态信息进行检查。

    • 数据流及控制流分析,对程序动态运行过程进行检查。

    • 解语法糖,将简化代码编写的语法糖还原为原有的形式。

    • 字节码生成,将前面各个步骤所生成的信息转化成字节码。

上述3个处理过程里,执行插入式注解时又可能会产生新的符号,如果有新的符号产生,就必须转回到之前的解析、填充符号表的过程中重新处理这些新符号,从总体来看,三者之间的关系与交互顺序如图所示:

深入理解:

首先我们要了解什么是编译?

编译的过程我们可以拆开,其实就是”编“和”译“。

  • 编:是指将java源代码的结构组织成合适的格式,包括编译过程中的抽象语法树和符号表等,并在最终将源码编码成为class文件。

  • 译:是指对源代码中的语义进行解析,并准确地翻译成另一种形式(字节码)。这一步既要确保原格式正确(Java源代码中的语法正确),又要确保翻译后的字节码跟源代码表达的意思一致。

总的来说:编译是利用编译程序从源语言编写的源程序产生目标程序的过程

Java文件编译过程包括两个阶段:

  • 第一阶段是在编译阶段编译成Java字节码的过程,有些书籍中叫前端编译器,如Oracle的javac编译器;
  • 第二阶段是在运行时,通过JVM的编译优化组件,对代码中的部分代码编译成本地代码,即JIT编译,如HotSpot中的C1、C2编译器,JIT编译器在这里起到了解释器的作用。

当JVM在执行java程序时,通常会将解释执行和编译执行二者结合起来进行,也就是一边解释一边编译,也因此Java被称为是半编译半解释语言。

后面不写了,写不动了。

初始化插入式注解处理器

解析与填充符号表过程

词法、语法分析

将源代码的字符流转变为标记集合,构造出抽象语法树。

填充符号表

产生符号地址和符号信息。

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

在Javac源码中,插入式注解处理器的初始化过程是在initPorcessAnnotations()方法中完成的,而它的执行过程则是在processAnnotations()方法中完成。这个方法会判断是否还有新的注解处理器需要执行,如果有的话,通过JavacProcessing-Environment类的doProcessing()方法来生成一个新的JavaCompiler对象,对编译的后续步骤进行处理。

分析与字节码生成过程

以上是关于Java代码的编译过程(没写完,不要点进来)的主要内容,如果未能解决你的问题,请参考以下文章

java编译器源码分析之词法分析器

Java—了解编译原理 (前端编译)

class文件的编译过程

通过实际的例子,介绍编译器的工作过程

身价过亿的灵仙子说你IIC没写完也发?

Java编译程序和运行过程详解