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

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虚拟机是不支持泛型的。只是通过语法糖进行语法扩展。

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

时间: 2024-10-08 20:50:36

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

Java前端编译:Java源代码编译成Class文件的过程

Java前端编译:Java源代码编译成Class文件的过程 在上篇文章<Java三种编译方式:前端编译 JIT编译 AOT编译>中了解到了它们各有什么优点和缺点,以及前端编译+JIT编译方式的运作过程. 下面我们详细了解Java前端编译:Java源代码编译成Class文件的过程:我们从官方JDK提供的前端编译器javac入手,用javac编译一些测试程序,调试跟踪javac源码,看看javac整个编译过程是如何实现的. 1.javac编译器 1-1.javac源码与调试 javac编译器是官方

详解User Defined Java Class步骤(一)

 详解User Defined Java Class步骤(一) kettle中的"user defined java class"步骤,也称UDJC步骤,从4.0版本就有,功能非常强大,无所不能:可以在其中写任意代码,却不影响效率.本文将详细介绍在不同场景中用示例展示如果使用该步骤,由于内容非常多,便于阅读方便,把内容分成三部分,请完整看完全部内容,示例代码在这里下载. UDJC步骤工作机制 用户定义java类是从org.pentaho.di.trans.steps.userdef

详解linux配置java环境变量

详解linux配置java环境变量 一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议,连继敲回车,当询问是否同意的时候,输入yes,回车.之后会在当前目录下生成一个jdk1.6.0_14目录,你可以将它复制到 任何一个目录下. 二. 需要配置的环境变量 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中

CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

本文参考链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得到html的string字符串,但html的文本数据如果不经过处理就是个文本字符串没有任何效果的.所谓的浏览器就是负责将文本的html"翻译"成看到的界面.在前文有介绍,这个csdn的客户端app分首页.业界.移动.研发.程序员.云计算五大类.以业界为例,http://news.csdn.net/ 

HTTP头部详解及使用Java套接字处理HTTP请求

HTTP头部详解及使用Java套接字处理HTTP请求 标签: javahttp服务器浏览器服务器socketurl 2008-03-18 17:39 9537人阅读 评论(1) 收藏 举报  分类: java(7)  进行Web开发关键是要了解超文本传输协议(HTTP),该协议用来传输网页.图像以及因特网上在浏览器与服务器间传输的其他类型文件.只要你在浏览器上输入一个URL,最前面的http://就表示使用HTTP来访问指定位置的信息.(大部分浏览器还支持其他一些不同的协议,其中FTP就是一个典

Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO

Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO Java 非阻塞 IO 和异步 IO 转自https://www.javadoop.com/post/nio-and-aio 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2p

Java网络编程和NIO详解开篇:Java网络编程基础

Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的生活方式,改变了整个世界. 然而,网络的无标度和小世界特性使得它又是复杂的,无所不在,无所不能,以致于我们无法区分甚至无法描述. 对于一个码农而言,了解网络的基础知识可能还是从了解定义开始,认识OSI的七层协议模型,深入Socket内部,进而熟练地

linux dd命令参数及用法详解---用指定大小的块拷贝一个文件(也可整盘备份)

linux dd命令参数及用法详解---用指定大小的块拷贝一个文件 日期:2010-06-14 点击:3830 来源: 未知 分享至: linux dd命令使用详解 dd 的主要选项: 指定数字的地方若以下列字符结尾乘以相应的数字: b=512, c=1, k=1024, w=2, xm=number m if=file 输入文件名,缺省为标准输入. of=file 输出文件名,缺省为标准输出. ibs=bytes 一次读入 bytes 个字节(即一个块大小为 bytes 个字节). obs=b

详解User Defined Java Class步骤(二)

 详解User Defined Java Class步骤(二) kettle中的"user defined java class"步骤,也称UDJC步骤,从4.0版本就有,功能非常强大,无所不能:可以在其中写任意代码,却不影响效率.本文将详细介绍在不同场景中用示例展示如果使用该步骤,由于内容非常多,便于阅读方便,把内容分成三部分,请完整看完全部内容,示例代码在这里下载. 如果没有从第一部分开始,请访问第一部分. 使用步骤参数(Step Parameter) 如果你写了一段代码,如果