前面几篇,都讲了计算机相关基础知识,下面的内容是程序语言部分,大部分是编译原理课程上滴内容。唉,提起编译原理就是我的痛啊,只考了约70分啊。痛心……
1**、程序语言知识**
1.1 程序语言:
程序语言分为低级语言和高级语言两个大类。
低级语言:又称为面向机器语言,它是特定的计算机系统所固有的语言。
n 机器语言:虽然执行效率高,但编写出来的程序可读性很差,程序难以修改和维护。
n 汇编语言:汇编语言是机器语言的一种提升,它使用了一些助记符号来表示机器指
令中的操作码和操作数。但它仍然是一种和计算机的机器语言十分接近的语言,使用起来仍然不太方便。
n 高级语言:与人们的自然语言比较接近,使用起来很方便,也极大的提高了程序设 计的效率。
下面简单介绍了几种高级语言的特点:
Fortran:第一个被广泛用于进行科学计算的高级语言。
Algol: 早期研制出来的高级语言。有严格的文法规则,用巴科斯范BNF来描述语言的文法,是一个分程序结构的语言。(最近嵌套原则和存储器使用效率高)
Cobol:面向事务处理的高级语言。在数据库管理系统设计方面使用广泛。
Pascal:具有相当强的表达能力,特别是对于数据结构功能的表达极具优势。
C :当今最通用的程序设计语言。C是一种较低级的语言,提供了指针和地址操作的能力,但正是因为它的这一特点,才使它更具灵活性。C与UNIX操作系统紧密相关。
Prolog:逻辑型语言的代表。它是建立在关系理论和一阶谓词逻辑理论基础上的。Prolog程序由一些俗称事实和规则的Horn子句组成,具有很强的推理功能,适用书写自动定理证明、专家系统、自然语言理解等问题的程序。
LISP:典型的函数型程序语言。它以λ演算为基础。它广泛的用于问题求解等人工智能领域。
面向对象技术具有3个最重要的特征:封装性、继承性和多态性。
◆封装性:指隐藏类对象内部实现的复杂细节,将类以变量类型的形式提供给用户,从而有效地保护内部所有数据不受外部破坏。
◆继承性:指一个类(父类)再加上某些新的特征生成另外一个新类(子类),子类具有父类的全部特征,从而增强了类的共享机制,实现了软件的可重用性,简化了软件的开发工作。
◆多态性:指将同一处理过程或函数应用于不同的变量(参数),实现数据和过程的功能重载,从而简化编码。
下面简单介绍一下几种面向对象语言。
C++:是在C语言的基础上发展起来与C兼容的语言。是目前最流行的面向对象语言,主要增加了类功能和从其他类中继承类对象的功能。
Smalltalk:典型的面向对象的程序设计语言,引入了类和对象。
Java: 由SUN公司开发的一种面向对象的程序设计语言。其主要特点是可移植性好,可用于各种平台,尤其适合网络上运行。
数据类型和控制结构:
对于不同的程序语言,其提供的数据类型都不相同。数据是程序操作的对象,使用时都需要分配内存空间,它们都具有以下的属性。
数据名称:由用户通过标示符命名;
类型: 说明数据占用内存的大小和存放方式
存储类: 说明数据在内存中的位置和生存期
作用域: 说明数据可以使用的范围
生存期: 说明数据占用内存的时间
数据从不同角度可分成不同的类别:
纯量数据类型(基础数据类型)和结构数据类型:其中纯量数据类型包括(实型、整型、布尔型、指针,双精度型和枚举型);而结构数据类型包括(联合、数组、复型和记录)
按作用域分:全局量和局部量
按生存期分:自动生存期(auto)、静态生存期(static)和动态生存期
按程序运行期数据值是否改变:常量和变量
按类型分:void、标量、函数和聚合
Ø 标量又可分为算术、枚举和指针;
Ø 聚合可分为数组、结构体和共用体。
按构造方式分:基本类型和派生类型(主要参考C语言)
基本类型是void、char、int、float、double和枚举类型,以及其变种short、long、signed和unsigned。
派生类型包括指针、数组、函数、结构体(struct)和共用体(union)。其中,最后两种为用户类型。
程序语言中的控制结构为数据和数据上的运算组合成程序提供了基本框架,主要包括3种控制结构,即
Ø 顺序:
Ø 选择:if语句
Ø 重复:while语句
1.2 汇编语言: **
汇编程序是为特定的计算机或者计算机系统设计的面向机器的语言。
汇编语言中的语句可以分成两大类:
Ø 与机器指令相对应的可执行汇编语句;
Ø 汇编控制语句,即伪指令。
伪指令并不翻译成机器指令,它的作用是控制汇编程序工作。
每条汇编语句被划分成4个区,依次是标号区、操作码区、操作数区和注解区。
例如:[标号] [操作码] [操作数] [注解]
用汇编语言编写的源程序,要通过汇编程序将它翻译成机器语言程序,才能被计算机执行。因此,汇编程序的功能就是将汇编语言所编写的源程序翻译成由机器指令和其他信息组成的目标程序。它的基本工作包括:
Ø 将每一条可执行汇编语句转换成对应的机器指令
Ø 处理源程序中出现的伪指令
整个汇编程序工作通常要对源程序进行两次扫描才能完成。第一次扫描主要工作是定义符号的值。第二次扫描的目的则是产生目标程序。其中,可执行汇编语句被翻译成对应的二进制代码机器指令,而伪指令会根据伪指令记忆码调用伪指令表对应元素所规定的子程序入口。
1.3 解释程序:**
解释程序是一种语言处理程序,它直接执行源程序或源程序的内部形式。它并不产生目标程序,这是它和编译程序的主要区别。
高级语言实现语言处理有4种方案:
Ø 源程序被直接解释执行。
Ø 先将源程序翻译成高级中间代码,然后再扫描和解释执行高级中间代码。
Ø 先将源程序转化成和机器代码十分接近的低级中间代码,再解释执行这种中间代码。
Ø 源程序被最终翻译成机器语言表示的目标程序。这类系统的目标程序执行效率最高。
翻译系统与解释系统比较:
Ø 翻译系统在执行速度上都优于建立在解释执行基础上的系统;
Ø 翻译系统的缺点是其复杂性高,这使得它的开发和维护费用都大;
Ø 解释系统比较简单,可移植性较好,适合于以交互方式执行程序;
Ø 解释系统缺点是执行速度慢;
纯粹的解释和纯粹的编译都是极端,因此一般是两种技术的结合,先将源程序编译形成中间代码,然后由解释器解释执行。
解释系统的结构可分成两个部分。
1.包括通常的词法分析程序以及语法和语义分析程序,它的作用仍是把源程序翻译成中间代码,中间代码的设计常采用逆波兰(后缀)表示形式(符号在后面)。
2.解释部分,用来对第一部分所产生的中间代码进行解释执行,完成真正的解释。
1.4 编译程序:**
编译程序的功能是把某些高级语言书写的源程序翻译成与之等价的低级语言(汇编语言或者机器语言)的目标程序。其过程可以分成6个阶段。
过程阶段 | 任务及其特点 |
词法分析阶段 | 该阶段的任务是从左到右逐个字符的读入源程序,识别出一个个的单词符号。
|
语法分析阶段 | 该阶段任务是在词法分析的基础上将单词符号序列分解成各类语法单元。
|
语义分析阶段 | 审查源程序有无语义错误,为代码生成阶段收集类型信息。 |
中间代码生成阶段 | 在进行了上述的语法分析和语义分析阶段的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。所谓“中间代码”是一种简单、含义明确的记号系统。 |
代码优化阶段 | 该阶段是对前阶段产生的中间代码进行变换改造,目的是使生成的目标代码更为高级,即省时间和省空间。优化所依据的原则是程序的等价变换规则。 |
目标代码生成阶段 | 此阶段使把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。 |
<p>
其中,词法分析和语法分析本质上都是对源程序的结构进行分析。而语义分析和中间代码生成所依据的是语言的语义规则,一般采用语法指导翻译和中间代码生成。
</p>
<p>
自底向上分析法采用一个后进先出栈的数据结构,是移进-规约过程(找出句柄)。
</p>
<p>
自顶向下分析法必须改写文法,采用预测分析法,要消除左递归和提取公共左因子。
</p>
<p>
编译过程6个阶段的任务以及表格管理和出错处理工作可分别由几个模块或程序完成,他们分别称作词法分析程序、语法分析程序、语义分析程序,中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序和出错处理程序。
</p>