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. Robot Framework(Databaselibrary库操作)

    1.安装 DatabaseLibrary 库 DatabaseLibrary 下载地址:https://pypi.python.org/pypi/robotframework-databaselibr ...

  2. 判断文本(text_to_be_present_in_element)

    判断文本 在做结果判断的时候,经常想判断某个元素中是否存在指定的文本,如登录后判断页面中是账号是否是该用户的用户名.在前面的登录案例中,写了一个简单的方法,但不是公用的,在 EC 模块有个方法是可以专 ...

  3. 分布式集群HBase启动后某节点的HRegionServer自动消失问题

    详细问题   我这里是,我的这个slave1的HRegionServer 进程启动后,不久自动消失.           去查看日志,排查问题: 发现问题: 解决办法 [hadoop@master h ...

  4. linux下创建网卡配置

    大家都知道linux系统一般作为服务器来用,而且很多情况的设置都是需要通过字符界面修改配置文件来设置.比如说配置网卡IP是修改/etc下面的 ifcfg-eth0,如果配置文件没有了怎么办呢?本经验以 ...

  5. extern、 const、static的理解

    1.extern:是一个声明,用来告诉编译器其它文件中存在这个变量,可以拿到使用.是文件级的 2.static:   是一个文件内的声明,只能在本文件内使用,是文件中的(函数级的) 3.const   ...

  6. bitbucket 源代码托管

    5个人以下可以免费使用,不限制仓库的数量; 国外的注册需要开启蓝灯FQ; 1.注册账号 maanshancss w1-g1@qq.com;创建仓库; 然后拷贝现有项目 然后提交 然后push; 2.写 ...

  7. ODBC, OLEDB, ADO, ADO.NET

    在SSIS中,选择Connction Manager时,有很多的类型.其中会发现如下4个连接类型ODBC, OLEDB, ADO, ADO.NET.这4个东东到底是什么,他们有什么关联,什么区别,如何 ...

  8. linux压缩和解压缩命令大全[转]

    .tar 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName ------------------------------------- ...

  9. 二:Redis数据类型

    一.nosql(非关系性数据库): mongoDB hbase redis nulch hive pig mahout zookeeper 二:redis 数据类型 1.存储string: 常用命令 ...

  10. Browser对象之Window对象

    对象属性 对象方法 setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInte ...