软件设计师上午题第2章目录
- 前言
- 第2章 程序设计语言基础知识(固定6分)
- 2.1程序设计语言概述
- 2.1.1 程序设计语言的基本概念
- 2.1.1.1 编译程序和解释程序习题
- 2.1.2 程序设计语言的基本成分
- 2.2 语言处理程序基础
- 2.2.1 汇编程序基本原理
- 2.2.2 编译程序基本原理
- 2.2.2.1 中缀、后缀表达式转换
- 2.2.2.2 语法树的中、后遍历
前言
在备考软件设计师中级考试的过程中,我遇到了些许挑战,也收获了宝贵的经验。为了帮助其他同样正在为这门考试(证书)奋斗的朋友们,我决定将我的笔记整理出来,与大家分享。这些笔记不仅包含了书本上的知识,还加入了我对重点和难点的个人理解以及考试技巧,力求帮助大家更加高效地复习。我希望这份笔记能够成为你备考路上的一份支持,也祝愿你在考试中取得理想的成绩。
如果有写的不好或者需要改进的地方,恳请在评论区指正!
第2章 程序设计语言基础知识(固定6分)
2.1程序设计语言概述
2.1.1 程序设计语言的基本概念
考点总结:
解释器:
解释源程序时不生成独立的目标程序
解释程序和源程序要参与到程序的运行过程中
编译器:
编译时将源程序翻译成独立保存的目标程序
机器上运行的是与源程序等价的目标程序,
源程序和编译程序都不再参与目标程序的运行过程
-
低级语言和高级语言
1)低级语言
通常称机器语言和汇编语言为低级语言。机器语言是指用 0、1字符串组成的机器指令序列,是最基本的计算机语言;汇编语言是指用符号表示指令的语言。
2)高级语言
高级语言是从人类的逻辑思维角度出发、面向各类应用的程序语言,抽象程度大大提高,需要经过编译成特定机器上的目标代码才能执行。这类语言与人们使用的自然语言比较接近,大大提高了程序设计的效率。 -
编译程序和解释程序
尽管人们可以借助高级语言和计算机进行交互,但是计算机仍然只能理解和执行由0、1序列构成的机器语言,因此高级程序语言需要翻译,担任这一任务的程序称为语言处理程序。用某种高级语言或汇编语言编写的程序称为源程序,源程序不能直接在计算机上执行。如果源程序是使用汇编语言编写的,则需要一个称为汇编程序的翻译程序将其翻译成目标程序后才能执行。如果源程序是使用某种高级语言编写的,则需要相应的解释程序或编译程序对其进行翻译,然后才能在机器上执行。解释程序也称为解释器,它或者直接解释执行源程序,或者将源程序翻译成某种中间表示形式后再执行;而编译程序(編译器)则是将源程序翻译成目标语言程序,然后在计算机上执行目标程序。
-
程序设计语言的定义
下面介绍关于程序设计语言的定义。
(1) 语法。由程序设计语言的基本符号组成程序中的各个语法成分(包括程序)的一组规则,其中由基本符号构成的符号(单词)书写规则称为词法规则,由符号(单词)构成语法成分的规则称为语法规则。程序语言的语法可通过形式语言进行描述。
(2)语义。程序语言中按语法规则构成的各个语法成分的含义,可分为静态语义和动态语义。
(3) 语用。表示构成语言的各个记号和使用者的关系,涉及符号的来源、使用和影响。
(4) 语境。理解和实现程序设计语言的环境,包括编译环境和运行环境。 -
程序设计语言的分类
-
命令式程序设计语言命令式程序设计语言是基于动作的语言,在这种语言中,计算被看作动作的序列。命令式语言族开始于 FORTRAN、 PASCAL 和C语言,体现了命令式程序设计的关键思想。
-
面向对象的程序设计语言
- 对象。对象是指人们要进行研究的任何事物,它具有状态和操作。面向对象的语言把状态和操作封装于对象实体之中,并提供一种访问机制。用户只能通过向允许公开的操作提出要求,才能查询和修改对象的状态。
- 类。类是面向对象语言必须提供的、由用户定义的数据类型,它将具有相同状态、操作和访问机制的多个对象抽象成一个对象类。在定义类以后,属于这种类的一个对象被称为类实例或类对象。
- 继承。继承是面向对象语言的另一个基本要素。继承实现了一般与特殊的关系,解决了软件的可重用性和可扩充性的问题。
-
函数式程序设计语言
函数式程序设计语言是一类以入演算为基础的语言。该语言的代表是 LISP 语言,其中大量使用了递归。
函数是一种对应规则(映射),它是定义域中的每个元素和值城中唯一的元素相对应。函数可以看成一种程序,其输入就是定义在左边括号中的变量,可以将输入组合起来产生一个规则,组合过程中也可以使用其他两数或两数本身。这种用函数和表达式建立程序的方法就是函数式程序设计。函数型程序设计语言的优点之一就是表达式中出现的任何函数都可以用其他函数来代替,只要这些两数调用产生相同的值。 -
逻辑型程序设计语言逻辑型程序设计语言是一类以形式逻辑为基础的语言。该语言的代表是建立在关系理论和一阶谓词理论基础上的 Prolog 语言。Prolog 语言具有很强的推理功能,适用于书写自动定理证明、专家系统以及自然语言理解等问题的程序。
-
2.1.1.1 编译程序和解释程序习题
-
将高级语言源程序翻译成目标程序的是 (48) 。(2012年下半年)
A. 解释程序 B. 编译程序 C. 链接程序 D. 汇编程序 -
以下关于解释程序和编译程序的叙述中,正确的是 (20) 。(2013年上半年)
(20) A. 编译程序和解释程序都生成源程序的目标程序
B. 编译程序和解释程序都不生成源程序的目标程序
C. 编译程序生成源程序的目标程序,而解释程序则不然
D. 编译程序不生成源程序的目标程序,而解释程序反之 -
以下关于实现高级程序设计语言的编译和解释方式的叙述中,正确的是 (48) 。(2014年上半年)
A. 在编译方式下产生源程序的目标程序,在解释方式下不产生
B. 在解释方式下产生源程序的目标程序,在编译方式下不产生
C. 编译和解释方式都产生源程序的目标程序,差别是优化效率不同
D. 编译和解释方式都不产生源程序的目标程序,差别在是否优化 -
以下关于高级程序设计语言实现的编译和解释方式的叙述中,正确的是 (20) 。(2016年上半年)
A. 编译程序不参与用户程序的运行控制,而解释程序则参与
B. 编译程序可以用高级语言编写,而解释程序只能用汇编语言编写
C. 编译方式处理源程序时不进行优化,而解释方式则进行优化
D. 编译方式不生成源程序的目标程序,而解释方式则生成 -
将高级语言源程序翻译为可在计算机上执行的形式有多种不同的方式,其中, (21) 。(2018年上半年)
A. 编译方式和解释方式都生成逻辑上与源程序等价的目标程序
B. 编译方式和解释方式都不生成逻辑上与源程序等价的目标程序
C. 编译方式生成逻辑上与源程序等价的目标程序,解释方式不生成
D. 解释方式生成逻辑上与源程序等价的目标程序,编译方式不生成
答案:
1.B
2. C
3. A
4. A
5. A
6. C
2.1.2 程序设计语言的基本成分
【总结】
传值调用:将实参的值传递给形参,实参可以是变量、常量和表达式。
不可以实现形参和实参间双向传递数据的效果
传引用(地址)调用:将实参的地址传递给形参,形参必须有地址,实参不能是常量(值),表达式。
可以实现形参和实参间双向传递数据的效果,即改变形参的值同时也改变了实参的值。
-
数据成分
程序语言的数据成分是指一种程序语言的数据类型。- 常量和变量
按照程序运行时数据的值能否改变,将数据分为常量和变量。程序中的数据对象可以具有左值和(或)右值,左值是指存储单元(或地址、容器),右值是指具体值(或内容)。变量具有左值和右值,在程序运行过程中其右值可以改变:常量只有右值,在程序运行过程中其右值不能改变。 - 全局量和局部量
按数据的作用域范围,数据可分为全局量和局部量。系统为全局变量分配的存储空间在程序运行的过程中一般是不改变的,而为局部变量分配的存储单元是动态改变的。 - 数据类型
按照数据组织形式的不同可将数据分为基本类型、用户定义类型、构造类型及其他类型。C(C++)的数据类型如下。- 基本类型:整型(int)、字符型(char)、实型(float、double)和布尔类型(bool)。
- 特殊类型:空类型(void)。
- 用户定义类型:枚举类型(enum)。
- 构造类型:数组、结构体和共用体。
- 指针类型:type *。
- 抽象数据类型:类类型。
其中,布尔类型和类类型是C++在C语言的基础上扩充的。
- 常量和变量
-
运算成分
程序语言的运算成分是指允许使用的运算符号及运算规则。大多数高级程序语言的基本运算可以分成算术运算、关系运算和逻辑运算,有些语言还提供位运算。运算符号的使用与数据类型密切相关。为了确保运算结果的唯一性,运算符号要规定优先级和结合性,必要时还要使用圆括号。 -
控制成分
控制成分指明语言允许表述的控制结构,程序员使用控制成分来构造程序中的控制逻辑。
1)顺序
结构
在顺序结构中,计算过程从所描述的第一个操作开始,按顺序依次执行后续的操作,直到执行完序列的最后一个操作。顺序结构内也可以包含其他控制结构。
2)选择
结构
选择结构提供了在两种或多种分支中选择执行其中一个分支的逻辑。基本的选择结构是指定一个条件口,然后根据条件的成立与香決定控制流走计算 人 还是走计算 B,从两个分支中选择一个执行。选择结构中的计算A 或计算B还可以包含顺序、选择和重复结构。程序语言中通常还提供简化了的选择结构,也就是没有计算B 的分支结构。
3)循环
结构
循环结构描述了重复计算的过程,通常包括3 个部分,即初始化、需要重复计算的部分和重复的条件。其中初始化部分有时在控制的逻辑结构中不进行显式表示。循环结构主要有两种形式,即 while 型重复结构和 do-while 型重复结构。
4) C(C++)语言提供的控制语句
(1)复合语句。复合语句用于描述顺序控制结构。复合语句是一系列用“{” 和“}”括起来的声明和语句,其主要作用是将多条语句组成一个可执行单元。复合语句是一个整体,要么全部执行,要么一条语句也不执行。
(2)if语句和switch语句。这两种语句用于实现选择结构
(3)循环语句。①while语句 ②do-while语句 ③for语句 -
函数
函数是程序模块的主要成分,它是一段具有独立功能的程序。函数的使用涉及3 个概念,即函数定义、函数声明和函数调用。
(1) 函数定义。包括函数首部和函数体两个部分。函数的定义描述了函数做什么和1么做。
(2)函数声明。函数应该先声明后引用。函数声明定义了函数原型。声明函数原型的目的在于告诉编译器传递给函数的参数个数、类型以及函数返回值的类型,参数表中仅需要依次列出函数定义中的参数类型。函数原型可以使编译器检查源程序中对函数的调用是否正确。
(3) 函数调用。当需要在一个函数(称为主调函数)中使用另一个函数(称为被调函数)实现的功能时,便以函数名字进行调用,称为函数调用。调用函数和被调用函数之间交换信息的方法主要有两种:一种是由被调用函数把返回值返回给主调两数:另一种是通过参数带回信息。西数调用时实参和形参间交换信息的方法有传值调用和引用调用两种。
① 传值调用(Call by Value)。若实现函数调用时实参向形式参数传递相应类型的值(副本),则称为传值调用。这种方式下形式参数不能向实际参数传递信息。在C语言中,要实现被调用函数对实际参数的修改,必须用指针作形参。即调用时需要先对实参进行取地址运算,然后将实参的地址传递给指针形参,本质上仍属于传值调用。这种方式实现了间接内存访问。
②引用调用(Call by Reference )。引用是 C++中增加的数据类型,当形式参数为引用类型时,形参名实际上是实参的别名,函数中对形参的访问和修改实际上就是针对相应实际参数所作的访问和改变。
2.2 语言处理程序基础
2.2.1 汇编程序基本原理
-
汇编语言
汇编语言是为特定的计算机或计算机系统设计的面向机器的符号化的程序设计语言。用汇编语言编写的程序称为汇编语言源程序。
汇编语言源程序由若干条语句组成。一个程序中可以有3 类语句,即指令语句、伪指令语句和宏指令语句。- 指令语句。又称为机器指令语句,汇编后能产生相应的机器代码,被 CPU 直接识别并执行相应的操作。指令语句可分为传送指令、算术运算指令、逻辑运算指令、移位指令、转移指令和处理机控制指令等。
- 伪指令语句。指示汇编程序在对源程序进行汇编时完成菜些工作。与指令语句的区别是:伪指令语句经汇编后不产生机器代码,另外,伪指令语句所指示的操作是在源程序被汇编时完成的,而指令语句的操作必须在程序运行时完成。伪指令语句包括常数定义伪指令语句、存储定义伪指令语句、开始伪指令语句和结束伪指令语句。
- 宏指令语句。将多次重复使用的程序段定义为宏。宏的定义必须按照相应的规定进行,每个宏都有相应的宏名。
-
汇编程序
汇编程序的功能是将用汇编语言编写的源程序翻译成机器指令程序。它一般至少需要两次扫描源程序才能完成翻译过程。第一次扫描的主要工作是定义符号的值并创建一个符号表(ST):第二次扫描的任务是产生目标程序。除了使用前一次扫描所产生的符号表(ST)外,还要使用机器指令表(MOT2)。在第二次扫描过程中,可执行汇编语句应被翻译成对应的二进制代码机器指令。这一过程涉及两个方面的工作:一是把机器指令助记符转换成二进制机器指令操作码,这可通过查找 MOT2 来实现:二是求出操作数区各操作数的值(用二进制表示)。
2.2.2 编译程序基本原理
编译程序【总结】
编译方式:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成。
解释方式:词法分析、语法分析、语义分析
编译器和解释器都**不可省略**词法分析、语法分析、语义分析且**顺序不可交换**。
编译器方式中 中间代码生成、代码优化不是必要的,可省略。
中间代码生成与具体的机器无关
与编译器相比,解释器参与控制,程序执行的速度慢】
符号表【总结】
不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入符号表中。
记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。
-
编译过程概述
编译程序的功能是把用高级语言书写的源程序翻译成与之等价的目标程序。编译过程划分成词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成6 个阶段,实际的编译器可能会将其中的某些阶段结合在一起进行处理,比如说表格管理和出错处理与上述6个阶段都有联系。
-
词法分析阶段
词法分析阶段的任务是对源程序从前到后(从左到右)逐个字符进行扫描,从中识别出一个个“单词”符号。“单词”符号是程序设计语言的基本语法单位,如关键词、标识符等。词法分析程序输出的“单词”常常采用二元组的方式,即单词类别和单词自身的值。 -
语法分析阶段
语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如“表达式”“语句”和“程序”等。词法分析和语法分析本质上都是对源程序的结构进行分析。 -
语义分析阶段
语义分析阶段主要是审查源程序是否存在语义错误,并收集类型信息供后面的代码生成阶段使用,只有语法和语义都正确的源程序才能翻译成正确的目标代码。语义分析的一个主要工作是进行类型分析和检查。 -
中间代码生成阶段
中间代码是一种结构简单且含义明确的记号系统,可以有多种形式,它们的共同特征是与具体的机器无关。中间代码的设计原则主要有两点:一是容易生成;二是容易被翻译成目标代码。中间代码生成阶段的工作就是根据语义分析的输出生成中间代码。
语义分析和中间代码生成所依据的是语言的语义规则。常见的中间代码有:后缀式、三地址码、三元式、四元式和树(图)等形式。
因为与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性。
-
代码优化阶段
代码优化阶段的任务是对前阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。优化过程可以在中间代码生成阶段进行,也可以在目标代码生成阶段进行。 -
目标代码生成阶段
目标代码生成阶段的任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码。这是编译的最后阶段,它的工作与具体的机器密切相关。 -
符号表管理
符号表管理阶段的任务是在符号表中记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成。符号表的建立可以始于词法分析阶段,也可以放到语法分析阶段,但符号表的使用有时会延续到目标代码的运行阶段。 -
出错处理
用户编写的源程序中的错误大致可分为静态错误和动态错误。动态错误也称为动态语义错误,指程序中包含的逻辑错误。静态错误是指编译阶段发现的程序错误,可分为语法错误和静态语义错误。出错处理程序的任务包括检查错误、报告出错信息、排错、恢复编译工作。
-
【总结】:
- 词法分析
输入:源程序; 输出:记号流 词法分析阶段的主要作用是:分析构成程序的字符及由字符按照构造规则构成的符号是否符合程序语言的规定
- 语法分析
输入:记号流; 输出:语法树(分析树) 语法分析阶段可以发现程序中所有的语法错误 语法分析阶段的主要作用是:对各条语句的结构进行合法性分析,分析程序中的句子结构是否正确
- 语义分析
输入:语法树(分析树) 语义分析阶段的主要作用是进行类型分析和检查 语义分析阶段不能发现程序中所有的语义错误 语义分析阶段可以发现静态语义错误,不能发现动态语义错误,动态语义错误运行时才能发现
- 目标代码生成
目标代码生成阶段的工作与具体的机器密切相关,寄存器的分配工作处于目标代码生成阶段
-
文法和语言的形式描述
- 文法的定义
描述语言语法结构的形式规则称为文法。文法G是一个四元组,可表示为G=(VN,VT,P,S),其中VT是一个非空有限集,其中的每个元素称为一个终结符;VN是一个非空有限集,其每个元素称为非终结符。VN∩VT=∅。P是产生式的有限集合,每个产生式是形如α→β的规则,其中α称为产生式的左部,β称为产生式的右部。S∈VN,称为开始符号,它至少要在一条产生式中作为左部出现。 - 文法的分类
乔姆斯基把文法分成 4种类型,即0型、1型、2型和3型。
0 型文法也称为短语文法,其能力相当于图灵机。- 1型文法也称为上下文有关文法,这种文法意味着对非终结符的替换必须考虑上下文,并且一般不允许替换成:串,此文法对应于线性有界自动机。
- 2型文法是上下文无关文法,对非终结符的替换无须考虑上下文,它对应于下推自动机。
- 3型文法等价于正规式,因此也称为正规文法或线性文法,它对应于有限状态自动机。
- 句子和语言
设有发文G=(VN,VT,P,S)- 辅导书p58-59
- 文法的定义
-
词法分析【正规式】
习题:
- 由a、b构造且仅包含偶数个a的串的集合用正规式表示为(49)。(2009年上半年)
A.(a*a)*b*
B.(b*(ab*a)*)*
C.(a*(ba*)*b)*
D.(a|b)*(aa)*
答案:B
语言
L={a^mb^n|m≥0,n≥1}
的正规表达式是(21)。(2012年下半年试题21)
A.aa*bb*
B.a*bb*
C.aa*b*
D.a*b*
解析:m≥0,am说明可以有0个a或者多个a;n≥1,bn说明至少有一个b或者多个b,a表示由0个或者多个a构成的集合,可以表示{am|m≥0};b表示由0个或者多个b构成的集合,bb*才可以表示{b^n|n≥1}
。
答案:B对于正规式
0*(10*1)*0*
,其正规式中字符串的特点是(50)。(2010年上半年)
A、开头和结尾必须是0 B、1必须出现偶次 C、0不能连续出现 D、1不能连续出现
答案:B字符a、b构成的字符串中,若每个a后至少跟一个b,则该字符串集合可用正规式表示(48)。(2016年下半年)
A.(b|ab)*
B.(ab*)*
C.(a*b*)*
D.(a|b)*
答案:A在仅由字符a、b、构成的所有字符串中,其中以b结尾的字符串集合可用正规式表示为(21)。(2017年上半年)
A.(b|ab)*b
B.(ab*)*b
C.a*b*b
D.(a|b)*b
答案:D,这一题的意思是需要满足所有ab组合,并且以b结尾,A不满足所有的ab组合
- 有限自动机
是词法分析的一个工具,它能正确地识别正规集。
有限自动机是一种识别装置的抽象概念,它能够正确地识别正规集。
- 确定的有限自动机(DFA):对每一个状态来说识别字符后转移的状态是唯一的
- 不确定的有限自动机(NFA):对每一个状态来说识别字符后转移的状态不一定是唯一的,是不确定的
(1) 确定的有限自动机。
一个确定的有限自动机(DFA)是个五元组:(S,Σ,f,s0,Z),其中:
① S是一个有限集,其每个元素称为一个状态。
②Σ是一个有限字母表,其每个元素称为一个输入字符。
③f是从SxΣ→S上的单值部分映像。
④ S0∈S是唯一的一个开始状态。
⑤ Z是非空的终止状态集合。
-
正规式与有限自动机之间的转换
1)优先自动机转换为正规式
2)正规式转换为有限自动机
-
词法分析器的构造
-
语法分析
-
上下文无关文法
上下文无关文法属于乔姆斯基定义的2型文法,被广泛地用于表示各种程序设计语言的语法规则。对于上下文无关文法,
G[S]=(V_N,V_T,P,S)
,其产生式的形式都是A∈V_N
,其中β∈(V_N∪V_T)
。
若不加特别说明,下面用大写英文字母A、B、C等表示非终结符,小写英文字母a、b、c等表示终结符号,u、v、w等表示终结符号串,小写希腊字母 α、β、γ、δ等表示终结符和非终结符混合的文法符号串。由于一个上下文无关文法的核心部分是其产生式集合,所以文法可以简写为其产生式集合的描述形式
-
- 语法分析的任务是根据语言的语法规则,分析单词串是否构成短语和句子,同时检查和处理程序中的语法错误。根据产生语法树的方向,语法分析可分为自底向上和自顶向下两类。
- 自顶向下的分析是对给定的符号串,试图自顶向下地为其构造一棵语法树,或者说从文法的开始符号出发,为其构造一个最佳推导。
- 自底向上的分析是对给定的符号串,试图自底向上地为其构造一棵语法树,或者说从给定的符号串本身出发,试图将其归约为文法的开始符号。
- 算符优先文法属于自底向上的分析法,它利用各个算符间的优先关系和结合规则来进行语法分析,特别是用于分析各种表达式。算符优先文法的任何产生式的右部都会出现两个非终结符相邻的情况,且任何一对终结符之间至多只有3 种算符关系,即“>”“<”和“=”之一成立。
-
中间代码生成【总结考点】
常见的中间代码有:后缀式、三地址码、三元式、四元式和树(图)等形式。 中间代码与具体的机器无关(不依赖具体的机器),可以将不同的高级程序语言翻译成同一种中间代码。 中间代码可以跨平台。 因为与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性。
-
后缀式(逆波兰式)中缀式,优先级()x/±,优先级相同,从右往左
-
树形表示
例如,表达式x:=(a+b)*(c+d)的树形表示为:
-
三元式表示
-
四元式表示
2.2.2.1 中缀、后缀表达式转换
后缀:a?b->ab?
优先级:
1.() 2. > 3. ∩ 4. ∪
答案:
A
A
D
A
2.2.2.2 语法树的中、后遍历
跟数据结构的前中后序遍历一样
答案:
C
C
C
感谢您在万众文章中阅读了鄙人的笔记,谢谢
这份笔记由我在备考软件设计师中级考试的过程中编写,包含了我对知识点的理解与总结。如果您觉得这份笔记对您有帮助,并希望分享给更多的人,我十分乐意。但请在转载时务必注明出处,以尊重作者的劳动成果,感谢您的理解与支持
。
- 每篇一句:“能力配不上野心,是所有烦扰的根源。这个世界是公平的,你要想得到,就得学会付出和坚持。每个人都是通过自己的努力,去决定生活的样子。”
- 如果觉得对您有用,请点个赞或者收藏鼓励我持续更新吧!
- 恭喜您,已挑战成功第二关,请前往第三关进行挑战吧【点击即可跳转第三章】