编译原理概述
什么是编译程序
编译程序指:把某一种高级语言程序等价地转换成另一张低级语言程序(如汇编语言或机器代码)的程序。
高级语言程序-翻译->机器语言程序-运行->结果。
其中编译程序又可以分为:
诊断编译程序(Diagnostic Compiler)--专门用于帮助程序员开发和调试,对于目标代码的效率不关注。
优化编译程序(Optimizing Compiler)--侧重于提高目标代码的执行效率,能够生成高效的目标代码。
交叉编译程序(Cross Compiler)--运行编译程序的机器叫做宿主机,运行目标代码的机器我们称为目标机,一般来说宿主机和目标机是同一个机器,如果一个编译程序产生不属于宿主机的目标代码,我们称其为交叉编译程序。
可变目标编译程序(Retargetable Compiler)--不需要重写与机器无关的部分,只要改变与目标机器有关的部分,就能针对不同的平台生成不同的代码。
解释程序(Interpreter)
把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序。
不同于编译程序,解释程序不会产生完整的目标程序文件。(如python语言)
高级语言程序-解释->结果
编译过程
类比自然语言的翻译:
把英文翻译为中文:
1.识别出句子红的一个个单词。
2.分析句子的语法结构。
3.根据句子的含义进行初步翻译。
4.对译文进行修饰。
5.写出最后的译文。
与编译程序工作的五个阶段对应为:
1.词法分析。
2.语法分析。
3.中间代码产生。
4.优化。
5.目标代母产生。
词法分析
任务:输入源程序,对构成源程序的字符进行扫描和分解,识别出单词符号。
依循的原则:构词规则。
描述工具:有限自动机。
语法分析
任务:在词法分析的基础上,根据语法规则把单词符号串分解成各类语法单位(语法范畴)。
依循的原则:语法规则。
描述工具:上下文无关文法。
中间代码产生
任务:对各类不同的语法单位按语言的语义进行初步翻译。
依循的原则:语义规则
描述工具:属性文法
中间代码:三元式,四元式,树,...
优化
任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码。
依循的原则:程序的等价变换原则
目标代码产生
任务:把中间代码变换成特定机器上的目标代码
依赖于硬件系统结构和机器指令的含义
目标代码的三种形式:
1.汇编指令代码:需要进行汇编。
2.绝对指令代码:可直接运行。
3.可重定位指令代码:需要链接。
编译程序的结构
编译程序的总框
--源程序--》词法分析器--单词符号--》语法分析器--语法单位--》语义分析与中间代码产生器--中间代码(四元式)--》优化段--中间代码(四元式)--》目标代码生成器--目标代码--》。
另外还有符号表管理,与出错处理模块。
出错处理程序
发现源程序中的错误,把有关错误信息报告给用户,错误分为语法错误与语义错误。
重要概念:遍
所谓“遍”,就是对源程序或源程序的中间表示从头到尾扫描一次。
阶段和遍是不同的概念--一遍可以由若干段组成(词法分析,语法分析、中间代码程序可以合成一遍来处理),一个阶段可以分为若干遍来完成(比如:优化就可能分为好多遍)。
编译程序的前后端
词法分析、语法分析、语义分析和中间代码生成以及优化中与目标机器无关的部分一起称为编译程序的前端。
而优化中与目标机器有关的部分和目标代码生成,一起称为编译程序的后端。
这样分的好处为:程序逻辑结构清晰、优化更充分,有利于移植。
编译程序的生成
以机器语言和汇编语言为工具。
优点:可以针对具体的机器,充分发挥计算机的系统功能;生成的抽象效率高。
缺点:程序难度、难写、易出错、难维护、生产效率低。
使用高级语言书写
优点:程序易读、容易维护、生产效率高。
关于如何利用现有编译器产生自己的编译器
如图:
关于如何移植:
自编译方式
编译程序的自动产生
如LEX:词法分析程序产生器。
YACC:语法分析程序产生器。
高级程序设计语言概述
常用的高级程序设计语言
FORTRAN 数值计算
COBOL 事务处理
PASCAL 结构化程序设计
LISP 函数式程序设计
PROLOG 逻辑程序设计
C 系统程序设计
Smalltalk 面向对象程序设计
Java Internet引用,可移植性
Python 解释型,动态编程
第一位图灵奖获得者Alan J.Perlis曾经说过:如果一个语言不能改变你进行程序设计的思维方法的话,那么你不值得去了解它。
高级程序设计语言的优点
更接近于数学语言和工程语言,更直观、自然和易于理解。
更容易验证其正确性。
编写程序的效率更高。
更容易移植。
程序设计语言的定义
语法
程序本质上是一定字符集上的字符串。
语法:一组规则,用它可以形成和产生一个合式(形式上正确)的程序,分为词法规则和语法规则。
词法规则:单词符号的形成规则
单词符号是语言中具有独立意义的最基本结构
一般包括:常数、标识符、基本字、算符、界符等。
语法规则:语法单位的形成规则
语法单位通常包括:表达式、语句、分程序、过程、函数、程序的等。
描述工具:上下文无关文法。
语义
一组规则,用它可以定义一个程序的意义。
描述方法:
1.自然语言描述:二义性、隐藏错误和不完整性。
2.形式描述:
操作语义。
指称语义。
代数语义。
程序语言的基本功能和层次结构
程序,本质上说是描述一定数据的处理过程。
程序语言的基本功能:描述数据和对数据的运算。
程序的层次结构:
程序--》子程序或分程序、过程、函数--》语句--》表达式--》数据引用、运算符、函数调用。
程序语言成分的逻辑和实现意义
抽象的逻辑的意义:数学意义。
计算机实现的意义:具体实现。
计算思维和数学思维是不同的!。
高级语言的分类
强制性语言/过程式语言
应用式语言
基于规则的语言
面向对象的语言