JVM之编译

什么是编译?

程序员写完代码是.java文件,我们的机器是不认识的。需要通过JVM把字节码翻译成机器语言,而不同平台安装不同版本的JVM即可编译成具有对应平台特性的机器语言。

编译步骤

compile-1.png-40.9kB

前端编译

我们所熟知的javac的编译就是前端编译。将.java文件编译成.class文件

下面的步骤歌跟英语语句理解一样

词法分析

先分析每个单词有没有拼写错误。

这里指找出其中我们定义好的关键字,找出规范化的Token流。

语法分析

语法有没有错误,比如主谓宾。

这里指java语言规范(如在if后面是不是紧跟着一个布尔判断表达式),形成一个符合java语言规范的抽象语法树。

语义分析

这段语句所表达的意思是否正确。

这里指将一些难懂的、复杂的语法转化成更加简单的语法,结果形成最简单的语法(如将foreach转换成for循环、注解等)。形成一个注解过后的抽象语法树,这个语法树更为接近目标语言的语法规则。

中间代码

通过字节码生产器将经过注解的抽象语法树转化成符合jvm规范的字节码

该中间代码有两个重要的性质:

  • 易于生成
  • 能够轻松地翻译为目标机器上的语言

后端编译

后端编译主要指与目标机有关的部分,包括代码优化和目标代码生成等。

这部分编译主要是JVM通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译成机器码

JIT优化

上面说的后端编译,每次方法执行JVM通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译成机器码。很显然,经过解释执行,其执行速度必然会比直接执行的二进制字节码程序慢很多。为了解决这种效率问题,引入了 JIT 技术。

JAVA程序先通过解释器进行解释执行,当JVM发现某个方法或代码块运行特别频繁的时候,就会认为这是“热点代码”(Hot Spot Code)。然后JIT会把部分“热点代码”翻译成本地机器相关的机器码,并进行优化,然后再把翻译后的机器码缓存起来,以备下次使用。

优化技术

  1. 公共子表达式消除
  2. 数组范围检查消除
  3. 方法内联
  4. 逃逸分析

上面优化技术,具体的不展开了。因为工作上没怎么用到过,只需要了解就行了

你可能感兴趣的:(JVM之编译)