早期(编译器)优化--javac编译器

java语言的“编译期”其实是一段“不确定”的操作过程,可能是指一个前端编译器把.java变成.class的过程,也可能是指虚拟机的后端运行期编译器(JLT)把字节码转变成机器码的过程,也有可能是使用静态提前编译器(AOT)直接把.java文件直接编译成本地机器代码的过程。现在讨论的是第一种编译器。

Javac编译器

①javac的源码与测试

 

运行com.sun.tools.javac.Main的main()方法来执行编译,与命令行中使用javac的命令没什么区别.

编译过程可以分为3个过程:

1.解析与填充符号表过程

2.插入式注解处理器的注解处理过程

3.分析与字节码生成过程

这三个过程的代码逻辑集中在这个类的complie()和compile2()方法中,整个编译最关键的处理就由下面注释的8个方法完成

  initProcessAnnotations(processors);//准备过程:初始化插入式注解处理器

            delegateCompiler =
                processAnnotations//执行注解处理(
                    enterTrees//输入到符号表(stopIfError(CompileState.PARSE, parseFiles//词法分析、语法分析(sourceFileObjects))),
                    classnames);
            compile2()//分析及字节码生成 {
                case BY_TODO:
                while (!todo.isEmpty())
                    generate//生成字节码(desugar//解语法糖(flow//数据流分析(attribute//标注(todo.remove()))));
                break;

}

②解析与填充符号表

解析步骤由parseFiles完成。解析步骤包括词法解析与语法解析两个过程

1.词法、语法解析:

时间: 2024-11-10 11:50:07

早期(编译器)优化--javac编译器的相关文章

Javac编译器早期优化

Java的早期(编译器)优化 1. Javac编译器 1.1 编译步骤 编译过程可分为3个步骤: 解析与填充符号过程 插入式注解处理器的注解处理过程 分析与字节码生成过程 1.2 解析与填充符号表 解析步骤包含了词法分析和语法分析两个过程. 1.2.1 词法.语法分析 词法分析是将源代码的字符流转变为标记(Token)集合,标记是编译过程的最小元素. 语法分析是根据Token序列构建抽象语法树的过程. 抽象语法树是一种用来描述程序代码语法结构的树形表示方式,语法树中的每一个节点都代表着程序代码中

深入理解JVM读书笔记四: (早期)编译器优化

10.1概述 Java 语言的 "编译期" 其实是一段 "不确定" 的操作过程,因为它可能是指一个前端编译器(其实叫 "编译器的前端" 更准确一些)把 .java 文件转变成 .class 文件的过程:也可能是指虚拟机的后端运行期编译器(JIT 编译器,Just In Time Compiler)把字节码转变成机器码的过程:还可能是指使用静态提前编译器(AOT 编译器,Ahead Of Time Compiler)直接把 *.java 文件编译成

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +

编译器,优化,及目标代码生成.

本文介绍从源文件开始到目标代码生成的过程. 首先,是我们每天都要接触的源文件.源文件是由纯ASCII或者其他字符集组成的文本,由程序员使用文本编辑器创建.它有以下的几种形式 纯文本.好处是易于维护.并且可以使用处理文本文件的程序来处理源文件. 这个就是我们最常见的源代码形式了.甚至可以使用notepad来处理源文件! 记号化的源文件.使用专门的单字节"记号"值来表示源文件中的保留字等语句元素. 好处1:尺寸小,由于使用单字节的符号来"压缩"多字符的保留字,所以比纯文

C语言 之编译器优化

C语言的编译器会对变量和代码进行一定的优化,我们看下面这个例子. int a,b,c; a=1; b=a; c=b; 这个程序正常运行的时候会这样子:先把a指向的内存空间内放入1 再把a指向的内存空间里的数读出来放到b指向的内存空间, 最后再把b指向的内存空间里的数读出来放到c指向的内存空间里. 然而编译器要对这个程序进行一定的优化,编译的时候,直接把1放入三个内存空间中. 这样子在正常运行的时候确实是好事,但是总会有一些特殊的情况发生,比如,一个中断程序突然改变了a的值,那么会发生这样的情况:

编译器优化陷阱——全局指针多次使用异常

做程序开发一定会和编译器打交道,编译器优化可以给我们代码运行带来一定的提升,但也可能存在一些意想不到的问题.下面就是我在开发时候遇到的一个坑,希望可以给大家一些借鉴 直接上代码说话吧 1 static unsigned char* s_data = NULL; //存储一帧视频数据 2 void DoRendering () 3 { 4 // D3D11 case 5 if (s_DeviceType == kUnityGfxRendererD3D11 && EnsureD3D11Reso

C#编译器优化那点事

使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的. 优化代码开关即optimize开关,和debug开关一起,有以下几种组合. | 编译器开关设置 |C#IL代码质量 | JIT本地代码质量 | | ------------- |:-------------:| -----:| | /optimize- /debug-(默认) | 未优化 | 有优化 | | /optimize-

对String类型的认识以及编译器优化

Java中String不是基本类型,但是有些时候和基本类型差不多,如String b = "tao" ; 可以对变量直接赋值,而不用 new 一个对象(当然也可以用 new). Java中的变量和基本类型的值存放于栈内存,而new出来的对象本身存放于堆内存,指向对象的引用还是存放在栈内存.例如如下的代码: int  i=1; String s =  new  String( "Hello World" ); 变量i和s以及1存放在栈内存,而s指向的对象"H

Linux运行c++程序gcc编译器和g++编译器的区别

gcc编译器和g++编译器在编译时都要经过这三个步骤:1.预处理生成.i文件 2.预处理后转换为汇编生成.s文件 3.汇编转化为机器码生成可执行的.o文件 4.连接生成可执行文件 但是在gcc编译器中,是不能直接连接c++库的,所以在链接过程中会出错,只要在链接命令后面加上一个"-lstdc++"即可实现.. gcc和g++都可以编译c和c++代码,.c文件g++会把其当做c++文件,而.cpp文件,两者都会识别为c++文件,编译阶段g++会调用gcc.但是gcc不能和c++程序的库相