引论学习
程序设计语言的转换
- 编译:从高级语言到低级语言的过程
- 解释:接受高级语言的一条语句输入,进行解释并控制计算机执行,马上获得该语句的执行结果,然后接受下一条语句
- 优点:实现人机交互
- 缺点:效率差,每次都要解释,而不像编译一样,只需编译一次,以后只需执行即可
- 编译的转换过程:
- 两阶段转换:编译一一执行
- 三个阶段的转换:编译一一汇编一一运行
编译程序概述
自然语言的翻译:
- 识别句子中一个个单词
- 分析句子的语法结构
- 根据句子的含义进行初步翻译
- 对译文进行修饰
- 写出最后译文
编译程序的工作:
- 词法分析
- 语法分析
- 语义分析和中间代码的生成
- 优化
- 目标代码的生成
词法分析:
- 任务:对源程序的字符串进行扫描和分解,识别出一个个单词
- 基本字:void,int,float
- 标识符:a,b,c,d
- 长整数: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::=常数
例题:
x = a + b*50 根据上面的文法规则运用最右推导:最右推导就是每次只变换最右的字母
A=>V=E => V=E+T => V=E+T*F =>
T=E+T*C =>
T=E+T*50 =>
T=E+F*50 =>
T=E+V*50 =>
T=E+b*50 =>
T=T+b*50 =>
T=V+b*50 =>
T=a+b*50
如何最左规约,就是从T=a+b*50变换到A,也就是赋值运算成立,每次只变换最左边的字母,是最右推导的逆运算
计算机是用语法树来检验语法:
中间代码生成
- 任务:根据语法分析其中的含义,进行初步翻译,产生介于源代码和目标代码之间的一种代码
- 分为两阶段的工作:
- 对每种语法范畴进行静态语义检查
- 如果语义正确,就进行中间代码的翻译
- 中间代码形式:四元式、三元式、逆波兰式
将x=a+b*50变成中间代码:
序号 | 算符 | 左操作数 | 右操作数 | 结果 |
---|---|---|---|---|
(1) | 将整常数50转换为实常数 | T |
||
(2) | * | b | T |
T |
(3) | + | a | T |
T |
(4) | = | T |
x |
以上就是四元式
优化
- 对中间代码进行加工变换,变换出效率更高的代码
- 原则:等价变换,在不改变原意的情况下
- 主要方面:
- 公共子表达式的提取:x=(a+b)*c+(a+b)*d
- 合并已知量:c=a+b d = a+b 未改变a,b的值
- 删除无用语句:一些注释或者一些与程序本身无关的表达式
- 循环优化
例如将以下语句转成中间代码:
for( k = 1; k <= 100; k++){
m = i + 10*k;
n = j + 10*k;
}
优化:每次乘实际上都是在上一次的基础是+10,所以能将乘操作优化成加法操作,来达到提升效率的目的
目标代码生成
- 任务:把优化的中间代码转化成特定机器上的低级语言
- 目标指令的形式:
- 绝对指令代码:就是01010的机器代码如exe文件,可立即执行
- 汇编指令代码:汇编语言程序,需要通过汇编程序汇编后才能运行
- 可重定位指令代码:先将各目标模块连接起来,确定变量、常数在主存中的位置,装入主存后才能成为可以运行的绝对指令代码
表格与表格管理
- 表格作用:用来记录源程序的各种信息以及编译过程中的各种状况
- 与编译前三阶段有关的表格:
- 符号表:用来登记 源程序中的常量名、 变量名、数组名、 过程名等,记录它 们的性质、定义和引用情况
- 常数表与标号表:登记各类常数值,登记标号的定义与作用
- 入口名表:登记过程的层号,分程序符号表入口
- 中间代码表
出错与处理
错误类型:
- 语法错误:在词法分析和语法分析阶段检测出来
- 语义错误:一般在语义分析阶段检测
遍:指对源程序或源程序的中间结果从头到尾扫 描一次,并做有关的加工处理,生成新的中间结 果或目标代码的过程。
(遍与阶段的含义毫无关系。)
一遍扫描
==一遍扫描不是一次性扫描和分析,而是通过一句一句的表格是进行反复扫描和分析==
编译程序生成
生成方式:
- 直接用机器语言编写编译程序
- 用汇编语言编写编译程序
- 注:编译程序核心部分常用汇编语言编写
- 用高级语言编写编译程序:这是普遍采用的方法
- .自编译:内置核心编译程序,如何用自身的核心程序去编译其他程序
- 编译工具:LEX(词法分析)与YACC(用于自动产生LALR分析 表)
- 移植(同种语言的编译程序在不同类型的机器之 间移植)
写编译程序的基本条件:
- 源程序语言
- 目标程序语言
- 编译方法
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com