Contents

编译引论(第一章)

编译程序(图)

某一种语言等价地转换成另外一种语言程序(称为目标语言程序)

https://cdn.jsdelivr.net/gh/adan-ning/images/202403051622568.jpg

解释程序(图)

将源程序按动态顺序逐句分晰解释执行,根据语句的含义执行,最终得到运行结果

https://cdn.jsdelivr.net/gh/adan-ning/images/202403051623435.JPG

编译器在语言处理系统中的位置(图)

https://cdn.jsdelivr.net/gh/adan-ning/images/202403051624343.jpg

编译过程

1. 词法分析

任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别一个个单词符号。

依循的原则:构词规则

描述工具:正规式,有限自动机

FOR(保留字) I(标识符) :=(算符) 1(常整数) TO(保留字) 100(常整数) DO(保留字)

2. 语法分析

任务: 在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位。

依循的原则:语法分析

描述工具:上下文无关文法

i(标识符)=5(无符号整数)+3(无符号整数)j(标识符)

3. 中间代码生成

任务:对语法分析所识别出的各类语法单位,分析其含义,并产生中间代码

依循的原则:语义规则

描述工具:属性文法

中间代码是一种独立于硬件的记号系统。常见的中间代码形式有逆波兰表达式,三元式,四元式等

(i+j)(x-y)翻译为四元式

(+,i,j,T1)

(-,x,y,T2)

(,T1,T2,T3)

4. 优化

任务:对当前阶段产生的中间代码进行等价加工变换,以期最终生成的目标代码更加高效

依循的原则:等价变换原则

常见的优化种类有公共子表达式删除,复制传播,无用代码删除和常量合并

(*,5.3,2,T1)

(=,T1, ,x)

优化后:

( =,10.6, ,x)

5. 目标代码产生

任务:把中间代码变换成特定机器上的低级语言代码

该阶段的工作非常复杂,涉及机器指令的选择,寄存器的调度,以及各种数据类型变量的存储空间分配等。

https://cdn.jsdelivr.net/gh/adan-ning/images/202403051627655.jpg

6. 表格管理程序 完成编译过程中的建表,查表,更新数据等有关表格操作

**7. 错误处理程序 **

编译程序不仅能对书写正确的程序进行翻译,而且还能对出现在源程序中的错误进行处理

编译程序的结构

编译程序的总体结构(图)

https://cdn.jsdelivr.net/gh/adan-ning/images/202403061302076.png

相关概念

“遍"的概念

所谓"一遍"是指,对源程序或中间程序从头到尾扫描一次,并作相关加工处理,生成新的中间程序或相关代码

多遍编译程序

把编译的5个阶段应完成的工作分遍来做,每一遍完成一个或相连几个阶段的工作

https://cdn.jsdelivr.net/gh/adan-ning/images/202403061304772.png

前端

通常包括词法分析,语法分析,语义分析及中间代码生成,有的优化工作也可以包括在前端,前端依赖于源程序

后端

通常包括有关代码优化和目标代码生成,依赖于中间代码,计算机的硬件系统和机器指令系统

编译程序开发

自展技术(图)

按照自展技术,需要把源语言L分解成一个核心部分L0与扩充部分L1,L2,….,Ln。分解源语言之后,先用汇编语言或机器语言编写L0的编译程序,然后再用L0编写L1的编译程序,用Li编写Li+n的编译程序(i=1,2,…,n-1),像滚雪球一样,愈滚愈大,最后得到源语言L的编译程序

https://cdn.jsdelivr.net/gh/adan-ning/images/202403061314178.jpg

移植技术

即利用A机器上已有的高级语言L编写一个能够在B机器上运行的高级语言L的编译程序

假设A机器上已经有用A机器代码实现的高级语言L的编译程序,移植实现的具体做法是:

  1. 首先用L语言编写出在A机器上运行的产生B机器代码的L语言的编译程序源程序

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403061331241.png

  2. 然后把该编译程序源程序经过A机器上的L编译程序编译后,得到能在A机器上运行产生B机器代码的编译程序

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403061333462.png

  3. 最后用这个编译程序再一次编译第1步编写的编译程序源程序,得到了能在B机器上运行的产生B机器代码的编译程序

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403061334205.png

自动生成技术

利用工具,编译程序自动生成

https://cdn.jsdelivr.net/gh/adan-ning/images/202403061335905.png

LEX:词法分析程序产生器

YACC:语法分析程序产生器