文档章节

详解Javac将java文件编译为class文件的过程

浮躁的码农
 浮躁的码农
发布于 2016/04/19 09:14
字数 744
阅读 151
收藏 0

Java编译器总的来说分为前端编译器,JIT(just in time compiler)编译器,AOT(Ahead Of Time Compiler)编译器三种。

  • 前端编译器: 将Java文件编译为class文件的编译器,目前主要有以下两个,Sun提供的Javac 和Eclipse JDT中的增量式编译器(ECJ)

  • JIT编译器: 虚拟机后端运行期编译器,把字节码转换为机器码的过程。HotSpot Vm中提供的C1, C2编译器

  • AOT编译器:直接把Java文件转换为本地机器码的过程。 GNU Compiler for the java(GCJ), Excelsior JET


 * 在Java 3 以后为了使其他不通过Javac编译的其他在java虚拟机上执行的语言可以享受到编译器优化所带来的好处所以,java把所有的编译器优化工作都放到了后端及时编译器中。


Sun Javac编译器

 Sun javac编译器编译过程分为三个步骤,解析填充符号表,插入式注解处理器的注解处理过程,分析与字节码生产过程

   **Javac编译器的入口是com.sun.tools.javac.main.JavaCompiler类,主要逻辑集中在compile和compile2方法中

      

  1.  解析填充符号表
    词法分析:将源代码的字符流转变为标记(Token)集合   com.sun.tools.javac.parser.Scanner类进行词法分析
    语法分析:用标记序列构造抽象语法树(AST,Abstract Syntax Tree)。Eclipse  AST View插件可以用来查看抽象语法树 

  2. 注解处理器
    Java1.5之后提供了对注解(Annotations)的支持,注解处理器可以理解为抽象语法树的一组插件,这些插件可以对抽象语法树直接进行读取,修改,添加操作。
    如果在解析注解期间,对语法树进行了修改,那么编译器回到解析及填充符号表的过程重新处理,直到所有的插入式注解处理器没有对语法树进行修改为止。
    JavacCompiler 类中initProcessAnnotations()方法对注解处理器进行初始化,JavacProcessingEnvironment类的doProcessing()方法生成新的JavacCompiler对编译的后续过程进行处理。

  3. 语义分析与字节码生成
    语法分析之后编译器得到程序的抽象语法树表示,语法树表示一个结构正确的源程序抽象,但无法保证源程序是符合逻辑的,语义分析就是对结构正确的源程序上下文进行审查。
    语法分析与字节码生成总共分为,标注检查,数据及控制流分析,解语法糖,字节码生成四个过程。
    标注检查,和数据及控制流分析主要是对程序上下文环境进行分析检查。
    解语法糖:在Java中常用到的解语法糖就是泛型,在Java虚拟机是不支持泛型的。只是通过语法糖进行语法扩展。

本文转载自:http://blog.csdn.net/shaozengwei/article/details/38659569

共有 人打赏支持
浮躁的码农

浮躁的码农

粉丝 64
博文 745
码字总数 145372
作品 0
松江
程序员
房产证图片 不动产证样本 不动产权证 2018年房产证样本

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } 以上我们使用了两个命令 javac 和 java。 javac 后面跟着的是java文件的文件......

AA开源
08/18
0
0
您真的明白java环境变量的配置吗?

首先,我们来看一看当我们用命令执行javac和java的时候,系统做了些什么工作,假如我们现在有一个文件夹如下图1所示,有两个java文件。 图1:文件目录示意图 其中,Main.java的内容非常简单:...

trayvon
2015/11/16
0
0
Win10系统下eclipse的基本配置 编码格式 classpath原理 import工作机制

eclipse是用来编译java文件的一个软件 国内也有汉化版,我也不知道该怎么上传……忘了从哪里搞来了 不过用了一段时间就还原原来的配置了因为网上的教程之类的方法都是英文版的 为了和网上的配...

codingcoge
03/17
0
0
Linux服务器上的tomcat中部署web项目

首先了解一下下面几个概念,讲得不太准确: 1、JVM JVM是class以及jar(实际上就是很多个class压缩在一起)的运行环境,特征就是java和javaw命令,通过这两个命令,你可以执行class和jar文件。...

闵开慧
2014/08/20
0
1
1-Java基础语法-Java初识

欢迎大家来到java世界 带领大家领略编程的奥秘。 人与人沟通需要语言。计算机世界的沟通语言。 Java语法结构,使用循环和选择流控制结构,了解方法和数组的使用。 Java简介 Java是一门编程语...

天涯明月笙
07/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

原型模式

1、原型模式-定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 克隆(浅度克隆->拷贝值类型或者引用,深度克隆->创建新的对象,开辟新的内存) 例如客户端知道抽象Pro...

阿元
今天
32
0
awk命令扩展使用操作

awk 中使用外部shell变量 示例1 [root@centos01 t1022]# A=888[root@centos01 t1022]# echo "" | awk -v GET_A=$A '{print GET_A}'888[root@centos01 t1022]# echo "aaaaaaaaaaaaa" | aw......

野雪球
今天
28
0
深入解析MySQL视图VIEW

Q:什么是视图?视图是干什么用的? A:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。   通过视图,可以展现基表的部分数据;...

IT--小哥
今天
37
0
虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
今天
24
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
37
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部