编译引论(第一章)
编译程序(图)
某一种语言等价地转换成另外一种语言程序(称为目标语言程序)
解释程序(图)
将源程序按动态顺序逐句分晰解释执行,根据语句的含义执行,最终得到运行结果
编译器在语言处理系统中的位置(图)
编译过程
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. 目标代码产生
任务:把中间代码变换成特定机器上的低级语言代码
该阶段的工作非常复杂,涉及机器指令的选择,寄存器的调度,以及各种数据类型变量的存储空间分配等。
6. 表格管理程序 完成编译过程中的建表,查表,更新数据等有关表格操作
**7. 错误处理程序 **
编译程序不仅能对书写正确的程序进行翻译,而且还能对出现在源程序中的错误进行处理
编译程序的结构
编译程序的总体结构(图)
相关概念
“遍"的概念
所谓"一遍"是指,对源程序或中间程序从头到尾扫描一次,并作相关加工处理,生成新的中间程序或相关代码
多遍编译程序
把编译的5个阶段应完成的工作分遍来做,每一遍完成一个或相连几个阶段的工作
前端
通常包括词法分析,语法分析,语义分析及中间代码生成,有的优化工作也可以包括在前端,前端依赖于源程序
后端
通常包括有关代码优化和目标代码生成,依赖于中间代码,计算机的硬件系统和机器指令系统
编译程序开发
自展技术(图)
按照自展技术,需要把源语言L分解成一个核心部分L0与扩充部分L1,L2,….,Ln。分解源语言之后,先用汇编语言或机器语言编写L0的编译程序,然后再用L0编写L1的编译程序,用Li编写Li+n的编译程序(i=1,2,…,n-1),像滚雪球一样,愈滚愈大,最后得到源语言L的编译程序
移植技术
即利用A机器上已有的高级语言L编写一个能够在B机器上运行的高级语言L的编译程序
假设A机器上已经有用A机器代码实现的高级语言L的编译程序,移植实现的具体做法是:
-
首先用L语言编写出在A机器上运行的产生B机器代码的L语言的编译程序源程序
-
然后把该编译程序源程序经过A机器上的L编译程序编译后,得到能在A机器上运行产生B机器代码的编译程序
-
最后用这个编译程序再一次编译第1步编写的编译程序源程序,得到了能在B机器上运行的产生B机器代码的编译程序
自动生成技术
利用工具,编译程序自动生成
LEX:词法分析程序产生器
YACC:语法分析程序产生器