java源码的编译机制

1.java源码编译机制

Sun JDK 中实现 java 源码编译器的是 javac, javac 将 java 源码编译为 class 文件的步骤如下图。


步骤介绍:

1 分析和输入到符号表(Parse and Enter)

    Parse过程所做的为词法和语法分析。

   词法分析(com.sun.tools.javac.parse.Scanner)要完成的使将代码字符串转变为token序列(例如 Token.EQ(name:=)); 

   语法分析(com.sun.tools.javac.parser.Parser)要完成的使根据语法token 序列生成抽象语法树。

Enter(com.sun.tools.javac.comp.Enter) 过程为将符号输入到符号表,通常包括确定类的超类型接口,根据语法由 token 序列生成抽象语法树。


2. 注解处理(Annotation Processing)

    该步骤主要用于处理用户自定义的 annotation, 可能带来的好处使基于 annotation 来生成附加的代码或进行一些特殊的检查,从而节省一些共用的代码编写,即生成class文件时,根据用户自定义注解,将对应代码生成至 .class 文件中。


3. 语义分析和生成 class 文件(Analyse and Generate

    Analyse 步骤基于抽象语法树进行一系列的语义分析,包括将语法树中的名字,表达式等元素与变量,方法,类型等联系到一起;检查变量使用前是否已声明;推导泛型方法的类型参数;检查类型匹配;进行常量折叠;检查所有语句都可到达;检查所有 checked exeception 都被捕获或抛出;检查变量的确定型赋值(如由返回值的方法必须确定有返回值);检查变量的确定性不重复赋值(如声明为 final 的变量等);解除语法糖(消除 if(false){...} 形式的无用代码;将泛型 Java 转为普通 Java;将含有语法糖的语法树改为含有简单语言结构的语法树,例如 foreach 循环,自动拆/装箱等)等。


    完成语义分析后,开始生成 class 文件(com.sun.tools.javac.jvm.Gen)

    生成步骤为: 

    1. 将示例成员初始化器收集到构造器中,将静态成员初始化器收集为<clinit()>; 接着将抽象语法树生成字节码,采用的方法为后序遍历语法树,并且最后进行少量的代码转换(如String相加转变为StringBuffer),最后从符号表中生成class文件。

(注:clinit()方法是在JVM第一次加载class文件时调用,编译器自动收集类所有类变量(即静态变量)的赋值动作和静态语句块(static)中语句产生的。详细信息 参考:http://blog.csdn.net/java528416037/article/details/48463639)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值