JavaC编译原理

一、什么是JavaC

        javac就是一个种编译器,它的功能就是将java源代码翻译成JVM可以识别的二进制码,简单一点就是将.java文件转换成.class文件

过程如图:

JavaC编译原理

二、JavaC的编译过程:

JavaC编译原理

词法分析器:

        主要是逐行读取源代码,然后将源代码匹配到Token流,即使识别每一个单词是什么东西,如package匹配到Token.PACKAGE,class匹配到Token.CLASS,类名或者变量名匹配成Token.IDENTIFIER,如:

JavaC编译原理

语法分析器:

        将Token流转换成更加结构化的语法树,就好像是给上面的单词组装成一个完整的句子。

语义分析器:

        将上面的语法数再精简和处理,如添加默认构造函数,检查变量初始化,类型是否匹配,指令重排序,检查exception是否抛出,解除java语法糖等。

代码生成器:

        将语法树生成java字节码,可通过jvm虚拟机运行。

整体步骤图如下:

JavaC编译原理


ps:

语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·兰丁发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性

举例来说,许多程序语言提供专门的语法来对数组中的元素进行引用和更新。从理论上来讲,一个数组元素的引用涉及到两个参数:数组和下标向量,比如这样的表达式,get_array(Array, vector(i, j))。然而,许多语言支持这样直接引用 Array[i, j]。同理,数组元素的更新涉及到三个参数,set_array(Array, vector(i, j), value),但是很多语言提供这样直接赋值,Array[i, j] = value。

JavaC编译原理

JavaC编译原理

关联知识:

指令重排序:

在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 
1. 在单线程环境下不能改变程序运行的结果; 
2. 存在数据依赖关系的不允许重排序

访问者模式:

封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

JavaC编译原理