javac编译原理

2019-05-15  本文已影响0人  huapro

第二章 Javac编译原理

注:本文主要记录自《深入分析java web技术内幕》"第四章 javac编译原理"

1、javac作用

2、编译流程

image

流程:

3、词法分析

3.1、作用

3.2、流程

一个字节一个字节的读取源代码,形成规范化的Token流。规范化的Token包含:

3.3、示例

代码:

image [ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">1 package compile; 2
3 /**
4 * 词法 5 */
6 public class Cifa { 7 int a; 8 int c = a + 1; 9 }</pre>

[ 复制代码

](javascript:void(0); "复制代码")

以上代码转化为的Token流:

image

说明:完成以上示例的是JavacParser的parseCompilationUnit()方法,源代码见文章开头的书籍。

注意:上边的token流符合java语言规范。

3.4、疑问

4、语法分析

4.1、作用

4.2、语法分析三部分:

4.3、示例

代码:

image [ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> 1 package compile; 2
3 /**
4 * 语法
5 */
6 public class Yufa { 7 int a; 8 private int c = a + 1;
9
10 //getter
11 public int getC() { 12 return c; 13 } 14 //setter
15 public void setC(int c) { 16 this.c = c; 17 } 18 }</pre>

[ 复制代码

](javascript:void(0); "复制代码")

最终语法树:

image

说明:

疑问:

import节点的语法树与package的相似,但是import语法树放在了哪一个地方?

5、语义分析

5.1、作用

5.2、步骤

6、生成字节码

6.1、作用

6.2、步骤

具体的源代码与步骤查看com.sun.tools.javac.jvm.Gen类与《分布式Java应用:基础与实践》P42

6.3、class文件包含的内容

在生成的*.class文件中不只包含字节码信息,具体包含:

这里提到的局部变量区和操作数栈组成了了方法栈,可以参看第一章 JVM内存结构

总结:

对于编译这一块儿,我们在实际操作中不会直接去操作这些代码,不像类加载器机制,我们可能需要自己编写类加载工具,也不像Java内存管理那样,我们会直接在服务器配置堆栈方法区空间、配置GC收集器等,但是了解javac编译,对于我们了解以后的类文件结构、类加载机制有一定的帮助,也有利于我们掌握整个Java代码的执行流程,对于我们了解编译期间编译器做的一些检查工作也有很大帮助,了解这些检查工作有利于我们在写代码的时候更加小心,例如,检查型异常都需要捕获或抛出,每一条语句都要被执行到(即可达)等。虽然,这些工作eclipse会在我们写代码的时候为我们自动去检查,包括检查语句是否可达,但是了解这些还是有好处的。

上一篇 下一篇

猜你喜欢

热点阅读