jvm系列五(javac编译器)

幽暗森林之猪大屁      2022-05-11     756

关键词:

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

更多技术资讯可关注:itheimaGZ获取








 
 
 

jvm系列六(自定义插入式注解器).(代码片段)

...员唯一能干预的就是注解处理器部分,注解处理器类似于编译器的插件,在这些插件里面,可以读取、修改、添加抽象语法树中的任意元素。因此,只要有足够的创意,程序员可以通过自定义插入式注解处理器来实现许多原本只... 查看详情

深入分析javac编译原理

通常,一个java文件会通过编译器编译成字节码文件.class,再又java虚拟机JVM翻译成计算机可执行的文件。我们所知道的java语言有它自己的语法规范,同样的JVM也有它的语法规范,如何让java的语法规则去适应语法解析规则,这就... 查看详情

jvm的概述

...>JVM+核心类库(各种jar包等)2.运行过程  java源文件->编译器(javac工具)->编译成字节码文件  字节码文件->JVM->机器码 &n 查看详情

jvm性能优化,part2――编译器

作为JVM性能优化系列文章的第2篇,本文将着重介绍Java编译器,此外还将对JIT编译器常用的一些优化措施进行讨论(参见“JVM性能优化,Part1″中对JVM的介绍)。EvaAndreasson将对不同种类的编译器做介绍,并比较客户端、服务器端... 查看详情

目录jvm目录

...档,园友们可以一口气读完整个JVM的笔记1. 【JVM】JVM系列之JVM体系(一)2. 【JVM】JVM系列之垃圾回收(二)3. 【JVM】JVM系列之Class文件(三)4. 【JVM】JVM系列之类加载机制(四)5. 【JVM】JVM系列之执行引擎(五... 查看详情

javac编译原理

...ava的语法规则适应java虚拟机的语法规则?这个任务由javac编译器来完成java语言规范转换成java虚拟机语言规范。编译流程:流程:词法分析器:将源码转换为Token流将源代码划分成一个个Token(找出java语言中的if,else, 查看详情

jvm内部原理系列

JVM内部原理(一)—概述JVM内部原理(二)—基本概念之字节码JVM内部原理(三)—基本概念之类文件格式JVM内部原理(四)—基本概念之JVM结构JVM内部原理(五)—基本概念之Java虚拟机官方规范文档,第7版JVM内部原理(六)... 查看详情

jvm原理介绍

...VM ?JVM是执行Java字节码文件(.class)的虚拟机进程。?Java编译器(javac),先将Java源程序(.java)编译成字节码文件(.class),然后由Java虚拟机将字节码文件解释成机器码。最终利用机器码操作硬件和机器系统。?不同的平台有... 查看详情

jvm系列笔记

...前市面上高性能虚拟机的代表作之一它采用解释器与即时编译器并存的架构 在今天,Java程序的运行性能早已脱胎换股,已经达到了可以和C/C++程序一较高下的地步Java代码执行流程JVM的架构模型Java编译器输入的指... 查看详情

jvm进阶之字节码文件解析指令(代码片段)

...ac指令2.javap指令1.javac指令使用javac命令可以将源代码文件编译成字节码文件,然后就可以查看代码中的详细结构。对于命令行的方式而言,我们可以使用javacxx.java或者javac-gxx.java进行编译,只不过后者会比前者多生成... 查看详情

java反射系列二

 一.Class类packagereflect;/**java.lang.class是反射的源头*我们创建了一个类,通过编译(javac.exe),生成对应的.class文件,之后我们使*用java.exe加载(JVM的类加载器完成的)此.class文件*此.class文件加载到内存以后,就是一个运行时类存在缓存... 查看详情

面渣逆袭:jvm经典五十问,这下面试稳了(代码片段)

...是Java实现平台无关性的基石。Java程序运行的时候,编译器将Java文件编译成平台无关的Java字节码文件(.class),接下来对应平台JVM对字节码文件进行解释,翻译成对应平台匹配的机器指令并运行。同时JVM也是一个... 查看详情

什么是 JAVA_HOME? JVM如何找到存储在JAVA_HOME中的javac路径?

...的路径在哪里设置。它在环境变量中。当我从命令提示符编译Java程序时,JVM如何 查看详情

openjdk系列:从jvm谈c/c++编译流程(代码片段)

编译器的这点事gcc和g++还傻傻分不清楚?clang与gcc有什么关系?llvm又是什么?下面将对一些常见的名词进行说明以免在后续阅读中感到疑惑.gcc和g++gcc即GNUCCompiler,刚开始它就是一个c编译器项目。后来越来越多的其他语言... 查看详情

java第一轴

...二进制码。这个时候就需要一个翻译员,这个翻译员叫做编译器。(Compiler)。java编译器命令叫做javac但是每个平台对0和1这样的二进制码的解释顺序不一样,所以程序不能编译一次,在所有平台上面正确运行。javac将.java的源码文... 查看详情

jvm基础(代码片段)

...,调用操作系统函数。简化一下上面的描述:Java文件->编译器>字节码-&g 查看详情

jvm运行时数据区(代码片段)

...,到处运行Java代码是怎么运行的?Java代码被javac编译器编译为Java字节码,在Java虚拟机上运行。javac编译过程:Person.java->词法分析器->tokens流->语法分析器->语法树/抽象语法树->语义分析器->注解抽象... 查看详情

mac本为什么使用javac指令出现这样?

因为你的Hello.java文件里没有定义成一个Classpublicclasshello//....dosomthing这样就可以编译了。Javac是编译命令提示的就是你这个格式错误,无法被JVM编译。参考技术Ajavaxx.javajavacxx 查看详情