首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java编译原理(javac)

Java中的编译分为两个部分: 源码文件编译成字节码文件(前端编译) 字节码文件被虚拟机加载以后编译成机器码(后端编译) 对于开发来说接触的一般都是第一个步骤也就是源码编译成字节码文件(class文件)...前端编译 前端编译大致主要有以下流程: 对源文件进行词法分析产生字符流 对字符流进行语法分析产生抽象语法树 对语法树进行语义分析,确保语义正常 语义分析通过以后生成中间代码(字节码) 下面我们站在javac...词法分析主要由com.sun.tools.javac.parser.Scannaer类来实现。...上述抽象语法树在Java中使用com.sun.tools.javac.tree.JCTree类来表示,之后所有的操作均建立在抽象语法树之上。...4.2.2 字节码生成 字节码生成是javac编译的最后一个阶段。字节码生成阶段不仅仅是把各个步骤生成的信息转换成字节码写到磁盘,还进行了代码的添加和转换工作。

1.4K10
您找到你想要的搜索结果了吗?
是的
没有找到

Java底层-Javac编译

通常我们也叫Javac编译器为前端编译器,因为一个传统编译编译结果是由源码到本地机器码的一个过程,而由于Javac编译器只负责源码到字节码这一步,所以叫前端编译器;字节码到本地机器码这一步是由后端运行时编译器来完成的...Javac编译是使用Java语言实现的,是不是很疑惑,用Java语言编写一个javac编译器去编译Java,那Javac的源码又是如何被编译执行的呢(好像鸡生蛋还是蛋生鸡的问题)?...到这里我们知道javac编译器是如何而来的,那么我们程序中能不能使用javac编译器呢?答案是肯定的。...而Javac编译器具体的编译过程可以分为两大步骤(具体可看com.sun.tools.javac.main.JavaCompiler类源码):解析与填充符号表,语义分析及字节码生成。...编译器做一个简单叙述,感兴趣可以通过OpenJDK来下载源码,然后自己编译javac的源码, 也可以通过调用jdk的com.sun.tools.javac.main.Main类来手动编译指定的类

1.9K30

JVM系列五(javac 编译器).

一、概述 我们都知道 *.java 文件要首先被编译成 *.class 文件才能被 JVM 认识,这部分的工作主要由 Javac 来完成,类似于 Javac 这样的我们称之为前端编译器; 但是 *.class...就需要 JVM 将 *.class 文件编译成机器码,这部分工作由JIT 编译器完成; 除了这两种编译器,还有一种直接把 *.java 文件编译成本地机器码的编译器,我们称之AOT 编译器。 ?...二、javac编译过程 首先,我们先导一份 javac 的源码(基于 openjdk8)出来,下载地址:https://hg.openjdk.java.net/jdk8/jdk8/langtools...从 Sun Javac 的代码来看,编译过程大致可以分为三个步骤: 解析和填充符号表过程 插入式注解处理器的注解处理过程 分析和字节码生成过程 这三个步骤所做的工作内容大致如下: ?...Javac 编译的入口是 com.sun.tools.javac.main.JavaCompiler 类,上述三个步骤的代码都集中在这个类的 compile() 和 compile2() 中: ? ?

90510

java和javac编译运行java程序

