Java学习笔记 (七) Java中的编译与反编译

Java中的编译

    Java语言的编译期是一段“不确定”的操作过程,因为它可能是指一个前端编译器(或编译器的
前端)把.java文件转化为.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,
Just In Time Compiler)把字节码转变成机器码的过程;还有可能是指使用静态提前编译器(AOT
编译器,Ahead Of Time Compiler)直接把.java文件编译成本地机器代码的过程。

前端编译Javac编译器

JAVA中的前端编译指的就是将.java文件编译成.class文件 ,大概流程是这个样子的: 词法分析->
语法分析->填充符号表->语义分析及字节码生成,字节码生成是javac编译过程的最后一
个阶段,这个阶段会把前面各个步骤生成的信息(语法树、符号表)转换成字节码写入到磁盘中。

词法分析

词法分析是将源代码的字符流转变为标记(Token)集合,单个字符是程序编写过程的最小元素,而标记
则是编译过程中的最小元素,关键字、变量名、字面量、运算符都可以成为标记,如"int a=b+2"这句
代码包含了6个标记,分别是int、a、=、b、+、2,虽然关键字int由三个字符组成,但是它只是一个
Token,不可在拆分。

语法分析

语法分析是根据Token序列构造语法树的过程,抽象语法树(Abstract Syntax Tree,AST),是一种
用来描述程序代码语法结构的树形表示方式,语法树的每一个节点都代表着程序代码中的一个语法结构(
Construct),例如包、类型、修饰符、运算符、接口、返回值甚至代码注释等都可以是一个语法结构。

填充符号表

完成了词法与语法分析之后,就是填充符号表的过程,符号表(Symbol Table)是由一组符号地址和符
号信息构成的表格。

语义分析

语法分析之后,编译器获得了程序代码的抽象语法树表示,语法树能表示一个结构正确的源程序的抽象,
但无法保证源程序是符合逻辑的。语义分析的主要任务是对结构上正确的源程序进行上下文有关性质的
审查,比如类型审查,如下:
int a=1;
boolean b=false;
char c=2;
后面可能出现的赋值运算
int d=a+c; //可以编译
int d=b+c; //不合逻辑 无法编译
char d=a+c;  //不合逻辑 无法编译
上述赋值运算它们都能构成正确的语法树,但是只有第一种写法在语义上是没有问题的,能够通过编译。
无法编译(是否符合语义逻辑必须限定在具体的语言与具体的上下文环境之中才有意义)

字节码生成

字节码生成是javac编译过程的最后一个阶段, 

Java中的后端编译

Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运
行特别频繁时,就会把这些代码认定为热点代码(Hot Spot Code)。为了提高热点代码的执行效率,
在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这
任务的编译器称为即时编译器(JIT编译器,Just In Time Compiler)。

解释器与编译器

    HotSpot虚拟机中内置了两个即时编译器,分别称为Client Compiler和Server Compiler,
或者简称为C1编译器和C2编译器(也叫Opto 编译器)。
    目前主流的HotSpot虚拟机中默认采用解释器与其中一个编译器直接配合的方式工作,程序使用
哪个编译器,取决于虚拟机运行的模式,HotSpot虚拟机会自动选择运行模式,也可以使用"-client"
或"-server"参数强制指定虚拟机运行client模式还是server模式。
    无论采用的是哪种编译器,解释器与编译器搭配使用的方式在虚拟机中称为混合模式(Mixed Mode)
可以使用参数"-Xint"指定虚拟机运行与解释模式(Interpreted Mode),此时编译器不介入工作,全部
代码都使用解释方式进行,也可以使用参数"-Xcomp"指定虚拟机运行编译模式(Compiled Mode),此
时将优先采用编译方式执行程序,但是解释器仍然要在编译无法进行的情况下介入执行过程,可以通过
虚拟机的"-version"命令的输出结果显示三种模式.

这里写图片描述
这里写图片描述
这里写图片描述

Java中的反编译

1、可以通过javap命令进行反编译

Java学习笔记 (六) Java常用命令 javap java class文件分解器

2、使用cfr进行反编译

cfr官网入口。。。。。。。。。。。。。。。

java -jar cfr包名 class文件  //反编译单个.class文件时
java -jar cfr包名 jar包名 --outputdir D:/Java/tmp //反编译jar包

这里写图片描述

3、其他反编译工具

点此进入。。。。。。。。。。。。。。。

参考资料

猜你喜欢

转载自blog.csdn.net/weixin_39913200/article/details/81208861