什么是编译原理(编译程序的原理)?
你可能不需要去做一个编译程序,但是你必须要懂高级语言是怎么运行的!(重点!敲黑板!)
百度词条:
编译原理,经过对普通编译原理分析,形成了以词典为核心,结合词的数据结构完成编译过程的自成体系技术理论。通过分析词法生成词典(词典发生器),分析语法生成局部代码,并建立数据指针(翻译机),组装局部代码生成目标机器语言流并建立程序调用过的对象、指针等数据流空间,最终完成可执行程序(装配器)三个模糊过程(因为这些过程都离不开词典,编译中间会发生相互影响),把高级计算机语言加工成为计算机机器语言代码流,这就是我们提出的编译原理。
编译原理与汇编语言并无关系
编译原理旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
编译原理是研究各种语言转换为机器语言的过程中的各种理论。编译原理是将计算机语言转化为可以在计算机硬件上直接运行的机器语言,是翻译语言的一种。
- 1、将高级语言变为机器语言,包括两种方法,编译是一种,另一种是解释;
- 2、将汇编语言变成机器语言的,叫汇编程序.
- 编译: 高级语言 --> 机器语言(指令);
- 汇编: 汇编指令 --> 机器指令;
程序设计语言的转换 - 翻译 – 是指能把某种语言的源程序,在不改变语义的 条件下,转换成另一种语言程序——目标语言 程序。
- 编译 – 专指由高级语言转换为低级语言。
- 解释 – 接受某高级语言的一个语句输入,进行解释并 控制计算机执行,马上得到这句的执行结果, 然后再接受下一句。
编译程序的工作
- 词法分析
- 语法分析
- 语义分析和中间代码生成
- 优化
- 目标代码生成
1.词法分析
- 任务
– 输入源程序,对构成源程序的字符串进行扫
描和分解,识别出一个个的单词。 - 单词
– 是高级语言中有实在意义的最小语法单位,
它由字符构成。
Void jisuan()
{int y,c,d;
float x,a,b;
x=a+b*50;
y=c+)d*(x+b;
}
- 基本字:Void ,int , float
- 标识符a, b, c, d, x, y,jisuan
- 整常数 :50
- 运算符 : +,-,*,=
- 界限符:{ } ; , ( )
总结: - 词法分析依照词法规则,识别出正确的单词,转换 成统一规格,备用。
- 转换
– 对基本字、运算符、界限符的转换
– 标识符的转换
– 常数的转换
– 转换完成后的格式:(类号、内码) - 描述词法规则的有效工具是正规式和有限自动机
2.语法分析
- 任务: – 在词法分析的基础上,根据语言的语法规则, 把单词符号组成各类的语法单位:短语、子句、 语
- 语法规则: – 语言的规则,又称为文法;规定单词如何构成 短语、语句、过程和程序。
- 语法规则的表示: – BNF: A::=B|C
赋值语句的语法规则 - A::=V=E
- E::=T|E+T
- T::=F|T*F
- F::=V|(E)|C
- V::=标识符
语法分析的方法
– 推导(derive)和归约(reduce) - 推导 – 最左推导、最右推导
- 归约 – 最右归约、最左归约
3.语义分析和中间代码生成
- 任务
对语法分析识别出的各类语法范畴,分析其含义,
进行和初步翻译,产生介于源代码和目标代码之间
的一种代码。 - 分为两阶段工作
– 对每种语法范畴进行静态语义检查
– 若语义正确,就进行中间代码的翻译 - 中间代码形式
– 四元式、三元式、逆波兰式
例如将x=a+b*50变成中间代码
序号 算符 左操作数 右操作数 结果
(1) 将整常数50转换为实常数 T1
(2) * b T1 T2
(3) + a T2 T3
(4) = T3 x
4.优化
- 任务
-对前面产生的中间代码进行加工变换,以期 在最后阶段能产生更为高效的目标代码。 - 原则:等价变换
- 主要方面
-公共子表达式的提取、合并已知量、删除无 用语句、循环优化等。
理解:
其实就是将我们编写的高级语言程序代码翻译成容易变成机器语言的中间代码,我觉得和汇编语言差不多,但比汇编语言高级一些,在这个语言层次上优化代码,目的在于减少计算机运算的次数,从而达到优化代码的目的。
5.目标代码生成
- 任务
-把经过优化的中间代码转化成特定机器上的低级语 言代码。 - 目标代码的形式
– 绝对指令代码:可立即执行的目标代码。
– 汇编指令代码:汇编语言程序,需要通过汇编程 序汇编后才能运行。
–可重定位指令代码:先将各目标模块连接起来, 确定变量、常数在主存中的位置,装入主存后才 能成为可以运行的绝对指令代码。
6.表格与表格管理
- 表格作用:
– 用来记录源程序的各种信息以及编译过程中的 各种状况。 - 与编译前三阶段有关的表格有:
– 符号表、常数表、标号表、分程序入口表、中 间代码表等。
1)符号表
• 符号表:用来登记源程序中的常量名、变量名、数组名、过程名等,记录它们的性质、定义和引用情况。
NAME INFORMATION
k 整型、变量地址
n 整型、变量地址
m 整型、变量地址
2)常数表与标号表
常数表 标号表
值 NAME INFORMATION
1 ... ......
4 10 四元式序号4
(登记各类常数值) (登记标号的定义与应用)
3)入口名表
作用:登记过程的层号,分程序符
NAME INFORMATION
...... .......
INCWAP 二目子程序、四元式序号1
4)中间代码表
序号 OP ARG1 ARG2 RESULT
(1) = i m
(2) = j n
(3) = 1 k
(4) J< 100 k (9)
(5) + m 10 m
(6) + n 10 n
(7) + k 1 k
(8) j (4)
(9) return
7.出错处理
- 任务
如果源程序有错误,编译程序应设法发现错误, 并报告给用户。 - 完成:由专门的出错处理程序来完成
- 错误类型:
– 语法错误:在词法分析和语法分析阶段检测出来。
– 语义错误:一般在语义分析阶段检测。
8.遍
- 遍:指对源程序或源程序的中间结果从头到尾扫 描一次,并做有关的加工处理,生成新的中间结 果或目标代码的过程。
–注:遍与阶段的含义毫无关系。 - 一遍扫描
- 多遍扫描
– 优点:节省内存空间,提高目标代码质量,使 编译的逻辑结构清晰。
– 缺点:编译时间较长。
–注:在内存许可情况下,还是遍数尽可能少些 为好。
9.编译程序生成
- 直接用机器语言编写编译程序
- 用汇编语言编写编译程序
– 注:编译程序核心部分常用汇编语言编写 - 用高级语言编写编译程序
– 注:这是普遍采用的方法 - 自编译
- 编译工具:
– LEX(词法分析)与YACC(用于自动产生LALR分析
表) - 移植(同种语言的编译程序在不同类型的机器之 间移植)
若要在某机器上上为某种语言构造编译程序要掌握以下三方面:
- 源语言
- 目标语言
- 编译方法