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、编译期优化的方向

虚拟机设计团队把对性能的优化集中到了后端的即时编译器中,这样可以让那些不是由Javac产生的Class文件(如JRuby、 Groovy等语言的Class文件)也同样能享受到编译器优化所带来的好处。

但是Javac做了许多针对Java语言编码过程的优化措施来改善程序员的编码风格和提高编码效率。

相当多新生的Java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖虚拟机的底层改进来支持,

可以说,Java中即时编译器在运行期的优化过程对于程序运行来说更重要,而前端编译器在编译期的优化过程对于程序编码来说关系更加密切。

所以,本章后面主要是介绍编译器执行过程和语法糖。

2、Javac编译器

javac本身就是一个由Java语言编写的程序 ,源码存放在JDK_SRC_HOME/langtools/src/share/classes/com/sun/tools/javac

从SunJavac的代码来看,编译过程大致可以分为3个过程,分别是:
  解析与填充符号表过程。
  插入式注解处理器的注解处理过程。
  分析与字节码生成过程。
这3个步骤之间的关系与交互顺序如图10-4所示。

Javac编译动作的入口是com.sun.tools.javac.main.JavaCompiler类,上述3个过程的代码逻辑集中在这个类的compile()和compile2()方法中 。代码详略。

2.1、解析与填充符号表

1.词法、 语法分析

词法分析是将源代码的字符流转变为标记(Token)集合,单个字符是程序编写过程的最小元素,而标记则是编译过程的最小元素 。

在Javac的源码中,语法分析过程由com.sun.tools.javac.parser.Parser类实现,这个阶段产出的抽象语法树由com.sun.tools.javac.tree.JCTree类表示,

经过这个步骤之后,编译器就基本不会再对源码文件进行操作了,后续的操作都建立在抽象语法树之上。

2.填充符号表

填充符号表的过程由com.sun.tools.javac.comp.Enter类实现

2.3 注解处理器

2.4 语义分析与字节码生成

1.标注检查

2.数据及控制流分析

3.解语法糖

4.字节码生成

3、Java语法糖的味道

3.1 泛型与类型擦除

Java的泛型在编译时是把泛型替换了的,专业名字叫“泛型擦除”,所以在编译后是指向同一种类型的,也就是说ArrayList<int>与ArrayList<String> 是同一个类。

所以,对泛型重载,是不可以的。

void fun(ArrayList<int>)

void fun(ArrayList<String>)

这是会报错的。

但,如果两个函数的返回值不同,又不可以执行,这是java在一定程度上的妥协,但结果却未被了重载本身的要素,不能通过返回值去指派一个方法调用。

所以,java的泛型设计是被很多人吐槽的。

3.2 自动装箱、 拆箱与遍历循环

自动装箱是自动加了 Integer.valueOf()之类的方法

循环遍历是自动添加了迭代器。

3.3 条件编译

在C/C++中有#if来控制是否参与编译,但在java里为何没有?

原因是不需要。

因为Java语言天然的编译方式(编译器并非一个个地编译Java文件,而是将所有编译单元的语法树顶级节点输入到待处理列表后再进行编译,因此各个文件之间能够互相提供符号信息)无须使用预处理器。

虽然不需要,但java里也可以模拟条件编译,编译器在一些特定条件下可以把一些分支给优化掉,条件就是if(true)的else分支。

4 实战:插入式注解处理器

未懂。

【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.1.编译期优化。这章编译和实战部分没理解通,以后再看。的更多相关文章

  1. 深入理解Java虚拟机(第三版)-14. 线程安全与锁优化

    14. 线程安全与锁优化 1. 什么是线程安全? 当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替进行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个 ...

  2. 深入理解Java虚拟机--下

    深入理解Java虚拟机--下 参考:https://www.zybuluo.com/jewes/note/57352 第10章 早期(编译期)优化 10.1 概述 Java语言的"编译期&q ...

  3. 深入理解Java虚拟机之自己编译JDK

    题外话 最近在阅读<深入理解Java虚拟机>,其中有一小节实战是自己编译JDK,实际操作下来后遇到问题不少,为此特地记录,也希望可以给大家带来一些参考! 前置准备 平台及工具:Window ...

  4. 深入理解Java虚拟机(程序编译与代码优化)

    文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...

  5. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  6. 《深入理解 java虚拟机》学习笔记

    java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.

  7. 理解Java虚拟机体系结构

    1 概述 众所周知,Java支持平台无关性.安全性和网络移动性.而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么.正是得益于Jav ...

  8. (1) 深入理解Java虚拟机到底是什么?

    好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机   作为一个Java程序员,我们每天都在写Java ...

  9. 深入理解java虚拟机(6)---内存模型与线程 & Volatile

    其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是 ...

随机推荐

  1. Hibernate实体类编写规则和主键策略

    一.实体类的编写规则 1.属性要是私有的. 2.要有公开的setter和getter方法供外界访问和修改. 3.每一个实体类要有一个属性作为唯一值(一般都是使用对于数据表的主键). 4.建议数据类型不 ...

  2. Golang教程:方法

    什么是方法 一个方法只是一个函数,它有一个特殊的接收者(receiver)类型,该接收者放在 func 关键字和函数名之间.接收者可以是结构体类型或非结构体类型.可以在方法内部访问接收者. 通过下面的 ...

  3. 深入理解JavaScript系列(39):设计模式之适配器模式

    介绍 适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不能一起工作的那些类(对象)可以一些工作.速成包装 ...

  4. virtualbox xp连不上网

    设置->网络->连接方式:网络地址转换(NAT)->高级->控制芯片:PCnet-FAST III(....) 鸣谢:百度网友:“dei比” 的精彩回答

  5. centos 同步网络时间

    centos 同步网络时间 # yum -y install ntp ntpdate # ntpdate cn.pool.ntp.org # date

  6. package.json中^符号和~符号前缀的区别

          开发中经常会使用npm install 安装依赖包,经常会看到^符号和~符号,现将二者的区别总结如下:     版本号 x.y.z : z :表示一些小的bugfix, 更改z的号, y ...

  7. [android] 安卓自定义样式和主题

    简单练习自定义样式和主题,样式是加在View上,主题是加在Application或者Activity上 styles.xml <?xml version="1.0" enco ...

  8. SQL练习(一)

    查找今天过生日的同学 这里表中已经存储了生日,所以思路是取出date_birth去今天的日期相比较 SELECT NAME,date_birth FROM org_mhi_studentfiles W ...

  9. 用图片替代cursor光标样式

    鼠标光标样式有限,可参考http://css-cursor.techstream.org/,自定义光标样式可用设置cursor:url('xxx.cur'),auto;.还有一种办法,就是用图片替代鼠 ...

  10. ugui之圆角矩形头像实现

    这个是参考大神的修改了一下渲染方式实现的,可以去查看原帖的,原贴是圆形头像,原理讲的非常详细 点击这里 我写的这个只支持正方形图片,效果是酱紫的~ 一共三个代码,还需要两个代码,原帖里都有的,我只是修 ...