引入

对于用高级编程语言编写的源程序,做为一名编程人员都知道,源程序需要编译为对应的机器码才能执行。那么本篇文章将介绍JAVA的JVM对于JAVA程序的编译处理。JAVA语言的编译分为三种:早期编译、运行时编译(JIT)、静态提前编译(AOT)。
早期编译:这种编译是大多数程序员都熟知的编译过程,即是把JAVA源程序编译为CLASS文件的过程。
运行时编译(JIT):是将部分CLASS文件的内容编译为本平台下的机器码
静态提前编译(AOT):即把源程序直接编译为本平台下的机器码
而本次将只说明早期编译、而对于运行时编译等代下篇博客的介绍

早期编译过程

早期编译的结果是把源程序编译为类文件,而它的一个完整过程从大的方面来说就是:解析和符号表填充 ——》注解处理器———》分析和类文件生成
1)解析和符号填充

  1. 解析:词法分析,简单说就是把源程序的字符流转换为标记集合,源程序的字符流其实就是说源程序是有字符组成;标记集合其实就是说把源程序中的字面量、运算符、变量名、关键字等作为一个标记看,那么整个源程序就可以转换为标记集合。语法分析:这一步是依据词法分析得出的标记集合构建源程序对应的抽象语法树,而抽象语法树可以看做是源程序的一个抽象数据结构,这个结构的组成元素(或者说抽象语法树的节点)是语法结构,而该步骤之后形成的抽象语法树即是后续编译步骤的基础(后续编译步骤都是对该抽象语法树 的操作)
  2. 符号填充:就是填充符号表,符号表中的记录在编译成各个阶段都有作用

2)注解处理器:该阶段其实就是对抽象语法树进行的添加元素、修改元素、删除元素等操作,该阶段可能会有循环的步骤,原因是该阶段如果发现了注解处理器对抽象语法树的操作那么编译就会退回到解析后符号填充阶段,而注解处理器阶段又要等待所有的注解处理器操作往后才继续往下执行编译的步骤

3)分析和字节码文件生成
分析:从整体上来说就是对源程序生成的结构正确的抽象语法树的一个语义分析,确保生成的抽象语法树符合JAVA的语义。而该步骤又可细分为标记检查、数据流和控制流分析、语法糖解析
字节码文件生成:该步骤是早期编译的最后步骤,就是把之前步骤的结果(抽象语法树、符号表等)生成字节码文件,再该阶段可能还会自动添加代码(比如默认的构造器等)和转换代码

早期编译的优化

而对于代码优化这一块,JVM的主要实现是对后期编译的代码优化即在运行时编译阶段会对代码进行优化,而对于早期编译的优化,我个人理解就是语法糖等,早期编译通过这些技巧来帮助编程人员减少编写程序的错误和代码良好的阅读风格已达到优化的效果。
语法糖:该名词是一个比较形象的字面意,其实就是指JAVA中的某些语法其实不是真的JAVA中JVM所支持的规范写法,比如泛型、自动装箱、自动拆箱、增强for、动态参数等,这些看似是JAVA的语法,其实是编译器在早期编译的时候会把这些JAVA表面支持的书写代码格式全部在内部转换为底层的基本格式(JVM所真正支持的格式),而这一转换动作就成为解析语法糖。而通过理解语法糖的内部原理,也能更清楚的解释我们常见的知识,比如增强for只能由于实现了Iterator接口的类、动态参数就是在编译时会生成一个对应的类型的数组等。