专栏首页JMCuiJVM系列五(javac 编译器).

JVM系列五(javac 编译器).

一、概述

我们都知道 *.java 文件要首先被编译成 *.class 文件才能被 JVM 认识,这部分的工作主要由 Javac 来完成,类似于 Javac 这样的我们称之为前端编译器

但是 *.class 文件也不是机器语言,怎么才能让机器识别呢?就需要 JVM 将 *.class 文件编译成机器码,这部分工作由JIT 编译器完成;

除了这两种编译器,还有一种直接把 *.java 文件编译成本地机器码的编译器,我们称之AOT 编译器

二、javac 的编译过程

首先,我们先导一份 javac 的源码(基于 openjdk8)出来,下载地址:https://hg.openjdk.java.net/jdk8/jdk8/langtools/archive/tip.tar.gz,然后将 JDK_SRC_HOME/langtools/src/share/classes/com/sun 目录下的源文件全部复制到工程的源码目录中,生成的 目录 如下:

我们执行 com.sun.tools.javac.Main 的 main 方法,就和我们在命令窗口中使用 javac 命令一样:

从 Sun Javac 的代码来看,编译过程大致可以分为三个步骤:

  • 解析和填充符号表过程
  • 插入式注解处理器的注解处理过程
  • 分析和字节码生成过程

这三个步骤所做的工作内容大致如下:

这三个步骤之间的关系和交互顺序如下图所示,可以看到如果注解处理器在处理注解期间对语法树进行了修改,编译器将回到解析和填充符号表的过程进行重新处理,直到注解处理器没有再对语法树进行修改为止。

Javac 编译的入口是 com.sun.tools.javac.main.JavaCompiler 类,上述三个步骤的代码都集中在这个类的 compile() 和 compile2() 中:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JVM系列六(自定义插入式注解器).

    从前面 文章 中我们可以了解到,javac 的三个步骤中,程序员唯一能干预的就是注解处理器部分,注解处理器类似于编译器的插件,在这些插件里面,可以读取、修改、添...

    JMCui
  • Docker 系列四(自定义仓库).

        Docker hub 是 Docker 官方维护的一个公共仓库,大部分需求都可以通过在 Docker hub 中直接下载镜像来完成。接下来,来看一下怎么...

    JMCui
  • Java 注解

        从JDK1.5开始,引入了源代码中的注解这一机制。注解使得 Java 源代码中不但可以包含功能性的实现代码,还可以包含元数据。

    JMCui
  • Python爬虫(九)_非结构化数据与结构化数据

    爬虫的一个重要步骤就是页面解析与数据提取。更多内容请参考:Python学习指南 页面解析与数据提取 实际上爬虫一共就四个主要步骤: 定(要知道你准备在哪个...

    用户1174963
  • 新冠病毒Logistic增长模型:中国+钻石公主号游轮

    Rimmer 博士是一位退休的心脏病专家,自1988年以来一直使用Mathematica。他对数学统计,金融市场,全球定位系统,信息知识和医学感兴趣;他在 Ma...

    WolframChina
  • 单向链表的一点儿感悟

    最近一段时间学习了挺多的,数据结构看了一点点,略有感悟,和感兴趣的同志分享一下,欢迎大家不吝评论。

    用户5908113
  • 爬取QQ空间3000万用户,玩玩大数据分析

    这是我近期使用C#写的一个QQ空间蜘蛛网爬虫程序。程序断断续续的运行了两周,目前总共爬了3000万QQ数据,其中有300万包含用户(QQ号,昵称,空间名称,头像...

    FB客服
  • 化繁为简:推荐算法三视角

    关于推荐系统,如果在忘掉所有的公式和代码,忘记所有的语言描述,脑海里就剩下几张图景,会是什么?一张二维表格,一个拓扑图,一条时间线。这三幅图景,是我看待推荐算法...

    week
  • Django进阶篇 Rest framework (二)

    b.return_name() # 输出 name:B,这里由于 B 类中没有实现 return_name 方法,实例化 B 得到 b 之后,会调用父类 A 中...

    小团子
  • SAP系统里的订单,可以随便删除么?

    在SAP Cloud for Customer系统里,用户是可以从UI上通过删除按钮进行操作的,前提是销售订单的状态满足一定的条件。

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券