Java代码的编译过程(没写完,不要点进来)
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java代码的编译过程(没写完,不要点进来)相关的知识,希望对你有一定的参考价值。
文章目录
编译过程:
从Javac代码的总体结构来看,编译过程大致可以分为1个准备过程和3个处理过程,它们分别如下所示:
-
准备过程:初始化插入式注解处理器。
-
解析与填充符号表过程,包括:
-
词法、语法分析,将源代码的字符流转变为标记集合,构造出抽象语法树。
-
填充符号表,产生符号地址和符号信息。
-
-
插入式注解处理器的注解处理过程:
在Javac源码中,插入式注解处理器的初始化过程是在initPorcessAnnotations()方法中完成的,而它的执行过程则是在processAnnotations()方法中完成。这个方法会判断是否还有新的注解处理器需要执行,如果有的话,通过JavacProcessing-Environment类的doProcessing()方法来生成一个新的JavaCompiler对象,对编译的后续步骤进行处理。
-
分析与字节码生成过程,包括:
-
标注检查,对语法的静态信息进行检查。
-
数据流及控制流分析,对程序动态运行过程进行检查。
-
解语法糖,将简化代码编写的语法糖还原为原有的形式。
-
字节码生成,将前面各个步骤所生成的信息转化成字节码。
-
上述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代码的编译过程(没写完,不要点进来)的主要内容,如果未能解决你的问题,请参考以下文章