深入分析java web javac编译原理(其一)

一、javac是什么

如何将java的语法规则适应到java虚拟机的语法规则中呢?这个任务就由javac编译器来完成。它的任务就是将java语言规范转化为java虚拟机语言规范,完成“翻译”的工作,”翻译“的工作是如何将java的源代码转化为class字节码的。


javac是一种编译器,能将一种语言规范转化成另外一种语言规范,通常编译器都是将便于人理解的语言规范转化成机器容易理解的语言规范,如c,c++或者汇编语言都是将源码直接编译成目标机器吗,这个目标机器码是CPU直接执行的指令集合,这些指令集合也就是底层的一种语言规范,这种语言规范机器能够直接识别,但是人不可能直接去写目标机器码,虽然这种机器码执行非常高效,但是对人不太友好,往往开发这个代码的成本远远高于省下的机器的执行成本,所以才有了编译器的出现,有了编译器才有可能出现了这么多的高级编程语言。


从某种意义上来说,有了编译器才有了程序语言的繁荣,因为编译器是人类和机器沟通的一个纽带,那么回过头来,javac的编译器也是将java这种对人非常友好的编程语言编译成对所有机器都非常友好的一种语言。注意这种语言不是针对某个机器的,甚至包括不同种类,不同平台的机器。如果消除不了不同种类,不同平台机器之间的差别,这个任务就由JVM来完成,而javac的任务就是将java源代码语言先转换成JVM能够识别的一种语言,然后由JVM将JVM语言再转化为这个机器能够识别的机器语言。


javac的任务就是将java源码编译成java字节码,也就是JVM能够识别的二进制码,从表面上看就是上面的部分将.java文件转成.class文件。而实际上是将java的源代码转化为一连串二进制数字,这些二进制数字是有格式的,只有JVM能够正确识别它们到底代表了什么意思。


1.1java编译器的基本结构


javac编译器的作用就是将符合java语言规范的源代码转化成符合java虚拟机规范的java字节码,如何实现这个转换过程,需要哪些模块?


首先,要读取源代码,一个字节一个字节的读进去,找出这些字节中哪些是我们定义的语法关键字,如java中的if,else,for,while等关键词,要识别哪些是合法的关键词,哪些不是,这个步骤叫做词法分析过程。词法分析的结果就是从源代码中找到一些规范化的Token流,就像人类语言中,给你一句话你要能分辨出哪些是一个词语,哪些是标点符号,哪些是动词,哪些是名词等。


接着,就会对这些Token流进行语法分析,这一步就是检查这些关键词组合在一起是不是符合java语言规范,如if的后面是不是紧跟着一个布尔判断表达式,就像人类语言中是不是有主谓宾,主谓宾结合是不是正确的,语法是不是正确。


语法分析的结果就是形成一个符合java语言规范的抽象语法树,抽象语法树是一个结构化的语法表达形式,它的作用是把语言的主要词法用一个结构化的形式组织在一起,就像我们大学中所学的离散数学,用数字的形式来表达非数字但又复杂关系的物质世界,这课语法树可以被我们后面按照新的规范再重新组织,这就是编译器的关键所在。


接下来是语义分析,语法分析后不存在语法问题了,但是语义是不是正确呢?语义分析的主要工作是把一些难懂的,复杂的语法分析转化成更加简单的语法,这个步骤对应到我们人类语言中,就是将难懂的文言文转化成大家懂的白话文或者是注解一下一些成语,便于人们更好的理解。


语义分析的结果就是将复杂的语法转化成最简单的语法,对应到java中,如将forecah转化成for循环结构,还有注解等,最后形成一个注解过后的抽象语法树,这棵语法树更接近目标语言的语法规则。


最后通过字节码生成器生成字节码,将会根据经过注解的抽象语法树生成字节码,也就是将一个数据结构转化为另外一个数据结构,就像将所有中文词语翻译成英文单词后按照英文语法组装成英文语句。


代码生成器的结果就是生成符合java虚拟机规范的字节码了,这个过程需要的组件如图1-1。


javac的各个模块就是完成将java源代码转变成java字节码的任务,所以javac主要就这四个模块,分别是词法分析器,语法分析器,语义分析器和代码生成器,后面会详细分析这四个模块如何完成将源码转变成字节码的。

 


猜你喜欢

转载自blog.csdn.net/darrensty/article/details/78635308