java 语言的编译期有3 种
【1】 将.java 编译成 .class 也成为 编译器的前端 ,比如就javac
【2】 将 字节码转换成 机器码。 编译器的后端。比如jit。 (just in time compiler)
【3】静态提前编译器。 直接把.java 转化为 机器码。aot(ahead of time compiler)
javac 编译器
3 个过程。
【1】 解析与填充符号表。包含 a 词法、语法分析 b 填充符号表
a 将 源码的字符流装变为 token(标记) 集合,单个字符是编写的最小元素,而标记则是编译过程的最小元素,比如 关键字、变量名、字面量、运算符都是标记,比如 int a= b+c 有 6个标记 分别是 int 、 a、 = 、b、 + 、c。从而生成了 语法树。
b 由一组符号地址和符号信息构成的hash结构。用于 语义检查和产生中间代码。
【2】 注解处理器。
一个插件,可以修改、读取、添加抽象数的任意结构。
【3】语义分析和 字节码生成。
以上之后生成的抽象语法数,可以保证是源程序的抽象,但是无法保证是否符合逻辑。语义分析来保证其符合逻辑。
【标注检查】:检查包括,变量是否被声明,变量的类型是否满足赋值运算。
【数据及控制流分析】对逻辑下文进一步验证。检查包括:方法是否有返回值,所有异常是否都被处理。
生成 字节码。
java 语法糖
泛型
java 里的泛型 是一个伪泛型,它不像c#的泛型一样,在编译的时候生成不同的编码。比如,List<String> 和 List<Integer>,在 c# 里 编译后生成的是两个对象,而在java 里生成的都是 List。用了 擦除法,将参数列表省去了。
自动装箱 和 拆箱 遍历循环
条件编译