深入理解jvm读书笔记17 jvm编译系统
前面已经学习过jvm的内存系统、执行系统,现在来看下jvm的编译系统。
下图第一排和第三排那条分支是传统编译原理中程序代码到目标机器代码的生成过程,而中间那条分支就是解释执行的过程。
前端编译器
前端编译器是指把java文件编译成.class字节码文件的编译器,如Sun的javac,Eclipse JDT中的增量式编译器(ECJ),前端编译器基本不会对代码进行优化,它的主要作用是改善程序员的编码风格和提高编码效率。相当多的java语法特性,都是靠编译器的"语法糖"来实现的,例如泛型、for each语法、可变参数等语法。
javac编译器是使用java语言实现的。
编译过程
解析与填充符号表
解析过程包括词法分析和语法分析两个步骤。
词法分析:
语法分析:
经过语法分析获得抽象语法树后,编译器就基本不会对源码文件操作了,后续的操作都建立在抽象语法树之上。
填充符号表:
词法分析和语法分析后,下一步就是填充符号表,符号表是由一组符号地址和符号信息组成的表格,可以把它想成哈希表中的K-V对的形式。
注解处理
虽然这个步骤名字叫注解处理,但实际上注解处理器可以处理语法树的任意节点,所以通过这一步我们可以添加、修改、删除语法树中的任意节点。
语义分析与字节码生成
语义分析分为标注检查和数据及控制流分析两个步骤。
- 标注检查
标注检查步骤检查的内容包括诸如变量使用前是否已声明、变量与赋值之间的数据类型是否能够匹配等。
- 数据及控制流分析
- 解语法糖
- 字节码生成
编译器
即时编译器
编译优化技术
公共子表达式消除
数组边界消除
方法内联
逃逸分析