Java语言有Java语言的规范,,这个规范详细描述了Java语言有哪些词法、语法,而Java虚拟机也有其Java虚拟机的规范,同样Java虚拟机的规范和Java语言规范并不一样,它们都有自己的词法和语法解析规则,而且解析规则也是不同的。那么如何将Java的语法规则适应到Java虚拟机的语法规则呢?这个任务就由Javac编译器来完成。它的任务就是将Java语言规范转化成Java虚拟机语言规范,完成"翻译工作"。
本文主要围绕如下三个方面来讲解:
第一、Javac是什么;
第二、Javac编译器的基本结构;
一、Javac是什么
Javac是一种编译器,能将一种语言规范转成另外一种语言规范,通常编译器都是将人易理解的语言规范转化成机器易理解的语言规范,如C、C++、Python或者汇编语言都是将源码直接编译成目标机器码,这个目标机器码是CPU直接执行的指令集合。这些指令集合也就是底层的一种语言规范,这种语言规范机器能够直接识别,但是人不可能直接去写目标机器码。虽然这种机器码执行非常高效,但是对人太不友好了,往往开发这个代码的成本远远高于省下的机器的执行成本,所以才有了编译器,有了编译器才有可能出现如此多的高级语言。
从某种意义上说,有了编译器才有了程序语言的繁荣,因为编译器是人类和机器的沟通的一个纽带。那么回过头来,Javac的编译器也是将Java这种对人非常友好的编程语言编译成对所有机器都非常友好的一种语言。注意,这种语言不是针对某个机器的,甚至包括不同种类、不同平台的及其。如何消除不同种类、不同平台机器之间的差别,这个任务就由JVM来完成,而Javac的任务就是将Java源代码语言先转换成JVM能够识别的一种语言,然后由JVM将JVM语言再转化成当前这个机器能够识别的机器语言。
所以这样看来,Java语言要比其他语言(如C语言)多了一层转换,这一层转换虽然牺牲了一些执行效率,但是向Java语言的开发者屏蔽了许多和目标机器相关的细节,使得Java语言的执行和平台无关,这也成就了Java语言的繁荣。
二、Java编译器的基本结构
比如拿Java运行原理简要概述,
总的来说,高级语言基本都遵循一个总的原则:源代码->机器码
流程:
java源文件通过java编译器(javac)生成字节码文件(.class),字节码再通过Java虚拟机转化为机器码。
.java->.class->jvm->机器码
从这里也体现出Java比其他编程语言(比如c语言)多了一步就是jvm。
从上面的图也可以看出Javac主要由词法分析器、语法分析器、语义分析器、代码生成器等四个模块组成。
词法分析器:
词法分析的过程:读取源代码,识别关键字,比如if、else、while、for、swich等等,那些是Java的关键字那些不是。
词法分析的结果:从源代码找出规范的Token流,就像人类语言中,给你一句话,你能分辨出那些是名词、那些是动词、那些是标点符号等等。
语法分析器:
语法分析的过程:对上述Token流进行语法分析,检查关键字组合在一起是否符合Java规范,比如String s不能只声明而不赋值,因为非基本数据类型没有默认值。
语法分析的结果:形成一个符合Java语言规范的抽象语法树,
例如:
Java代码:
抽象成语法树:
语义分析器:
语义分析的过程:难懂复杂的语法转成简单易懂的语法,联系到上学学过的文言文,也就是将文言文翻译成白话文。
语义分析的结果:复杂语法->简单语法
代码生成器:
生成字节码文件
本文主要参考《深入分析JavaWeb技术》
小结:
Java需要通过编译器转化成字节码,通过JVM识别字节码转换cpu可以执行的机器码。而像c/c++这样的高级语言直接就是源码->编译器->机器码。
联系到现实生活中,比如翻译官,特别是外交访问时,一般身边都会有翻译官。翻译官联系到本文就相当于编译器”。