编译原理初识

来源:互联网 发布:淘宝店铺怎么升星 编辑:程序博客网 时间:2024/05/01 10:11



编译原理初识,步骤图


1.程序员编写好源程序后,这些源程序所组成的《字符流》经过词法分析转换成《记号流》

2.《记号流》通过语法分析转换成语法树

3.《语法树》通过语义分析得到进一步的语法树

4. 语法树经过中间代码生成器,形成中间代码,中间代码再经过优化,最终生成目标代码


词法分析

通过源程序的字符流,按编程语言的词法规则把它们组成词法“记号流”。 <记号名,属性值>


语法分析

分析“记号流”是否符合语法规则,用各记号的第一元建成一种树形的中间表示,这个中间表示用抽象语法的方式描绘了该记号流的语法情况

其中典型的中间表示为" 语法树 "


语义分析

使用语法树和符号表中的信息,依据语言定义来检查源程序的语义一致性(重要部分:类型检查)


中间代码生成

经过语法和语义分析后,中间表示必须具有两个性质:易于产生并且易于翻译成目标程序

主要采用三地址代码,即每条三地址指令最多有三个操作数

t1 = inttofloat(70)

t2 = id3 * t1

t3 = id2 +t2

id1 = t3


代码优化

试图改进中间代码,产生较好的目标代码,我的理解就是缩减了一些可简化的操作

上面的代码被简化后得到:

t1 = id3 * 70.0

id1 = id2 + t1


代码生成

代码生成取源程序的一种中间表示作为输入并把它映射到一种目标语言

如果目标语言是机器代码,则需要为源程序所用的变量选择寄存器或内存单元,然后把中间指令序列翻译成完成同样任务的机器指令序列

例如:

寄存器R1,R2

MOVF id3, R2    : 把id3的内容存入寄存器R2

MULF #70.0, R2 :   #号表示70.0作为立即数处理,R2里面的值 * 实数70

MOVF id2, R1

ADDF R2,R1 :     把R2 加到R1上

MOVF R1, id1  : 把R1里的值存入地址id1中


符号表管理

编译器的一项重要工作是记录源程序中使用的变量名字,并收集每个名字的各种属性.

这些属性提供该名字有关存储分配,类型和作用域等信息.

符号表是为每个变量名字保存一个记录的数据结构,记录的域是该名字的属性


解释器

解释器不像编译器那样通过翻译来生成目标程序,而是直接执行源程序所指定的运算.


原创粉丝点击