8、程序设计语言与语言处理程序基础

第八章 程序设计语言与语言处理程序基础

程序语言和编译相关知识,主要在编码阶段应用。在现实生活中,软件设计师往往不仅仅只做纯设计工作,还需要完成一些编码工作,所以要求掌握程序语言相关知识。
根据考试大纲,本章要求考生掌握以下几个方面的知识点。
(1)汇编、编译、解释系统的基础知识和基本工作原理。
(2)程序设计语言的基本成分:数据、运算、控制和传输,程序调用的实现机制。
(3)各类程序设计语言的主要特点和适用情况:过程式程序语言、面向对象程序设计语言、函数式程序设计语言、逻辑程序设计语言的基特点、脚本语言的特点。
从历年的考试情况来看,本章的考点主要集中以下方面。
在汇编、编译、解释系统的基础知识和基本工作原理中,主要考查文法、有限自动机、正规式的相关内容。
在程序设计语言的基本成分中,主要考查语句的作用、语句的语义、程序的控制结构、函数调用的参数传递。
在各类程序设计语言的主要特点和适用情况中,主要考查各种程序语言的特点比较。


一、汇编、编译、解释系统基础

1. 解释与编译

在计算机中,程序语言分为低级语言和高级语言,如汇编语言便是一种低级语言,而平时我们所使用的:Java、C#、Delphi等,都属于高级语言。使用高级语言开发的程序是不能直接运行的。需要经过一系列的处理,才能运行。这个过程,根据其处理方式的不同,可分为:解释型和编译型。

解释型:接受所输入的用程序语言编写的源程序,然后直接解释执行;这类语言中的最典型代表是BASIC。

编译型:它是将用某种程序语言编写的源程序直接翻译成为另一种语言(目标语言程序),而且两者在逻辑上等价。如:C语言。

解释器:翻译时不生成独立的独立的目标程序,解释程序和源程序都参与程序的运行过程。
编译器:翻译时独立生成目标程序,源程序和编译程序不再参与目标程序的运行过程。

2. 编译过程

所谓编译过程,就是使用编译程序将高级语言源程序翻译为等价的机器语言程序的过程。一般来说,编译程序分为以下几个部分:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成以及贯穿始终的表格管理与出错处理。各部分之间的关系如图3-1所示。
在这里插入图片描述

编译方式:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成
解释方式:词法分析、语法分析、语义分析
词法分析、语法分析、语义分析是必不可少的,且顺序也不能更改。

在这里插入图片描述

在这里插入图片描述

中间代码:后缀式、三地址码、三元式、四元式、树(图)等形式
中间代码与具体的机器无关,中间代码可以跨平台。
使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性。

3.语言及文法的概念

语言是按照一定规则排列的符号和集合。要形式化地描述一个语言,就需要借助文法的概念。

文法就是用来描述语言的语法结构的形式规则。根据乔姆斯基的分类法,文法可以分成四种类型,如表3-1所示。
在这里插入图片描述
要根据这样的定义来对文法进行判断,总是让许多考生无从下手,其实只要掌握一些规律,就能够更好地完成这一任务(当然,这个知识点考查概率在不断降低,若完成本节学习,仍有疑问,可考虑先将主要精力投入其它章节学习)。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 词法分析

词法分析是整个分析过程的一个子任务,它把构成源程序的字符串转换成语义上关联的单词符号(包括关键字、标识符、常数、运算符和分界符等)的序列。词法分析可以借助于有限自动机的理论与方法进行有效的处理。

(1)有限自动机

有限自动机是一种自动识别装置,能够准确地识别正规集。它与3型文法对应,可以分为确定的有限自动机和不确定的有限自动机两种。

确定的有限自动机(DFA)

对每一个状态来说识别字符后转移的状态都是唯一的
在这里插入图片描述
q0是初态
q1是终态
在这里插入图片描述

DFA = ({S, A, B, C, f}, {1, 0},δ,S, {f}),
其中:
δ(S, 0) = B, δ(S, 1) = A, δ(A, 0) = f, δ(A, 1) = C, δ(B, 0) = C, δ(B, 1) = f,δ(C, 0) = f, δ(C, 1)= f
其对应的状态转换图如图3-2所示。

