概述
- jav语言的编译器其实是一段不确定的操作过程,因为它可能是指一个其阿奴单编译器,把*.java文件转成*.class文件的过程,也可能是指虚拟机的后端运行期编译器,吧字节码转成机器码的过程。还可能是指使用静态提前编译器,直接把*.java文件编译成本地机器码代码的过程。
- 前端编译器:sun的JAVAC。
- JIT编译器:HotSpot VM 的C1、C2编译器。
JAVAC编译器
- JAVAC是一个由Java语言编写的程序。
一、JAVAC的源码与调试
-
Sun JAVAC编译过程可以分为3步:
i.解析与填充符号表。
ii.插入式注解处理器的注解处理过程。
iii.分析与字节码生产过程
-
解析与填充符号表
i.词法、语法分析
1).词法分时是将源代码的字符流转变为标记(TOken)集合。单个字符是程序编写过程的元素,儿表会死编译过程的最小元素。 2).语法分析是根据Token序列构造抽象语法树的过程。 3).抽象语法树:是一种用来描述程序代码语法结构的树形表达方式,语法树的每个节点都代表着程序代码中的一个语法结构。 4).经过这个步骤之后,编译器基本不会再对源码文件进行操作了,后续的操作都是建立在抽象语法树上。ii.填充符号表
1).完成此法分析和语法分析之后,下一步就是填充符号表的过程。 2).符号表是由一组符号地址和符号信息构成的表格。 -
注解处理器
i.在JDK1.6中的规范,提供了一组插入式注解处理器的标准,API在编译期间对注解进行处理,我们可以把他看作是一组编译器的查,在这些插件里面,可以读取、修改、添加抽象语法树中的任意元素。
-
语义分析与字节码生产
i. 语义分析主要任务是对结构上正确的源程勋进行上下文有关性质的审查。
ii.标注检查
1).语义分析为标注检查和数据及控制流分析两个步骤。 2).标准检查,主要检查的内容包括变量使用前是否声明,变量与赋值之间的数据类型是否能够匹配。 3).标注检查,还有一个重要的步骤,为常量折叠。 -
数据及控制流分析
i.数据及控制流分析是对程序上下文逻辑进一步的验证,他可以监察处诸如程序局部变量在使用前是否赋值,方法的每条路径是否都有返回值。
-
解语法糖
i.语法糖也称糖衣语法。
ii.预发糖是指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是方便程序员使用。
iii.java中最常用的语法糖主要是泛型变成参数,自动装箱,自动拆箱等。
iiii.虚拟机在运行时不支持这些预发,他们在编译阶段还原回简单基础预发结构,这一过程称为解语法糖。
-
字节码生产
i.字节码生产阶段,把前面各个步骤所生成的信息转化成字节码写到磁盘中。
ii.实例构造器方法和类构造器方法就是在这个阶段添加到语法树中的。
JAVA语法糖的味道
一、泛型与类型擦除
-
泛型的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数,这种参数类型可以再,类,接口和方法的创建者,分别称为泛型类,泛型接口,泛型方法。
-
C#中List 与List 就是两个不同的类型,它们在系统运行期生产,有自己的虚方法表和类型数据,这种实现称为类型膨胀,基于这种方法实现的泛型,称为真实泛型。
-
java语言中的泛型不一样,它在程序源代码中存在编译后的字节码文件,就已经替换为原来的原生类型了,并且在相应的地方插入了强制转型代码。
-
java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型称为伪泛型。
我是菜鸟,希望大家多多留言讨论~谢谢!
我的笔记是看完深入理解java虚拟机的体会,是本好书,推荐给大家.---