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会把部分“热点代码”翻译成本地机器相关的机器码,并进行优化,然后再把翻译后的机器码缓存起来,以备下次使用。
优化技术
- 公共子表达式消除
- 数组范围检查消除
- 方法内联
- 逃逸分析
上面优化技术,具体的不展开了。因为工作上没怎么用到过,只需要了解就行了