javac编译器(前端编译器)就是把.java(源代码)文件编译成.class(字节码)文件.
编译过程
-----
1.词法,语法分析
词法分析是将源代码一个字节一个字节的读进来,根据关键字、变量名,字面量,运算符进行做Token标记.就是把Java代码分解,成为一个个独立的词并进行标记,构成标记集合.如下:// Token.PUBLIC Token.VOID Token.TEST
public void Test(){
//Token.INT Token.I 等.
int i = a + b ;
}语法分析就是 把标记集合,生成语法树,树上的每一个节点代表着程序的一个语法结构,如操作,运算或方法调用等.假装这里有张语法树的图.png
2.填充符号表
随后,就会是填充符号表,把所有的定义填充到符号表中.
3.语义分析
编译器对代码进行各种检查和优化,而实际操作的对象就是语法树中的节点.
检查语法是否规范,例如变量类型是否正确,方法和类的访问是否合法.再检查语法是否符合逻辑.
对代码进行一些简单的优化,去除无用代码,比空的if语句,变量的自动转换,自动装箱拆箱.还会去除语法糖,如把foreach转换为for循环等.
4.字节码生成
把前面各个步骤所生成的信息转化成字节码写到磁盘中,同时把实例构造器和类构造器方法添加到语法树中(这里实例构造器指的是自己重载的构造器,若没有提供任何构造器,则编译器自动添加无参构造器,这个工作在填充符号表阶段就完成了).标识符
标识符就是用户编程时使用的名字,用于给变量,常量,函数,语句块等命名.符号表
符号表是(编译器和解释器)中的数据结构.在符号表中,源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如数据类型,作用域以及内存地址.
符号表在编译程序的过程中需要不断收集,记录和使用源代码中一些关于语法符号的类型和特征等信息.这些信息一般以表格形式存储于系统中。如常数表、变量名表、数组名表、过程名表、标号表等等,统称为符号表。对于符号表组织、构造和管理方法的好坏会直接影响编译系统的运行效率。
















