java编译器是什么?
编译简单理解就是一种高级语言到另一种低级语言的翻译过程;而执行这个过程的主体称为编译器。寻常所说的编译器是指把汇编语言转变成机器语言,也称目标代码,即CPU指令集。汇编语言是一种比机器语言对人友好的语言,但不同机器硬件构造不一样,驱动机器的软件也不一样,因此汇编语言需要针对不同的机器编写不同的代码,显得有点麻烦。为解决这个问题,聪明的工程师想到一种方法,即采用虚拟机的形式屏蔽底层硬件和软件平台的不同,也就是说,高级语言的编写不受底层硬件的影响,达到“一次编译,到处运行”的效果。
很明显,“一次编译,到处运行”的功能寄托于虚拟机;java语言是基于java虚拟机(JVM)而实现的一种高级语言,它需要通过java编译器编译成JVM识别的语言,最后由JVM实现到目标语言的转换。
javac的作用?
javac是把java高级语言转变成JVM识别的一种二进制代码;具体体现就是.java文件到.class文件的转变;JVM识别的.class文件存储的是字节码;而转变的正确性则是由JVM的语言规范来保证,所以java编译器的作用可以理解为把java语言规范转变成JVM语言规范。
javac的主要过程?
从java语言到字节码的转变要经过四个过程:①java语言到Token流的过程,称为词法分析;②Token流到抽象语法树的过程,称为语法分析;③解析复杂的树节点,如语法糖的解析等,称为语义分析;④抽象语法树到字节码的过程,称为代码生成。
至于为什么要分为这四个步骤?
抽象语法树是关键。抽象语法树可以把一种语言结构重组为另外一种语言结构,这里可以简单理解为java语言规范到JVM语言规范的转变。
这篇博客首先来看一下词法分析的过程。
何为词法分析?
词法分析从字面来理解就是解析java语言中的单词;单纯的从字面来看,java文件由java关键字、标识符(包名、类名、属性名和方法名)以及符号(各类运算符、各类括号)等三部分组成。词法分析的主要目的就是把这些单词和符号转变成Token流。那么什么是Token流呢,后面会讲到。