1.编译原理-引论
2021-05-03 10:30:18 1 举报
AI智能生成
课:B站 东南大学-廖力 自己做的思维导图
作者其他创作
大纲/内容
1.1程序设计语言与编译
1)程序设计语言
高级语言
汇编语言
机器语言
提问
在计算机上如何执行一个高级语言程序?
答:
把高级语言程序翻译成机器语言程序
运行所得的机器语言程序求得计算结果
2)程序设计语言的转换
翻译
是指能把某种语言的源程序,在不改变语义的条件下,转换成另一种语言程序——目标语言程序
是一个功能
也是一个过程
分类
⭐编译
专指由高级语言转换为低级语言
是指把整个源程序翻译成另外一个语言版本的源程序
程序到程序
eg
C语言
Pascal语言
转换过程
两阶段转换过程
1.编译
exe是机器语言代码
010101..
exe就是目标代码
2.运行
初始数据的时候有输入的话就会要你输入
有write语句就是输出出来
三阶段转换过程
目标代码可能是exe文件也可能是obj文件,obj文件的话会进行link转换成exe文件
两个阶段的编译结果不同,两阶段的话是exe文件,三阶段的话是汇编语言
解释
接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句
一句高级语言的语句输入进来然后马上解释,然后马上执行整个语句,执行回来马上找下一个输入
语句到语句
eg
basic语言
以源程序作为输入,不产生目标程序,一边解释一边执行
优点:
直观易懂,结构简单,易于实现人机对
话
缺点:
效率低
是因为它不产生目标程序
编译和解释实现的机制有点不一样,目的是相似的——为了把高级语言转换成低级语言然后计算机去执行,执行的过程有点变化
1.2编译程序概述
编译程序指的是由高级语言所编写的程序性转换为低级语言的程序,跟自然语言翻译工作相似
自然语言就是由一种语言翻译成另外一种语言
编译程序的工作
⭐词法分析
任务
输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词
单词
是高级语言中有实在意义的最小语法单位位,它由字符构成
举例
Void jisuan()
{int y,c,d;
float x,a,b;
x=a+b*50;
y=c+)d*(x+b;
}
识别上述程序
基本字(保留字)
void,int,float
C语言原来定义好的一些单词
这些单词有特殊的意义,不能随便用这些单词
可以构成程序的框架
void
函数返回为空值
标识符
a, b, c, d, x, y,
jisuan
jisuan
用户自定义的东西
函数名,过程名,常量名,变量名 .......
常量
50
运算符
+,*,=
表达式运算的符号
界限符
{ } ; , ( )
分隔开一些东西
转换成统一规格
描述词法规则的有效工具
正规式
有限自动机
⭐语法分析
任务
在词法分析的基础上
根据语言的语法规则
把单词符号组成各类的语法单位
短语、子句、
语句、过程、程序
语法规则
又称为文法⭐
规定单词如何构成短语、语句、过程和程序
表示
BNF: A::=B|C
含义
A被定义为B或C
赋值语句的语法规则
A::=V=E
• E::=T|E+T
• T::=F|T*F
• F::=V|(E)|C
• V::=标识符
• C::=常数
• E::=T|E+T
• T::=F|T*F
• F::=V|(E)|C
• V::=标识符
• C::=常数
语法分析方法
蓝色圈圈
说明语句
它进行的语法分析
主要是一些填表操作
赋值语句,for语句,if语句,while语句......
语法分析的方法
推导
最左推导
由下往上就是归约过程
最左推导,最右归约
要边参考文法的形式
不要归约回文法没有的形式
最右推导
·
最左归约
P4文法
从最右的非终结符开始推导
边参考要推导的结果边参考给出的文法
非终结符号通常为大写符号
eg
用到最右推导
因为大多是+,然后途中肯定要保留+的形式,然后继续推*的形式,后面就发现怎么推都退不出多个+的形式,后面就推出该语句错误
归约
推导的逆过程就是归约
语义分析和中间代码生成
中间代码生成
任务
分为两阶段
中间代码形式
例子
优化
任务
原则
等价交换
主要方面
公共子表达式的提取
合并已知量
d/c如果后面没有用的话,直接把c和d指向同一个就行了
删除无用句
上下都没有用过这个变量
注释
循环优化
循环内都是必须的
目标代码生成
任务
目标代码的形式
绝对指令代码
可立即执行的目标代码
0101组成的代码
exe文件
不能型号的机器绝对指令代码不一样
汇编指令代码
汇编语言程序,需要通过汇编程序汇编后才能运行
不能立即运行
与机器的物理特性没有太大的直接联系
可重定位指令代码
先将各目标模块连接起来,确定变量、常数在主存中的位置,装入主存后才能成为可以运行的绝对指令代码
不能立即运行
表格管理
表格的作用
用来记录源程序的各种信息以及编译过程中的各种状况
主要用于词法分析、语法分析、中间代码生成这前三个阶段
与编译前三阶段有关的表格有
符号表
在词法分析产生的。此后还要不断去维护的一个表格
用来登记源程序中的常量名、变量名、数组名、过程名等,记录它们的性质、定义和引用情况
保留字类
运算符类
界符类
常数表
也是常出现在词法分析里面的
数值型常数
整型常数
实型常数
逻辑型常数
字符型常数
标号表
出现在词法分析
标号表示执行哪一行
分程序入口表
作用
登记过程的层号,分程序符号表入口等
中间代码表
生成中间代码的时候生成
表格存在内存空间里头
出错处理
任务
如果源程序有错误,编译程序应设法发现错误,并报告给用户
完成
由专门的出错处理程序来完成
错误类型
可检测的错误
语法错误
在词法分析和语法分析阶段检测出来
语义错误
一般在语义分析阶段检测
不可检测的错误
逻辑错误
遍
指对源程序或源程序的中间结果从头到尾扫描一次,并做有关的加工处理,生成新的中间结果或目标代码的过程
注
遍与阶段的含义毫无关系
可以一遍覆盖了好几个阶段
也可以一个阶段分为好几遍去扫描
一遍扫描
以语法分析为中心
多遍扫描
优点:
节省内存空间,提高目标代码质量,使编译的逻辑结构清晰
缺点:
编译时间较长
注
在内存许可情况下,还是遍数尽可能少些为好
内存许可的情况下
遍数尽可能少一点
自然语言的翻译
1.识别出句子中的一个个单词
2.分析句子的语法结构
3.根据句子的含义进行初步翻译
4.对译文进行修饰
5.写出最后译文
1.3编译程序生成
把源程序变成目标程序的一种程序
1.直接用机器语言编写编译程序
2.用汇编语言编写编译程序
– 注:编译程序核心部分常用汇编语言编写
汇编语言编写
3.用高级语言编写编译程序
– 注:这是普遍采用的方法
C语言示例
4.自编译
5.编译工具
– LEX(词法分析)
YACC(用于自动产生LALR分析表)
语法分析
6.移植
同种语言的编译程序在不同类型的机器之间移植
1.4编译程序构造
在某机器上为某种语言构造编译程序要掌握以下三方面
源语言
目标语言
编译方法
0 条评论
下一页