美文网首页
8.编译器优化

8.编译器优化

作者: xMustang | 来源:发表于2020-02-22 23:18 被阅读0次

    编译器优化

    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语句中定义和关闭资源。

    相关文章

      网友评论

          本文标题:8.编译器优化

          本文链接:https://www.haomeiwen.com/subject/jytdqhtx.html