前言:写这篇文章的目的在于梳理清楚在.java文件编译成.class文件的过程中,编译器做了哪些事情,为程序带来了哪些好处!
注:此文所描述的“早期(编译期)优化”特指编译器将.java文件转换成.class文件的过程。不包含后期将.class二进制文件编译成机器码的内容。
那么此文将从五个方面来说明早期编译优化的过程:
- why: 为什么要进行早期编译?
- what: 编译优化什么?
- who: 谁来编译优化?
- when: 何时编译优化?
- how:怎样编译优化的?
why:为什么要进行早期编译?
将.java格式或其它格式的文件(例如:Groovy、JRuby等)编译转换成jvm能识别的、符号统一规范的.class文件。
what:编译优化什么?
程序源代码,如:.java、.groovy文件等。
who:谁来编译优化?
编译器,如:javac等。
when:何时编译?
程序运行之前,或者说触发编译时。
how:怎样编译优化的?
- 词法语法解析:将源代码按照编译规范,转化成特定的符号。并最终构建成语法树。语法树能体现程序的逻辑关系;
- 填充符号表:这个很抽象,其作用就是将语法树转化成一张表格,表格中同样能体现程序的逻辑关系。方便后续动作的引用;
例如:函数func1(para1,para2,para3) 表格的存储关系
- 语义解析:通俗的说就是检查代码是否符合规范。例如:局部变量使用前是否已经初始化等等;
- 生成字节码:将语法树转化生成二机制格式的.calss文件;
- 整体上前期编译就上述四个主要步骤,当然随着java程序的日趋复杂(功能的丰富),逐步要加入了其它的一些内容:
-注解解析:各种框架所支持的注解编程,就是在这一步解析转化成java原生语法的;
-语法糖剥离:将方便程序员编写代码的语法剥离转化成原生语法。最典型的就是范型;