目录 目录 前言 编译命令介绍 javac java 代码编译与运行 java类发现规则 分离class和java文件 参考链接 前言 给自己定了一个月学习JVM虚拟机的计划,不管有没有卵用,学点新东西总是好的...下面,主要是总结一些如何在命令行中编译java程序。主要是想记录总结一下java的类发现原则。 编译命令介绍 其实,java编译过程主要使用了javac和java两个命令。...javac javac用于将java文件编译成byte-code class文件。...代码编译与运行 这里介绍一个带package的测试用例。以前大家在学习javac编译的时候,都是在默认包下进行的编译,一般不会出问题,但是遇到带package的类就不一样了。...在src/jvm目录下,我们禁用classpath,编译TestClass1.java: javac -classpath "" TestClass1.java 大家执行之后,发现是可以编译通过的(至于能否执行大家先不要在意

2.9K30

Javac 编译速度缓慢的 JDK Bug 定位

当程序运行一段时间后,我们找出了热点方法(见图 4),即 javac 编译起内部的 List 相关调用;通过仔细追踪调用链,发现是 checkWithinBounds 方法过于缓慢。...图 4:找出热点方法 既然热点方法找到了,那么下面就需要探究这个方法在 javac 编译器中是做什么的,它的算法为什么这么慢,以及是否有优化的方式。...通过搜索泛型编译缓慢等关键字,找到了 JDK-8086048 这个 Bug 单,同时在 JDK-8080656 这里也有提到同样的问题。...在这个 2014 年就提出的 JEP-215 中,开发者设计了一种新的 javac 方法类型检测机制 TA(Tiered Attribution)来代替现有的 SA(Speculative Attribution...最多的方法了(图 5): 图 5:改为 JDK 11 编译时的热点方法 同时我们欣喜地发现,整个项目只需要 1.5 分钟就构建完毕了,相对之前的 1 个多小时,有了质的飞跃(图 6): 图 6:新版本

57630

一次 Javac 编译速度缓慢的 JDK Bug 定位

当程序运行一段时间后,我们找出了热点方法(见图 4),即 javac 编译起内部的 List 相关调用;通过仔细追踪调用链,发现是 checkWithinBounds 方法过于缓慢。...4.png 既然热点方法找到了,那么下面就需要探究这个方法在 javac 编译器中是做什么的,它的算法为什么这么慢,以及是否有优化的方式。...通过搜索泛型编译缓慢等关键字,找到了 JDK-8086048 这个 Bug 单,同时在 JDK-8080656 这里也有提到同样的问题。...在这个 2014 年就提出的 JEP-215 中,开发者设计了一种新的 javac 方法类型检测机制 TA(Tiered Attribution)来代替现有的 SA(Speculative Attribution...最多的方法了(图 5): 5.png 同时我们欣喜地发现,整个项目只需要 1.5 分钟就构建完毕了,相对之前的 1 个多小时,有了质的飞跃(图 6): 6.png 由此可见,这个 JEP-215

2K51

Javac编译器的基本工作原理和流程

Javac编译器是Java的标准编译器,用于将Java源代码(.java文件)编译成Java字节码(.class文件),供Java虚拟机(JVM)执行。...Javac编译器的基本工作原理和流程如下:词法分析(Lexical Analysis):将输入的源代码文件分解为一个个的单词(Token),如关键字、标识符、运算符等,并记录它们的类型和位置。...符号表生成(Symbol Table Generation):在语义分析过程中,同时生成符号表(Symbol Table),记录变量、方法、类的信息,以供后续的类型检查和代码生成。...Javac编译器的主要流程是:词法分析 -> 语法分析 -> 语义分析 -> 符号表生成 -> 类型检查 -> 代码生成 -> 优化 -> 目标文件生成。...通过这些步骤,Javac编译器能够将Java源代码转换为可执行的字节码文件,从而实现Java程序的编译和执行。

26641

一次 Javac 编译速度缓慢的 JDK Bug 定位

当程序运行一段时间后,我们找出了热点方法(见图 4),即 javac 编译起内部的 List 相关调用;通过仔细追踪调用链,发现是 checkWithinBounds 方法过于缓慢。...图 4:找出热点方法 既然热点方法找到了,那么下面就需要探究这个方法在 javac 编译器中是做什么的,它的算法为什么这么慢,以及是否有优化的方式。...通过搜索泛型编译缓慢等关键字,找到了 JDK-8086048 这个 Bug 单,同时在 JDK-8080656 这里也有提到同样的问题。...在这个 2014 年就提出的 JEP-215 中,开发者设计了一种新的 javac 方法类型检测机制 TA(Tiered Attribution)来代替现有的 SA(Speculative Attribution...最多的方法了(图 5): 图 5:改为 JDK 11 编译时的热点方法 同时我们欣喜地发现,整个项目只需要 1.5 分钟就构建完毕了,相对之前的 1 个多小时,有了质的飞跃(图 6): 图 6:新版本

74510

每日一博 - 动态编译报错 ClassNotFoundException: com.sun.tools.javac.processing.JavacProcessingEnvironment

at com.sun.tools.javac.main.Main.compile(Main.java:523) at com.sun.tools.javac.api.JavacTaskImpl.doCall...这个类是Java编译器API的一部分,它是用于访问编译器的内部处理环境的。...如果在使用IDE或者构建工具(如Maven或Gradle)时,确保它们包含了Java编译器API相关的库。 不正确的API使用:可能是因为你尝试使用了一个不正确的方法或者类来访问Java编译器API。...版本不匹配:如果你使用的Java版本与编译器API的版本不匹配,也可能会导致这个错误。确保你的Java开发工具包(JDK)和编译器API的版本兼容。...内部API使用:com.sun.tools.javac.processing.JavacProcessingEnvironment 是Java编译器的内部API,它不是公开的Java SE API的一部分

24810

什么是Javac

Javac 编译器的任务就是讲java语言规范转化成Java虚拟机语言规范,完成 “翻译工作” 什么是Javac Javac 是一种编译器,能将一种语言规范转化成另外一种语言规范。...通常编译器都是将便于人理解的语言规范转化成机器容易理解的语言规范。如c,c++或者汇编语言都是讲远吗直接编译成目标机器码,这个目标机器码是CPU直接执行的指令集合。...从某种意义上来说,有了编译器才有了程序语言的繁荣,因为片一起是人类和机器沟通的一个纽带。那么回过头来,javac编译器也是将Java这种对人非常友好的编程语言编译成对所有机器都非常友好的语言。...如何系哦啊出不同种类,不同机器之间的差别,这个任务就由JVM来完成,而Javac的任务就是将Java源代码语言先转化成JVM能够识别的一种语言,然后由JVM将JVM语言再转化成当前这个机器能够识别的机器语言...如下图所示,javac的任务就是将java源码编译成Java字节码,也就是JVM能够识别的二进制码。

1.2K30

Javac的实现过程

主要介绍Javac的实现过程及原理。 首先弄明白什么是JavacJavac是一种编译器,将一种语言转换为另一种语言规范。...编译器的作用就是将符合java语言规范的源代码转化为JVM虚拟机能够识别的字节码文件的过程。 对于java而言。javac任务就是将java源代码转换为jvm能够识别的二进制码。...编译过程的原理: 1、词法分析:首先将源代码按照字节的方式读取,然后找出定义的语法关键字(if/else/for等),然后判断哪些关键字是符合java语言规范的,经过整理分析返回一些规范化的Token流...2、使用final修饰的变量不会被重新赋值,如果重复复制会报错;同时如果变量是静态成员变量在定义的时候就必须赋值     3、分析方法返回值类型     4、所有的Checked Exception都必须向上抛出或者捕获...关于javac的基本原理就介绍到这里,有兴趣的可以研究下Javac的源码,可以从OpenJdk下载到源码。

1.5K50

JAVAC原理「建议收藏」

编译器将检查这些类的源和类路径;如果在源路径上找到它们,那么这些文件也将被编译,尽管它们不会受到注释处理的影响。...解析和输入 源文件是被Scanner按照Unicode 编码来处理的同时转化为token流. token流由解析器读取,使用TreeMaker创建语法树。...这是通过在编译后的类的类符号中安装completer对象来实现的,编译后的类为对应的类树调用MemberEnter阶段。...因此,为了避免在没有执行注释处理的情况下不必要地解析和输入源文件,JavacProcessingEnvironment与概念模型执行“不同步”,同时仍然满足注解处理作为一个整体在实际编译之前发生的概念要求...在分析树时,可以找到对成功编译所需的类(但未明确指定用于编译的类)的引用。

89310
领券