第7章 程序设计语言基础知识
一、基本概念
1、低级语言和高级语言
- **低级语言:**通常称机器语言和汇编语言为低级语言。机器语言是指用0、1字符组成的机器指令序列,是最基本的计算机语言。汇编语言是指用符号表示指令的语言。
- **高级语言:**是从人类的逻辑思维角度出发、面向各类应用的程序语言,其抽象程度大大提高,需要编译高层特定机器上的目标代码才能执行。这类语言与人们使用的自然语言比较接近,大大提高了程序设计的效率。
2、程序设计语言的定义一般都设计语法、语义、语用和语境等方面。
- 语法:由程序设计语言的基本符号组成程序中的各个语法成分的一组规则,其中由基本字符构成的符号书写规则成为词法规则,由符号构成语法成分的规则成为语法规则。程序语言的语法课通过形式语言进行描述。
- **语义:**程序语言中按语法规则构成的各个语法成分的含义,可分为静态语义和动态语义。
- **语用:**表示构成语言的各个记号和使用者的关系,设计符号的来源、使用和影响。
- **语境:**理解和实现程序设计语言的环境,包括编译环境和 运行环境。
3、程序设计语言的分类
- 命令式程序设计语言:命令式程序设计语言是基于动作的语言,在这种语言中,计算被看做是动作的序列,命令式语言族开始于
Fortran/Pascal和C语言
,体现了命令式程序设计的关键思想。 - **面向对象的程序设计语言:**面向对象的程序设计在很大程度上应归功于从模拟领域发展而来的Simula,Simula提出了对象和类的概念。C++、Java、Smaltalk是面向对象程序设计语言的代表。
- **函数式程序设计语言:**函数式程序设计语言是一类以2-演算为基础的语言。该语言的代表是LISP,其中大量使用了递归。
- **逻辑型程序设计语言:**逻辑型程序设计语言是一类以形式逻辑为基础的语言。该语言的代表是建立在关系理论和一阶谓词基础上的Prolog.
4、程序设计语言的基本成分
-
数据成分
- 常量和变量
- 全局量和局部量
- 数据类型:
- 基本类型:整型(int),字符型(char),实型(float、double),和布尔型(bool)
- 特殊类型:空类型(void)
- 用户定义类型:枚举类型(enum)
- 构造类型:数组,结构和联合
- 指针类型:type
- 抽象数据类型:类类型
-
运算成分
- 算术运算:加减乘除
- 逻辑运算:或与非
- 关系运算
-
控制成分
-
顺序结构
-
选择结构
-
循环结构
-
-
函数和函数的调用
二、编译与解释
汇编语言是为了特定的计算机或计算机系统设计的面向机器的符号化的程序设计语言。用汇编语言编写的程序称为汇编语言源程序。汇编语言源程序由若干条语句组成。一个程序中可以由3类语句:指令语句、伪指令语句和宏指令语句。
编译程序的功能是把高级语言书写的远程序翻译成阈值等价的目标程序。编译过程划分为 词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成六个阶段,实际的编译器可能会将其中的某些阶段结合在一起进行处理。
解释程序是一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但在运行用户程序时,它直接执行源程序或源程序内部形式(中间代码)。因此,解释程序并不产生目标程序,这是它和编译程序的主要区别。
- 词法分析阶段的任务:对源程序从前到后(从左到右)逐个字符进行扫描,从中识别出一个个“单词”符号。“单词”符号是程序设计语言的基本语法单位,如关键字、标识符等。
- 语法分析阶段的任务:在词法分析的基础上,更具语言的语法规则将单词符号序列分解成各类语法单位,如“表达式”“语句”和“程序”等。词法分析和语法分析本质上都是对源程序的结构进行分析。
- 语义分析阶段的主要是审查源程序是否存在语义错误,并收集类型信息供后面的代码生成阶段使用,只有语法和语义都正确的源程序才能翻译成正确的目标代码。语义分析的一个主要工作时进行类型分析和 检查。
- 中间代码生成阶段的工作:根据语义分析的输出生成中间代码。
- 代码优化阶段的任务:对前一阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高校,即省时间和省空间。
- 目标代码生成阶段的任务:把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码。这是编译的最后阶段,它的工作与具体的机器密切相关。
三、文法
一个形式文法是一个有序四元组G=(V,T,S,P)
其中:
- V:非终结符:不是语言组成部分,不是最终结果,可理解为占位符。
- T:终结符:是语言的组成部分,是最终结果, V ∩ T = ∅ V\cap T= \empty V∩T=∅
- S:起始符:是语言的开始符号。
- P:产生式,用终结符替代非终结符的规则,形如: α − > β \alpha -> \beta α−>β.
类型 | 别称 | 说明 | 对应自动机 |
---|---|---|---|
0型 | 短语文法 | G的每条产生式$\alpha -> \beta 满足 满足 满足\alpha 属于 V 的正则闭包且至少含有一个非终结符,而 属于V的正则闭包且至少含有一个非终结符,而 属于V的正则闭包且至少含有一个非终结符,而\beta$属于V的闭包 | 图灵机 |
1型 | 上下文有关文法 | G的任何产生式$\alpha -> \beta 满足 满足 满足 | \alpha |
2型 | 上下文无关文法 | G的任何产生式为 A − > β A->\beta A−>β,A 为非终结符, β \beta β为V 的闭包 | 非确定的下推自动机 |
3型 | 正规文法 | G的任何产生死 A − > α B 或 A − > α , α A->\alpha B 或A->\alpha,\alpha A−>αB或A−>α,α 属于非终结符的闭包,A,B都属于非终结符 | 有限自动机 |
3.1 语法推导树
一棵语法树应具有一下特征:
- 每个节点都有一个标记,此标记是V的一个符号;
- 根的标记是S;
- 若一个结点n至少由于一个它自己除外的子孙,并且标记A,则A肯定在 V n V_n Vn中;
- 若节点n的直接子孙,从左到右的次序是结点 n 1 , n 2 , . . . , n k n_1,n_2,...,n_k n1,n2,...,nk,其标记分别是: A 1 , A 2 , . . . , A k , A_1,A_2,...,A_k, A1,A2,...,Ak,那么 A − > A 1 , A 2 , . . . , A k A->A_1,A_2,...,A_k A−>A1,A2,...,Ak一定是P中的一个产生式。
例:
文法G=({a,b},{S,A}.S,P),其中:
S->aAS|a;
S->SbA|SS|ba.
请构造句型aabAa的推导树。
四、有限自动机
M = ( S , Σ , δ , S 0 , Z ) 1. S 是一个有限集,每个元素为一个状态 2. Σ 是一个有穷字母表,每个元素为一个输入字符 3. δ 是转换函数,是一个单值对照 4. S 0 属于 S ,是其唯一的初态 5. Z 是一个终态集(可空) 有限状态自动机可以形象地用状态转换图表示,设有限状态自动机: D F A = ( { 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 M=(S,\Sigma,\delta,S0,Z) \\ 1.S 是一个有限集,每个元素为一个状态 \\ 2.\Sigma是一个有穷字母表,每个元素为一个输入字符 \\ 3. \delta 是转换函数,是一个单值对照\\ 4.S0属于S,是其唯一的初态 \\ 5.Z 是一个终态集(可空)\\ 有限状态自动机可以形象地用状态转换图表示,设有限状态自动机: DFA=( \{S,A,B,C,F\},\{1,0\} ,\delta,S,\{f\}) \\ 其中: \delta(S,0)=B,\delta(S,1)=A\\ \delta(A,0)=f,\delta(A,1)=C\\ \delta(B,0)=C,\delta(B,1)=f \\ \delta(C,0)=f,\delta(C,1)=f\\ M=(S,Σ,δ,S0,Z)1.S是一个有限集,每个元素为一个状态2.Σ是一个有穷字母表,每个元素为一个输入字符3.δ是转换函数,是一个单值对照4.S0属于S,是其唯一的初态5.Z是一个终态集(可空)有限状态自动机可以形象地用状态转换图表示,设有限状态自动机: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
4.1 有限自动机的另一种表达形式
正规式是描述高层许语言单词的表达式,对于字母 Σ \Sigma Σ,其上的正规式及其表示的正规集可以递归定义如下:
-
ε是一个正规式,它表示集合L(e)={e}
- 若a是Z上的字符,则a是一个正则式,它所表示的正规L(a)={a}
-
若正规式r和s分别表示正规集L(r)=L(s),则
- r丨s是正规式,表示集合L(r)UL(s);
- r·s是正规式,表示集合L(r)L(s);
- r ∗ r^* r∗是正规式,表示集合(L(r))*;
- r)是正规式,表示集合L(r)。
仅由有限次地使用上述三个步骤定义的表达式才是Z上的正规式。由此可见正规式要么为空,要么由字母、或、连接、闭包运算符组成。其中闭包运算符*”具有最高的优先级,连接运算具有次高优先级,或运算符“|"具有最低优先级。
例:
下图所示为一个有限自动机(其中,A是初态,C是终态),该自动机可以识别____.
A.0000 B.1111
C.0101 D.1010
解:C
五、正规式(有限自动机的另外一种表达形式)
例题:下面文法D[S]它无法识别(1),此文法对应正规式为(2)
G[S]:
S→aA|bB
A→bs|b
B-aSla
(1)A.ababab B.bababa
C.abbaab D.babba(2) A . ( a ∣ b ) ∗ B . ( a b ) ∗ A.{(a|b)}^* \quad\quad B.(ab)* A.(a∣b)∗B.(ab)∗
C. ( a b ∣ b a ) ∗ D . ( a b ) ∗ ( b a ) ∗ {(ab|ba) }^* \quad\quad D.(ab)*(ba)* (ab∣ba)∗D.(ab)∗(ba)∗DC
六、表达式
一句话,就是利用树的遍历来求前缀、中缀和后缀表达式。
前缀表达式根左右(+ab)
中缀表达式左根右(a+b)
后缀表达式左右根(ab+)
例:表达式(a-b)*(c+5)的后缀表达式是__
A.ab c 5+
B.ab-c +5
C.abc -5+
D.ab - c 5+
D
七、传值与引用(传址)
传值调用形参取的是实参的值,形参的改变不导致实参的值发生改变
引用(传址)调用:形参取的是实参的地址,即相当于实参存储单元地址的引用,因此其地址改变的同时就改变了实参的0值.
函数main(),f()的定义如下所示。调用函数f()时,第一个参数采用参数传值(call by value)方式,第二个参数采用传引用(call by reference)方式,则函数main()执行后输出的值为__
#include<stdio.h> void f(int x,int &a){ x=2*x-1; a=a+x; printf("x:::%d\n\n",x); return; } int main (){ int x=10; f(x,x); printf("%d",x); return 0; }
A.10 B.19 C.20 D.29
八、各种程序语言特点
-
Fortran语言(科学计算,执行效率高
-
Pascal语言(为教学而开发的,表达能力强,Delphi)
-
C语言 (指针操作能力强,高效)
-
Lisp语言(函数式程序语言,符号处理,人工智能)
-
C++语言(面向对象,高效)
-
Java语言(面向对象,中间代码,跨平台)
-
C#语言(面向对象,中间代码,Net)