java中反编译命令:javap前端
汇编语言本质上是一种助记符java
编译程序和解释程序两大不一样:git
编译程序分为五个阶段github
——————————————————以此为界,上面是前端,下面是后端express
目标代码生成后端
在编译过程当中,编译程序不断地和符号表管理程序和错误处理程序打交道函数
遍:编译程序对源程序或等价程序扫描的遍数优化
在整个编译过程当中,看似扫描了五遍,其实只有两遍,分别是对前端和后端进行的扫描指针
即第一遍:词法分析、语法分析、语义分析。code
第二遍:代码优化和中间代码生成
每遍中的各阶段的工做是穿插进行的,例以下图:
其中,语法分析器处于核心地位,每当语法分析器须要一个完整的语法单位时,便向词法分析器请求一个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中