程序设计语言
一、概述
- 机器指令:是最基本的计算机语言(特定计算机系统所有固有的、面向机器的语言)。
- 机器指令程序:由0、1组成的指令序列。
- 汇编语言:用符号代替0、1序列来表示机器指令(如:用ADD表示加法),称为汇编指令,汇编指令的集合称为汇编语言。
1. 编译程序和解释程序
-
源程序:用高级语言或汇编语言编写的程序;源程序不能直接在计算机上执行。
-
解释程序(解释器):直接解释执行源程序,或将源程序翻译成某种中间代码再执行。
-
编译程序(编译器):将源程序翻译成目标语言程序。
编译程序和解释程序的区别:
- 编译方式下,(
翻译成独立保存的目标程序
)机器上运行的是与源程序等价的目标程序,源程序和编译程序都不在参与目标程序的执行过程。 - 解释方式下,(
不生成独立的目标程序
)解释程序和源程序(或其某种等价表示)要参与到程序的运行过程中,运行程序的控制权在解释程序。
- 编译方式下,(
2. 定义和分类
-
程序设计语言的定义涉及:语法、语义、语用。
- 语法:程序设计语言的基本符号组成程序中的各个语法成份(包括程序)的一组规则。
- 词法规则:由基本字符构成的符号(单词)书写规则。
- 语法规则:由符号构成语法成份的规则。
- 语义:按语法规则构成的各个语法成份的含义,分为静态语义和动态语义。
- 静态语义:编译时可以确定的语法成份的含义;
- 动态语义:运行时刻才能确定的含义。
- 语用:表示了构成语言的各个记号和使用者的关系,涉及符号的来源、使用和影响。
- 语境(语言的实现):理解和实现程序设计语言的环境,包括编译环境和运行环境。
- 语法:程序设计语言的基本符号组成程序中的各个语法成份(包括程序)的一组规则。
-
分类:命令式或结构化、面向对象、函数式及逻辑型程序设计语言。
3. 基本成份:数据、运算、控制、传输
-
数据成份:程序设计语言的
数据类型
。- 数据具有如下属性,在使用时需要为它分配内存空间。
- 名称:用户通过标识符定义;
- 类型:说明数据占用内存的大小和存放形式;
- 存储类别:说明数据在内存中的位置和生存期;
- 作用域:可以使用数据的代码范围;
- 生存期:数据占用内存的时间特点。
- 常量和变量
程序中数据对象可以具有左值和(或)右值;左值指存储单元(或地址、容器),右值是值(或内容)。
变量具有左值和右值,在程序运行过程中右值可改变;常量只有右值,且不可改变。
- 数据具有如下属性,在使用时需要为它分配内存空间。
-
运算成份:允许使用的运算符号和运算规则(算数运算、关系运算、逻辑运算)。
-
控制成份:语言允许表述的控制结构(顺序、选择、循环)。
- if … else … 双分支选择结构
- switch 多分支选择结构
- while、do … while 循环语句
- for 循环语句
-
传输成分:语言允许的数据传输方式:如赋值处理、数据的输入和输出等。
4. 函数
- 形式参数:函数定义阶段括号内生命的参数。
- 实际参数:函数调用阶段口号内传入的值。
- 值调用:将实参的值传递给形参。
- 引用调用:形参为引用类型,将实参的地址传递给形参;形参实际上是实参的别名。
二、语言处理程序
语言处理程序主要分为:汇编程序、编译程序、解释程序。
1. 汇编程序
-
汇编语言:是为特定计算机设计的面向机器的符号化的程序设计语言。
-
语句类型
- 指令语句:机器指令语句,将其汇编后产生相应的机器代码,这些代码能被CPU直接识别,并执行相应操作。
- 伪指令语句:在汇编源程序时完成某些工作(如:为变量分配存储单元地址,赋值等)。
指令语句与伪指令语句的区别:伪指令语句经汇编后不产生机器代码;伪指令语句所指示的操作是在源程序被汇编时完成的,指令语句的操作必须在运行时完成。 - 宏指令语句:允许用户将多次重复使用的程序段定义为宏。宏指令语句就是宏的引用。
-
汇编程序
将汇编语言编写的源程序翻译成机器指令程序。一般需要两次扫描:- 第一次扫描主要工作是定义符号的值并创建一个符号表;
- 第二次扫描的任务是产生目标程序。
2. 编译程序
将高级语言编写的源程序翻译成与之等价的目标程序(汇编语言或机器语言)。
工作过程分为一下六个阶段:
阶段 | 说明 |
---|---|
词法分析 | 对源程序从前到后(从左到右)逐个字符地扫描 ,从中识别出一个个“单词” 符号(关键字、标识符、常数、运算符、分隔符等)。 |
语法分析 | 在词法分析的基础上,根据语法规则将单词符号序列分解成各类语法单位 (如:表达式、语句、程序等)。 |
语义分析 | 分析各语法结构的含义;一个主要的工作是进行类型分析和检查 。 |
中间代码生成 | 根据语义分析的输出生成中间代码。生成“中间代码”是机械的、按固定模式进行的,共同特征是与具体机器无关 。 |
代码优化 | 优化依据的原则是程序的等价变换规则。优化过程可以在中间代码生成阶段进行(控制流和数据流分析基础之上优化),也可以在目标代码生成阶段进行。 |
目标代码生成 | 把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码。这个阶段与具体的机器密切相关 。 |
-
符号表管理
符号表的作用是记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除等操作。 -
出错处理
- 静态错误:指编译阶段发现的程序错误。可分为语法错误(如:单词拼写错误、标点符号错误、表达式缺少操作数、括号不匹配等语言结构上的错误)和 静态语义错误(语义分析时发现的运算符方与运算对象类型不合法等)。
- 动态错误(动态语义错误):发生在程序运行时。如:变量取零时做除数、引用数组下标错误等。
文法和语言的形式描述
-
字母表( ∑ \footnotesize \sum ∑):字符的非空有穷集合。
-
∑ ∗ \footnotesize \sum^* ∑∗:包括空串( ε \varepsilon ε)在内的 ∑ \footnotesize \sum ∑ 上所有字符串的集合。例如:设 ∑ = { a , b } , ∑ ∗ = { ε , a , b , a a , b b , a b , . . . } \footnotesize \sum=\{a,b\},\sum^*=\{\varepsilon,a,b,aa,bb,ab,...\} ∑={a,b},∑∗={ε,a,b,aa,bb,ab,...}。
-
字符串的方幂( a n a^n an):把字符 a 自身连接 n 次得到的串。 a 0 = ε a^0=\varepsilon a0=ε。
-
字符串集合的运算:设 A、B 代表字母表 ∑ \footnotesize \sum ∑ 上的两个字符串集合。
- 或(合并): A ∪ B = { a ∣ a ∈ A 或 a ∈ B } A \cup B = \{a|a\in A 或 a \in B\} A∪B={a∣a∈A或a∈B}
- 积(连接): A B = { a b ∣ a ∈ A 且 b ∈ B } AB = \{ab | a \in A 且 b \in B\} AB={ab∣a∈A且b∈B}
- 幂: A n = A ⋅ A n − 1 = A n − 1 ⋅ A ( n > 0 ) A^n = A·A^{n-1}=A^{n-1}·A(n > 0) An=A⋅An−1=An−1⋅A(n>0)
- 正则闭包
+
: A + = A 1 ∪ A 2 ⋅ ⋅ ⋅ ∪ A n ∪ ⋅ ⋅ ⋅ A^+ = A^1 \cup A^2···\cup A^n\cup··· A+=A1∪A2⋅⋅⋅∪An∪⋅⋅⋅,表示自身连接 1 或多次。 - 闭包
*
: A ∗ = A 0 ∪ A + A^* = A^0 \cup A^+ A∗=A0∪A+,表示自身连接 0 或多次。
-
正规式与正规集
正规式 正规集 ab 字符串ab构成的集合 a|b 字符串 a 或 b 构成的集合 a ∗ a^* a∗ 由 0 或多个 a 构成的字符串集合 ( a ∣ b ) ∗ (a|b)^* (a∣b)∗ 所有字符串 a 和 b 构成的字符串集合 a + a^+ a+ 由 1个 或多个 a 构成的字符串集合 -
有限自动机
-
确定的有限自动机(DFA): ( S , ∑ , f , s 0 , Z ) (S,{\footnotesize \sum},f,s_0,Z) (S,∑,f,s0,Z)
- S 是一个有限集,其中每个元素称为一个状态。
- ∑ \footnotesize \sum ∑ 是一个又穷字母表,其中每个元素称为一个输入字符。
- f f f 是 S × ∑ → S S × {\footnotesize \sum} \to S S×∑→S 上的单值部分映像。 f ( A , a ) = Q f(A,a) = Q f(A,a)=Q 表示当前状态为 A、输入为 a 时,将转换到下一状态 Q,称 Q 为 A 的一个后继状态。
- s 0 ∈ S s_0 \in S s0∈S,是唯一的一个开始状态。
- Z 是非空的终止状态集合, Z ∈ S Z \in S Z∈S。
-
不确定的有限自动机(NFA)
与 DFA 的区别:后继状态不一定是不唯一的;有向弧上的标记可以是 ε \varepsilon ε。
-
中间代码形式:后缀式、树形表示、三元式、四元式
-
后缀式(逆波兰式):把运算符号卸载运算对象后面,例:a+b 写成 ab+
-
树形表示:表达式 x := (a+b)*(c+d) 的树形表示为:
-
三元式表示:(运算符,运算对象1,运算对象2), x := (a+b)*(c+d) 的 三元式表示为:
①(+,a,b), ②(+,c,d), ③(*,①,②), ④(:=, ③,x)。 -
四元式表示:(运算符,运算对象1,运算对象2,运算结果),x := (a+b)*(c+d) 的 四元式表示为:
① (+, a,b,t1), ② (+, b,c,t2), ③ (*, t1,t2,t3), ④ (:=,t3,_,x)后缀式、属性表示适用于解释器,编译器多采用四元式。
3. 解释程序
在词法、语法、语义分析方面有编译程序的工作原理基本相同;但解释程序不产生源程序的目标程序。
编译与解释的比较:
- 效率。编译比解释方式可能取得更高的效率。
- 灵活性。由于解释程序要反复检查源程序, 使得解释程序比编译程序更灵活。