`
m635674608
  • 浏览: 5061662 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Javac编译器源代码分析

    博客分类:
  • java
 
阅读更多

Javac编译器的编译流程主要如下图:

 

 java编译器编译流程

 

各个阶段的作用:

 

词法分析:

 

主要的作用就是读入Java源代码文件,生成Token流,用到的类如下图:

 

词法分析

 

 

 

 

 

Scanner调用nextToken()方法,返回一个Token。

 

Scanner它内部究竟是怎么获得Token的呢?

 

首先它会先把 Java源文件转为Char[]数组,逐个Char去判断,遇到单词分隔符(空格)、分隔语义时,分析出Java源文件中的词。再把分析出来的单词 Char[]数组传给Table.fromChars(chars)方法,Table会生成chars的hash值,也就是Table.hashs哈希表 的索引,当哈希表里不存在相应的Name时,生成新的一个Name,把它存入到哈希表Table.hashs中。再调用用 Keywords.key(name),直接由Keywords返回Token值。Keywords中存储的就是Name和Token的关系映射,它负责 将字符集合对应到Token。

 

语法分析:

 

主要把Token流组装成一棵基本的语法树。是一个递归下降且运算符优先级的语法分析器,使用com.sun.tools.javac.parser.Parser类,根据语法由Token序列生成相应的树节点,组装成抽象语法树。

 

语义分析:

 

语义分析包括:输入到符号表->  注解处理->标注(Attr)和检查(Check)->数据流分析(Flow)->数据流分析(Flow)->转换类型:(TransTypes)->  解除语法糖:(Lower)

 

输入到符号表:

 

使用com.sun.tools.javac.comp.Enter类,此过程每个编译单元的抽象语法树的顶局节点都先被放到待处理列表中并逐个处理列表中的节点

 

所有的类符号被输入到外围作用域的符号表中

 

确定类的参数(对泛型类型而言)、超类型和接口

 

如果需要添加默认构造器

 

将类中出现的符号输入到类自身的符号表中

 

分析和检查代码中的annotation

 

 注解处理:annotation processing

 

使用com.sun.tools.javac.processing.JavacProcessingEnvironment类,并且支持用户自定义的annotation

 

编译时lombook对java文件进行编译之后会再次进入Parse and Enter步骤

 

 标注(Attr)和检查(Check):

 

是语义分析的一个步骤,使用com.sun.tools.javac.comp.Attr类和com.sun.tools.javac.comp.Check类

 

主要作用有:

 

将语法树中名字、表达式等元素与变量、方法、类型等联系到一起

 

检查变量使用前是否已声明

 

推导泛型方法的类型参数

 

检查类型匹配性

 

进行常量折叠(将常量语法树合并)

 

数据流分析(Flow):

 

使用com.sun.tools.javac.comp.Flow类

 

检查所有语句都可到达

 

检查所有checked exception都被捕获或抛出

 

检查所有局部变量在使用前必项确定性赋值

 

 检查有返回值的方法必须确定性返回值

 

检查变量的确定性且不重复赋值

 

转换类型:(TransTypes)

 

使用com.sun.tools.javac.comp.TransTypes主要作用是将泛型java代码转换成普通的java代码

 

eg:

 

List<Integer> list = Arrays.asList(1, 2, 3);

 

int i = list.get(0);

 

转换后:

 

List list = Arrays.asList(1, 2, 3);

 

int i = (Integer)list.get(0);为了保证泛型的语义,增加了强制类型转换

 

 解除语法糖:(Lower)

 

使用com.sun.tools.javac.comp.Lower类

 

消除if(false){…}形式的无用代码

 

将含有语法糖的语法树改写为含有简单语言结构的语法树

 

eg

 

 具名内部类,匿名内部类,类字面量

 

自动装箱拆箱

 

断言

 

foreach循环

 

enum或String类型的switch(java7)

 

eg:

 

List<Integer> list = Arrays.asList(1, 2, 3);

 

int i = list.get(0);

 

转换后:

 

List list = Arrays.asList(//自动装箱拆箱

 

new Integer[]{

 

Integer.valueOf(1),

 

Integer.valueOf(2),

 

Integer.valueOf(3)

 

}

 

);

 

int i = ((Integer)list.get(0)).intValue();

 

 

 

生成字节码:(Gen)

 

使用com.sun.tool.javac.jvm.Gen

 

将实例成员初始化器收集到构造器中成为<init>()

 

将静态成员初始化器收集为<clinit>()

 

从抽象语法树生成字节码

 

后序遍历语法树

 

进行最后的少量代码转换

 

    String的+操作被生成为StringBuilder操作

 

    x++/x–在条件允许时被优化为++x/–x

 

    etc …

 

从符号表生成Class文件

 

    生成Class文件的结构信息

    生成元数据(包括常量池)

转载:http://beiden.me/archives/2660.htm

分享到:
评论

相关推荐

    javac 编译器源代码

    Java 编译器 javac 是 Java 语言的核心组成部分,它将程序员编写的源代码转换成计算机可以理解的字节码,使得 Java 应用能在不同的平台上运行。深入了解 javac 的源代码,对于 Java 开发者而言,是提高技术水平、...

    java编译器源码-javac:javac编译器源代码

    总的来说,对javac编译器源代码的探索可以帮助我们深入理解Java语言的内部运作,提升开发技能,并可能引导我们参与到开源项目中,推动技术的创新和发展。这个名为"javac-master"的压缩包提供了一个难得的机会,让...

    Java编译器源代码

    Java编译器,通常被称为Javac,是Java开发工具包(JDK)的重要组成部分,负责将源代码转换为可执行的字节码。...总的来说,对Java编译器源代码的学习是一个深入了解Java平台,提升编程能力的宝贵途径。

    lanlan2017#JavaReadingNotes#10.2 Javac编译器 10.2.4 语义分析与字节码生成1

    - 第10章 前端编译与优化10.2.4 语义分析与字节码生成经过语法分析之后,编译器获得了程序代码的抽象语法树表示,抽象语法树能够表示一个结构正确的源程序,但

    java编译器源代码

    Java编译器源代码是Java开发工具包(JDK)的一部分,主要负责将Java源代码转换为可执行的字节码。深入理解Java编译器的源代码对于开发者来说是提升编程技能、优化代码性能以及了解Java语言底层运作机制的重要途径。...

    Java编译器源码初析示例

    在Java开发中,Javac是官方提供的标准编译器,负责将源代码(.java文件)转换为字节码(.class文件),使得虚拟机(JVM)能够执行。下面我们将深入探讨Javac的工作原理以及相关知识点。 1. **Java源码编译过程**: ...

    JAVAC源码 LR分析法 源代码

    本资源包含`JAVAC`的源代码以及关于LR分析法的资料,对于想要了解编译器工作原理的开发者来说是一份宝贵的学习材料。 **上下文无关文法 (Context-Free Grammar, CFG)** 是编译器设计的基础,它定义了一种形式化的...

    javac1.7源代码(完全版,可运行)

    本资源提供的"javac1.7源代码"是一个完全版,包含了OpenJDK 1.7版本中的javac编译器的源代码。OpenJDK是一个开源实现的Java平台标准版(Java SE),它提供了Java虚拟机(JVM)、类库以及Java语言编译器等关键组件。 ...

    java编译器源代码.rar

    这个压缩包“java编译器源代码.rar”很可能包含了JDK(Java Development Kit)中的Javac编译器的源代码。Javac是Java的标准编译器,用于将.java源文件编译成.class字节码文件。下面将深入探讨Java编译器的相关知识点...

    javac 的 源 代 码

    Java 编译器,javac,是 Java 语言的核心组成部分之一,它负责将开发者编写的源代码转换成可执行的字节码。深入理解javac的源代码对于Java程序员来说,不仅能帮助理解编译过程,还能提升编程技能和优化代码的能力。...

    javac 源码 javac 源码

    Java 编译器 javac 是 Java 语言的核心组成部分,它将程序员编写的源代码(`.java` 文件)转换成可执行的字节码(`.class` 文件),使得 JVM(Java 虚拟机)能够运行这些程序。了解 javac 的源码对于深入理解 Java ...

    java源码分析-Javac-Research:Java语言编译器(javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)

    Javac的源代码分析对于深入理解Java编程语言的工作原理至关重要,同时也为开发者提供了改进和扩展编译器的可能性。在"Javac-Research"项目中,我们可以找到关于Javac的源代码、相关的文档以及用于分析的测试用例,这...

    Javac内核源码

    Java 编译器,简称 Javac,是 Java 语言的核心组成部分,负责将开发者编写的源代码转换为可执行的字节码。Javac 内核源码深入揭示了 Java 编译过程的实现细节,这对于理解 Java 的运行机制、优化代码性能以及进行...

    maven-checkerframework-javac:来自http的支持JSR308的javac编译器的Maven集成

    该项目可从为支持JSR308的javac编译器提供简单的Maven集成。 用法 克隆并构建Maven-checkerframework-javac 配置Maven编译器插件以使用maven-checkerframework-javac提供的“ javac + jsr308”编译器 从检查器框架...

    javac源码和运行说明文件.zip

    Java编译器(javac)是Java开发工具包(JDK)的核心组件,负责将Java源代码转换为可执行的字节码。本压缩包"javac源码和运行说明文件.zip"包含了与javac相关的源码以及环境搭建的说明,非常适合对Java编译器有深入...

    jdk9_javac.rar

    在Java开发中,javac是核心的编译器,它负责将源代码转换为字节码,使得Java虚拟机(JVM)能够执行。JDK9作为Java的重要版本,对javac进行了一系列改进和优化,提升了开发效率和程序性能。然而,直接使用从压缩包...

    javac的词法分析,转载自:百度文库

    Java编译器`javac`的词法分析阶段是其核心组成部分,负责将源代码分解为可理解的词法单元。通过识别关键字、标识符、字面量等,`javac`为解析和理解Java程序的结构打下基础。正确地进行词法分析对于保证代码的正确...

    Javac源代码

    Java 编译器,简称 `javac`,是 Java 语言的核心组成部分,它负责将编写好的 Java 源代码(`.java` 文件)编译成可执行的 Java 字节码(`.class` 文件)。在 Java 7 版本中,`javac` 进行了一些重要的改进和优化,以...

    javac源代码,java具体编译步骤

    Java 编译器`javac`是Java程序开发的核心组件之一,它负责将开发者用Java编写的各种源代码文件(.java)转换成可执行的字节码文件(.class)。这个过程涉及到许多编译阶段,包括词法分析、语法分析、语义分析以及...

    javac源码免费下载

    Java编译器(javac)是Java开发工具包(JDK)的核心组件,它负责将编写好的Java源代码(.java文件)转换成Java字节码(.class文件),使得这些字节码可以在Java虚拟机(JVM)上运行。在深入理解javac源码的过程中,...

Global site tag (gtag.js) - Google Analytics