深入理解Java虚拟机之Javac编译器

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.字节码生成
		把前面各个步骤所生成的信息转化成字节码写到磁盘中,同时把实例构造器和类构造器方法添加到语法树中(这里实例构造器指的是自己重载的构造器,若没有提供任何构造器,则编译器自动添加无参构造器,这个工作在填充符号表阶段就完成了).

标识符

	标识符就是用户编程时使用的名字,用于给变量,常量,函数,语句块等命名.

符号表

	符号表是(编译器和解释器)中的数据结构.在符号表中,源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如数据类型,作用域以及内存地址.
	符号表在编译程序的过程中需要不断收集,记录和使用源代码中一些关于语法符号的类型和特征等信息.这些信息一般以表格形式存储于系统中。如常数表、变量名表、数组名表、过程名表、标号表等等,统称为符号表。对于符号表组织、构造和管理方法的好坏会直接影响编译系统的运行效率。

你可能感兴趣的:(虚拟机)