8.编译器优化

2020-02-22  本文已影响0人  xMustang

编译器优化

1. 概述

编译期包括:

  1. 前端编译器把.java转变为.class
  2. 虚拟机的后端运行期编译器(JIT编译器)把字节码转变为机器码
  3. 使用静态提前编译器(AOT编译器)直接把.java编译成本地机器码

本章讲述针对上面第一类编译过程的优化。

前端编译器做了很多针对Java语言编码过程的优化措施改善程序编码风格、提高编码效率。

2. javac编译器

javac编译过程:

  1. 解析与填充符号表
  2. 插入式注解处理器的注解处理过程
  3. 分析与字节码生成

3. Java语法糖

  1. 泛型与类型擦除

    Map<String,String> map = new HashMap<>();
    map.put("a","啊");
    System.out.println(map.get("a"));
    
    泛型擦除后(下面代码是反编译上面代码的字节码)
    Map map = new HashMap();
    map.put("a","啊");
    System.out.println((String)map.get("a"));
    

    泛型擦除仅仅是对方法的Code属性中的字节码擦除,实际上元数据中还是保留了泛型信息(Signature属性),这是能通过反射手段取得参数化类型的根本依据。

  2. 自动装箱、拆箱、遍历循环

    自动装箱、拆箱在编译后被转换为了对应的包装和还原方法,遍历代码则把代码转化为了迭代器的实现。

    List<Integer> list = Arrays.asList(1);
    
    int sum = 0;
    for(int i : list){
        sum += i;
    }
    
    
    反编译上面代码的字节码
    List<Integer> list = Arrays.asList(new Integer[](Integer.valueOf(1));
    
    int sum = 0;
    // 此处是被遍历循环的类要实现Interator接口的原因
    for(Interator localInterator = list.interator();localInterator.hasNext();){
        int i = ((Integer)localInterator.next()).intValue();
        sum += i;
    }
    
  3. 条件编译

    if(true){
        System.out.println("block 1");
    }else{
        Syetem.out.println("block 2");
    }
    
  4. 其他语法糖

    有内部类、枚举类、断言语句、对枚举和字符串的switch支持、try语句中定义和关闭资源。

上一篇下一篇

猜你喜欢

热点阅读