在这里插入图片描述

不确定的有限自动机(NFA)

对每一个状态来说识别字符后转移的状态是不唯一的
在这里插入图片描述

与确定的有限自动机一样,不确定有限自动机同样可以用状态转换图表示,所不同的是,在图中一个状态结点可能有一条以上的边到达其它状态结点。
从定义的角度来区分NFA与DFA,我们发现:DFA是单值对照,NFA是多值对照(其实也就对应着上面所述的“NFA图中一个状态结点可能有一条以上的边到达其它状态结点”)。
NFA可以转换为等价的DFA。

(2)正规式

正规式与正规集的实例

正规式正规集
ab字符串ab构成的集合
a|b字符串a、b构成的集合
a*由0个或多个a构成的字符串集合
(a|b)*所有字符a和b构成的字符串的集合
a(a|b)*以a为首字符的a、b字符串的集合
(a|b)*abb以abb结尾的a、b字符串的集合

在这里插入图片描述
首先定义初始状态S和终止状态f,并且组成有向图:
在这里插入图片描述
在这里插入图片描述
直到所有的边都以Σ中的字母或ε标记为止。由此产生了一个带ε–转移的非确定有限自动机,然后可以通过上面介绍的方法,把该自动机转换成确定有限状态自动机。
下面举一个例子说明自动机理论在词法分析程序中的应用。C语言中对标识符的规定为由“”或以字母开头的由“”、字母和数字组成的字符串,该标识符的定义可以表示为下面的正则表达式:
在这里插入图片描述
式中的α代表字母字符{A,…,Z,a,…,z},d代表数字字符{0,1,…,9}。利用前面的方法构造出如图3-3 所示的有限自动机。
在这里插入图片描述

该自动机所接受的语言就是C语言中的标识符。
在有限自动机的状态转换过程中,需要执行相关的语义动作。例如当识别到一个标识符时,需要在符号表中添加该标识符,并且向语法分析程序输送表示该标识符的单词。

5. 语法分析

语法分析的任务是识别由词法分析给出的单词符号序列是否为给定文法的正确句子(程序),语法分析可以分为自底向上分析和自顶向下分析两大类。

(1)自底向上分析

自底向上分析也称为移进——归约分析法。它的基本思想是:对输入符号串自左向右进行扫描,并将输入符号逐一移进一个后进先出的栈中,边移进边分析;一旦栈顶符号串形成某个句型的可归约串时,就用某产生式的左部非终结符来替代(这称之为归约)。一直重复这个过程,直到栈中只剩下文法的开始符号。

(2)自顶向下分析

自顶向下分析法也称为面向目标的分析方法,也就是从文法的开始符号出发尝试推导出与输入的单词串相匹配的句子。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


如图3-4所示为一个有限自动机(其中,A是初态、C是终态),该自动机所识别的字符串的特点是__(1)
在这里插入图片描述
(1)A.必须以11结尾的0、1串 B.必须以00结尾的0、1串
C.必须以01结尾的0、1串 D.必须以10结尾韵0、1串
试题2
编译和解释是实现高级程序设计语言翻译的两种基本形式。以下关于编译与解释的叙述中,正确的是
(2)
(2)A.在解释方式下,对源程序不进行词法分析和语法分析,直接进行语义分析
B.在解释方式下,无需进行语法、语法和语义分析,而是直接产生源程序的目标代码
C.在编译方式下,必须进行词法、语法和语义分析,然后再产生源程序的目标代码
D.在编译方式下,必须先形成源程序的中间代码,然后再产生与机器对应的目标代码
试题3
若C程序的表达式中引用了未赋初值的变量,则
(3)
(3)A.编译时一定会报告错误信息,该程序不能运行
B.可以通过编译并运行,但运行时一定会报告异常
C.可以通过编译,但链接时一定会报告错误信息而不能运行
D.可以通过编译并运行,但运行结果不一定是期望的结果
试题4
以下关于高级程序设计语言翻译的叙述中,正确的是
(4)
(4)A.可以先进行语法分析,再进行词法分析
B.在语法分析阶段可以发现程序中的所有错误
C.语义分析阶段的工作与目标机器的体系结构密切相关
D.目标代码生成阶段的工作与目标机器的体系结构密切相关
试题5
下图所示为一个有限自动机(其中,A是初态、C是终态),该自动机可识别
(5)
在这里插入图片描述
(5)A.0000 B.1111 C.0101 D.1010
试题6
以下关于变量和常量和叙述中,错误的是
(6)__。
(6)A.变量的取值在程序运行过程中可以改变,常量则不行
B.变量具有类型属性,常量则没有
C.变量具有对应的存储单元,常量则没有
D.可以对变量赋值,不能对常量赋值

