概述 Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler )把字节码转变成机器码的过程 ;还可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler ) 直接把*.java 文件编译成本地机器代码的过程.下面列举了这3类编译过程中一些比较有代表性的编译器.…
一.编译过程 解析和填充符号表的过程 插入注解处理器的注解处理过程 语义分析与字节码生成过程 二.解析和填充符号表 解析包含两个过程:词法分析和语法分析 (一)词法分析 将源代码的字符流转变成标记(Token)集合,如 int aaa = bbb + 2,会被分解成6个标记,[int,aaa,=,bbb,+,2] (二)语法分析 根据Token序列来构造抽象语法树的过程.完成解析之后,下一步是填充符号表 (三)符号表 由一组符号地址和符号信息构成的表格. 符号表登记的内容将用于语义检查和产生中间…
java编译期优化 java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程:1.前端编译:把.java文件转变为.class文件2.后端编译:把字节码转变为机器码3.静态提前编译:直接把*.java文件编译成本地机器代码从JDK1.3开始,虚拟机设计团队就把对性能的优化集中到了后端的即时编译中,这样可以让那些不是由Javac产生的Class文件(如JRuby.Groovy等语言的Class文件)也能享受到编译期优化所带来的好处Java中即时编译在运行期的优化过程对于程序运行来…
1.概述 1.1.编译器的分类 前端编译器:Sun的Javac. Eclipse JDT中的增量式编译器(ECJ)[1].  把*.java文件转变成*.class文件 JIT编译器:HotSpot VM的C1. C2编译器.是指虚拟机的后端运行期编译器 ,把字节码转变成机器码 AOT编译器:GNU Compiler for the Java(GCJ)[2]. Excelsior JET[3] .静态提前编译器 ,直接把*.java文件编译成本地机器代码 1.2.编译期优化的方向 虚拟机设计团队…
java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程: 1.前端编译:把.java文件转变为.class文件 2.后端编译:把字节码转变为机器码 3.静态提前编译:直接把*.java文件编译成本地机器代码 从JDK1.3开始,虚拟机设计团队就把对性能的优化集中到了后端的即时编译中,这样可以让那些不是由Javac产生的Class文件(如JRuby.Groovy等语言的Class文件)也能享受到编译期优化所带来的好处 Java中即时编译在运行期的优化过程对于程序运行来说更重要,…
java语言的"编译期"是一段不确定的过程.由于它可能指的是前端编译器把java文件转变成class字节码文件的过程,也可能指的是虚拟机后端执行期间编译器(JIT)把字节码转变成机器码的过程. 以下讨论的编译期优化指的是javac编译器将java文件转化为字节码的过程,而执行期间优化指的是JIT编译器所做的优化. 编译期优化 虚拟机设计团队把对性能的优化集中到了后端的即时编译器(JIT)中,这样能够让那些不是由javac编译器产生的class文件也相同能享受到编译器优化所带来的优点.…
byte b1 = 5;//编译期检查,判断是否在byte范围内 byte b2 = 5+4;//编译期优化,相当于b2=9 byte b3 = 127;//编译通过,在byte范围内 byte b4 = 128;//编译错误,超出byte范围 // byte b1 = 5; // byte b2 = 4; // byte b3 = b1+b2; //类型提升为int类型 本文章以byte类型赋值来谈谈java编译期的优化和检查: 整数类型的字面量是int类型,所以第一行代码中的5是int类型,…
Java的编译期优化 因为工作的原因,经常会在没有源码的情况下,对一些产品的代码进行阅读.有时在解决Bug时,在运行环境下会直接去看class文件的字节码,来确定运行中版本是否正确的. 在看字节码时,发现了一个有意思的现象:即便你在代码中使用了定义的常量,反编译后的代码仍会是字符串的字面量. 这个其实就是Java编译器在编译时做了优化,下面就用一个例子来说明一下: public class StringTest { public static final String a1="a";…
Java“编译期”是一段“不确定”的操作过程:可能是指一个前端编译器(编译器的前端)把*.java文件转变为*.class文件的过程:可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转变为机器码的过程:可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)直接把*.java文件编译成本地机器代码的过程.这三类编译过程中一些比较有代表性的编译器: 前端编译期:Sun的Javac/EclipseJDT中的增量式编译…
JVM的编译器可以分为三个编译器: 1.前端编译器:把.java转变为.class的过程.如Sun的Javac.Eclipse JDT中的增量式编译器(ECJ). 2.JIT编译器:把字节码转变为机器码的过程,如HotSpot VM的C1.C2编译器. 3.AOT编译器:静态提前编译器,直接将*.java文件编译本地机器代码的过程. Javac编译器 Javac编译器本身是由Java语言编写的程序. Javac的源码和调试javac的源码存放在JDK_SRC_HOME/langtools/src…