画布 1
Chapter10.前端编译与优化
  参考文档
    https://www.jianshu.com/p/b1d2608848dd
  三种编译方式
    前端编译
      说明
        把Java源码文件（.java）编译成Class文件(.class)的过程；
        也即把满足Java语言规范的程序转化为满足JVM规范所要求格式的功能；
      优点
        这阶段的优化是指程序编码方面的；
        许多Java语法新特性（"语法糖"：泛型、内部类等等），是靠前端编译器实现的,而不是依赖虚拟机；
        编译成的Class文件可以直接给JVM解释器解释执行，省去编译时间，加快启动速度；
      缺点
        对代码运行效率几乎没有任何优化措施；
        解释执行效率较低，所以需要结合下面的JIT编译；
      包含
        Oracle javac、Eclipse JDT中的增量式编译器（ECJ）等;
    后端编译/即时(JIT)编译
      说明
        通过Java虚拟机（JVM）内置的即时编译器（Just In Time Compiler，JIT编译器），在运行时把Class文件字节码编译成本地机器码的过程；
        JIT编译速度及编译结果的优劣，是衡量一个JVM性能的很重要指标；
所以对程序运行性能优化集中到这个阶段；
也就是说可以对这个阶段进行JVM调优；
      优点
        通过在运行时收集监控信息，把"热点代码"（Hot Spot Code）编译成与本地平台相关的机器码，并进行各种层次的优化；
        可以大大提高执行效率；
      缺点
        收集监控信息影响程序运行；
        编译过程占用程序运行时间（如使得启动速度变慢）；
        编译机器码占用内存；
      包含
        HotSpot虚拟机的C1、C2编译器等；
    静态提前编译（Ahead Of Time，AOT编译）
      说明
        程序运行前，直接把Java源码文件（.java）编译成本地机器码的过程；
      优点
        编译不占用运行时间，可以做一些较耗时的优化，并可加快程序启动；
        把编译的本地机器码保存磁盘，不占用内存，并可多次使用；
      缺点
        因为Java语言的动态性（如反射）带来了额外的复杂性，影响了静态编译代码的质量；
        一般静态编译不如JIT编译的质量，这种方式用得比较少；
      包含
        JAOTC、GCJ、Excelsior JET、ART (Android Runtime)等；
        C++里面的预编译 #if 等
  JAVA主流编译方式
    前端编译+JIT编译
    例如：HotSpot虚拟机
    主要过程
      首先通过前端编译把符合Java语言规范的程序代码转化为满足JVM规范所要求Class格式；
      然后程序启动时Class格式文件发挥作用，解释执行，省去编译时间，加快启动速度；
      针对Class解释执行效率低的问题，在运行中收集性能监控信息，得知"热点代码"；
      JIT逐渐发挥作用，把越来越多的热点代码"编译优化成本地代码，提高执行效率；
  JAVA前端编译
    前端编译：java > class 的过程
    javac编译过程
  JAVA语法糖
    泛型
      C++
        具现化式泛型
          泛型也是一个类型，编译后也存在，List<int>与List<string>是2个不同的类型
          历史背景：直接新增一套泛型的类型，与原有类型不兼容
      JAVA
        类型擦除式泛型
          编译后字节码文件中，泛型被替换为裸类型
          擦除法：仅是方法的Code属性的字节码擦除，源数据还是保留了泛型信息，所以通过反射获取参数化类型
          历史背景：兼容历史List，把原来的List改为支持泛型的类。所以就需要类型擦除
          弊端
            运行时无法取到泛型的类型信息
            类型擦除带来了一些模糊的情况
    自动装箱、拆箱与循环遍历
    条件编译
      直接的if判断，编译后会直接计算得到应该走哪个分支，类似于C++的条件编译
    其他：lambda、try处理resource等等