答案
试题1分析
被有限自动机所识别是指从初态开始到终态结束,所输入的字符串能够按顺序地执行下去,若
到某个状态不能往下走得到下一个字符,则认为不能识别。
在本题中,从初态A出发,不管经过多少个1和0之后,只能是处在A、B、C三种状态中的一种,
所以在(0|1)*后,只能是处在A、B、C三种状态中的一种,不管是在那个状态,输入0后,都会处在
状态B,然后输入1,都会转换到状态C,因此与本题有限自动机等价的正规式是(0|1)*01,即该自动
机所识别的字符串的特点是必须以01结尾的0、1串。
试题1答案
(1)C
试题2分析
编译和解释是语言处理的两种基本方式。编译过程包括词法分析、语法分析、语义分析、中间
代码生成、代码优化和目标代码生成等阶段,以及符号表管理与出错处理模块。
解释过程在词法、语法和语义分析方面与编译程序的工作原理基本相同,但是在运行用户程序
时,它直接执行源程序或源程序的内部形式。
这两种语言处理程序的根本区别是:在编译方式下,机器上运行的是与源码程序等价的目标程
序,源程序和编译程序都不再参与目标程序的执行过程;而在解释方式下,解释程序和源程序(或
其某种等价表示)要参与到程序的运行过程中,运行程序的控制权在解释程序。
在编译方式下,词法、语法和语义分析是必须要进行的工作,而生产中间代码和优化则是可以
进行也可以不进行。
试题2答案
(2)C
试题3分析
在C程序中,若在某个表达式中引用了未赋初值的变量,那么程序是可以通过编译并运行的,因
为程序中并没用语法方面的错误,只是运行的结果可能与我们期望的结果不一致。
试题3答案
(3)D
试题4分析
在对用高级程序设计语言编写的程序进行执行时,首先是将源代码翻译成目标代码,然后在连
接成可执行的二进制代码。因此在翻译阶段,目标代码生成阶段的工作与目标机器的体系结构密切
上一节 本书简介 下一节
第 3 章:程序语言和语言处理程序基础知识 作者:希赛教育软考学院 来源:希赛网 2014年05月04日
程序设计语言基础
上一节 本书简介 下一节
第 3 章:程序语言和语言处理程序基础知识 作者:希赛教育软考学院 来源:希赛网 2014年05月04日
考点精讲
相关。
试题4答案
(4)D
试题5分析
本题主要考查有限自动机。
在本题中,A是初始状态,C是终止状态,通过选项中的字符串可以从初始状态到达终止状态,
则说明该字符串能被题目中的自动机识别。也可以理解为依次输入选项中的字符串,可以在该自动
机中找到相应的路径。
对于选项A的字符串0000,在输入0后,从初始状态A转移到状态B,然后接着输入3个0,状态
然后停留在B,而无法到达终态C,因此选项A不能被该自动机识别。
同样的道理,我们可以找到字符串0101能被该自动机识别,在输入0后,状态跳转到B,输入1
则由B转至C,再输入0,又由C转至B,最后输入1,由B转至终态C。
试题5答案
(5)C
试题6分析
本题主要考查我们对常理与变量的理解。顾名思义,常理是指值一旦确定后就不能再变的量,
而变量则是一个在程序执行过程中,可以根据需要修改的量,是一个可改变的量。当然不管是常理
还是变量,它们都有其类型属性。
试题6答案
(6)B


