java中反编译命令:javap
汇编语言本质上是一种助记符
编译程序和解释程序两大不同:
编译程序分为五个阶段
——————————————————以此为界,上面是前端,下面是后端
目标代码生成
在编译过程中,编译程序不断地和符号表管理程序和错误处理程序打交道
遍:编译程序对源程序或等价程序扫描的遍数
在整个编译过程中,看似扫描了五遍,其实只有两遍,分别是对前端和后端进行的扫描
即第一遍:词法分析、语法分析、语义分析。
第二遍:代码优化和中间代码生成
每遍中的各阶段的工作是穿插进行的,例如下图:
其中,语法分析器处于核心地位,每当语法分析器需要一个完整的语法单位时,便向词法分析器请求一个Token。当接收到所需要的token之后,便调用语义分析器生成中间代码。
涉及三个语言:源语言、目标语言 和 编译程序的实现语言
编译程序的生成方法:
自动生成编译程序:
输入:词法规则、语法规则和语义解释
对如下C语言程序进行编译:
int a,b;
b = a + 2*5;
词法分析的结果是以token的形式传给语法分析
生成结果是一棵语法树
分支语句由变量和表达式组成:
语义分析需要构建两个东西——标识符的语义辞典(符号表)&语句的语义树(中间语言)
符号表分为:
接下来是语义树,和语法树很类似,但是是完全不同的,前者是描述语义信息,而后者描述的确实构成。
当然了,还可以采用四元式的形式:
为了提高运算速度,这里可以进行的优化是将2*5直接运算出来,不需要特意为它生成一条中间代码。
下图是对b=a+2*5优化之后的结果:
这里采用汇编指令作为目标代码,对步骤四中的中间代码对应生成三条汇编指令:
LD R,10 ;将10加载到寄存器中
ADD R,a ;将a与寄存器相加
ST R,b ;将寄存器中的值存储(store)到b中
原文:https://www.cnblogs.com/huangming-zzz/p/10661967.html