一、概述

我们都知道 *.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() 中:

最新文章

  1. salesforce 零基础学习(五十四)常见异常友好消息提示
  2. 如何实现修改FileUpload样式
  3. AndroidStudio不能解析R的一种可能
  4. (转)Visual Studio原生开发的10个调试技巧(二)
  5. 第一篇、C_高精度加法
  6. jquery.validate中使用remote,remote相同值不校验问题解决
  7. innosetup 安装静默安装msi,指定安装路径的方法
  8. 【Xamain 跨平台机制原理剖析】
  9. phpc.sinaapp.com 加密的解密方法
  10. Spring Security(02)——关于登录
  11. electron入门代码
  12. 同一个页面同时拥有collectionView和navigationBar和tabBar时可能遇到的问题
  13. redis的数据持久化方案
  14. SpringCloud(一)Eureka注册中心
  15. 剑指offer【03】- 从尾到头打印链表(4种实现方法)
  16. [UE4]保存玩家列表
  17. R语言学习 第一篇:变量和向量
  18. 20145206邹京儒 web安全基础实践
  19. APRoundedButton
  20. Python并行编程(六):线程同步之条件

热门文章

  1. H3C 无线网络典型部署-热点覆盖
  2. vue 组件评论 的同时进行刷新
  3. Codeforces Round #196 (Div. 1 + Div. 2)
  4. H3C 显示OSPF路由信息
  5. git提交时如何忽略一些文件
  6. Js 时间戳显示和计算时间间隔
  7. css3动画@keyframes示例
  8. 2019-8-31-C#-获取-PC-序列号
  9. dotnet 动态代理魔法书
  10. 修改Samba密码后无法登录