程序设计语言基础主要包括程序当中的数据、运算、控制、传输以及程序调用的实现机制等相关内容。根据历年考试的出题情况,本节主要考查表达式的转化和程序调用的实现机制。

二、表达式的转化和程序调用的实现机制

1. 数据类型

计算机系统中,会把数据分为不同的类型,常见的数据类型包括:整型,长整型,字符型,浮点型等。
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。例如大胖子必须睡双人床,就给他双人床,瘦的人单人床就够了。
要求源程序中的数据必须具有类型的目的主要有以下几个方面:
第一是方便为数据合理分配存储单元;
第二是规定了数据类型,就知道了其占用的字节数,从而也就规定了数据对象的取值范围及能够进行的运算;
第三是对参与表达式求值的数据对象可以进行合法性检查,比如浮点数就不能进行自加操作。

2. 表达式

表达式是程序语句的基本组成,体现了程序控制和数据改变的方法。表达式可分为前缀表达式、中缀表达式与后缀表达式。该知识点在多次考试中都考到了,是一个重点。

(1)中缀表达式

中缀表示法是日常最通用的用法,但是在程序语言中使用中缀表示法会产生下面的问题。
由于中缀表示法仅适合于二元操作符,一种语言不能只使用中缀表示法,而必须结合中缀与前缀表示法。这种混合使用会使翻译过程相对复杂。
当一个以上的中缀操作符出现在表达式中时,如果不使用括号就有可能产生二义性。

(2)前缀表达式(波兰式)

在前缀表达式中,是以从左到右的顺序先写操作符后写操作数,如果操作数本身是一个具有操作数的操作,则对其使用同样的规则。例如,公式(a+b)*(a-b),使用前缀表达式表示将变为 * + a b– a b。函数调用可以看做一种前缀表达式,因为一般是把操作符函数名写在它的参数的左边,像f(a,b)这样。
以前缀表示的表达式可以在一次扫描后计算出值,前提是要明确知道每个操作符的参数的数目。用以下的算法通过使用一个执行栈,计算给定的前缀表达式P。
如果P的下一项是一个操作符,将它压入栈,并把参数计数器设置为该操作符所需要的参数的数目n。
如果P的下一项是一个操作数,把它压入栈。
如果栈顶操作数的个数为n,则把操作符作用于这n个操作数,得出的结果替换该操作符和它所有的参数,作为操作数压入栈。
前缀表达式的计算方法意味着在每个操作数压入栈后都必须检查操作数的数目是否满足最近栈顶的操作符的要求,而后缀表达式就无需做这种检查。

(3)后缀表达式(逆波兰式)

后缀表示法类似于前缀表示法,不同之处在于操作符跟在操作数之后。前面的公式使用后缀表示法时表示为a b + a b– * 。由于这一点不同,在计算后缀表达式的时候,当扫描到操作符时,栈中已压入了它的操作数。因此计算后缀表达式的算法如下。
如果P的下一项是操作数,将它压入栈。
如果P的下一项是n元操作符(即需要参数个数为n的操作符),那么它的参数就是栈顶的n项,把该操作符作用于这n项,得到的结果作为操作数替代栈顶的n项。
由于后缀表达式的计算是直接的,并且易于实现,因此它是很多翻译器产生表达式代码的基础。
在考试当中,该知识点的考查,通常形式是给出一个表达式的中缀表达形式(或前缀、后缀),让考生将其转换为前缀或后缀表达形式。

3.程序调用的实现机制

在过程式程序设计语言中,习惯将程序看做层次结构:从主程序开始执行,然后进入各层次的过程执行,最后返回主程序。而过程通常有四个要素,如图3-6所示。
在这里插入图片描述
当用户调用一个过程时,就将通过参数来传递信息。形式参数就是过程定义中用于命名所传递的数据或其他信息的标识符(如图3-6所示);而实际参数是在调用点表示向被调用过程传递的数据或其他信息的表达式。多数语言中,形参与实参的对应关系是按位置来进行的,因此在调用时,实参的个数、类型与顺序应该与形参一致。常见的参数传递方式有两种:传值引用(传址)两种调用方式,如表3-2所示。
在这里插入图片描述


试题1
某程序设计语言规定在源程序中的数据都必须具有类型,然而,(1)并不是做出此规定的理由。
(1)A.为数据合理分配存储单元
B.可以定义和使用动态数据结构
C.可以规定数据对象的取值范围及能够进行的运算
D.对参与表达式求值的数据对象可以进行合法性检查
试题2
算术表达式采用逆波兰式表示时不用括号,可以利用
(2)进行求值。与逆波兰式ab-cd+*对应的中缀表达式是(3)

(2) A.数组 B.栈 C.队列 D.散列表
(3) A.a-b+cd B.(a-b)c+d C.(a-b)(c+d)D.a-bc+d
试题3
函数(过程)调用时,常采用传值与传地址两种方式在实参与形参间传递信息。以下叙述中,正确的是__(4)
(4)A.在传值方式下,将形参的值传给实参,因此,形参必须是常量或变量
B.在传值方式下,将实参的值传给形参,因此,实参必须是常量或变量
C.在传地址方式下,将形参的地址传给实参,因此,形参必须有地址
D.在传地址方式下,将实参的地址传给形参,因此,实参必须有地址
试题4
函数t、f的定义如下所示,其中,a是整型全局变量。设调用函数t前a的值为5,则在函数t中以传值调用(call by value)方式调用函数f时,输出为
(5);在函数t中以引用调用( call byreference)方式调用函数f时,输出为(6)__。
在这里插入图片描述
(5)A.12 B.16 C.20 D.24
(6)A.12 B.16 C.20 D.24

答案
试题1分析
请参看3.3.1节中关于数据类型的描述。
试题1答案
(1)B
试题2分析
逆波兰式也叫后缀表达式,即将运算符写在操作数之后的表达式,它不需使用括号,在将算术
表达式转换为逆波兰式表示时,需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符
号),一个作为输入逆波兰式的栈S2(空栈)。
而逆波兰式ab-cd+转换为中缀表达式的过程为:ab-cd+ = (ab-)(cd+) = (a-b)
(cd+) = (a-b)(c+d)。因此本题答案选C。
试题2答案
(2)B (3)C
试题3分析
形式参数就是过程定义中函数名后括号中所带的参数;实际参数是在调用点表示向被调用过程
传递的数据。
在函数调用时,数据传递的方向是从实参到形参。只是采用传值传递方式时,传递的是数值,
这个数值只要是确定的即可,可以是常理、变量或表达式等。而采用传址传递方式时,传递的是地
址,因此实参必须有地址。
试题3答案
(4)D
试题4分析
传值调用中,形参取的是实参的值,形参的改变不会导致调用点所传的实参的值发生改变;而
引用(传址)调用中,形参取的是实参的地址,即相当于实参存储单元的地址引用,因此其值的改
变同时就改变了实参的值。
在本题中,首先是采用传值调用,这个时候将变量a的值5传递给形参r,即r的值为5,那么a的
值经过a=r+1后变成了6,而r的值经过r=r
2后变成了10,并返回,即在函数t中,变量x的值被赋值
为10,那么在函数t中最后输出的时10+6=16。
采用引用调用时,由于形参r指向的是实参a的存储空间,即r与a指向的是同一块存储单元,首先
a的值为5,经过a=r+1后变成了6,再经过r=r*2后变成了12,并返回,即在函数t中,变量x的值被
赋值为12,那么在函数t中最后输出的时12+12=24。
试题4答案
(5)B(6)D

4. 符号表

符号表的作用:记录源程序中的各种符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效的查找、插入、修改和删除等操作。
符号表的使用有时会延续到目标代码的运行阶段。

符号表:不断收集、记录和使用源程序中的一些相关符号的类型和特征等信息,并将其存入符号表中。记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值