软件设计 -(二)程序设计语言

本文详细介绍了程序设计语言的基础概念,包括编译程序和解释程序的区别,语言的定义、基本组成部分(数据、运算、控制和传输),以及汇编程序和编译程序的具体工作过程。同时,探讨了编译与解释的优缺点,以及中间代码形式如后缀式、树形表示、三元式和四元式的应用。
摘要由CSDN通过智能技术生成


一、概述

  • 机器指令:是最基本的计算机语言(特定计算机系统所有固有的、面向机器的语言)。
  • 机器指令程序:由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\} AB={aaAaB}
    • 积(连接): A B = { a b ∣ a ∈ A 且 b ∈ B } AB = \{ab | a \in A 且 b \in B\} AB={abaAbB}
    • 幂: 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=AAn1=An1An>0
    • 正则闭包+ A + = A 1 ∪ A 2 ⋅ ⋅ ⋅ ∪ A n ∪ ⋅ ⋅ ⋅ A^+ = A^1 \cup A^2···\cup A^n\cup··· A+=A1A2⋅⋅⋅An⋅⋅⋅,表示自身连接 1 或多次。
    • 闭包* A ∗ = A 0 ∪ A + A^* = A^0 \cup A^+ A=A0A+,表示自身连接 0 或多次。
  • 正规式与正规集

    正规式正规集
    ab字符串ab构成的集合
    a|b字符串 a 或 b 构成的集合
    a ∗ a^* a由 0 或多个 a 构成的字符串集合
    ( a ∣ b ) ∗ (a|b)^* (ab)所有字符串 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 s0S,是唯一的一个开始状态。
      • Z 是非空的终止状态集合, Z ∈ S Z \in S ZS
    • 不确定的有限自动机(NFA)
      与 DFA 的区别:后继状态不一定是不唯一的;有向弧上的标记可以是 ε \varepsilon ε

中间代码形式:后缀式、树形表示、三元式、四元式

  1. 后缀式(逆波兰式):把运算符号卸载运算对象后面,例:a+b 写成 ab+

  2. 树形表示:表达式 x := (a+b)*(c+d) 的树形表示为:树形表示

  3. 三元式表示:(运算符,运算对象1,运算对象2), x := (a+b)*(c+d) 的 三元式表示为:
    ①(+,a,b), ②(+,c,d), ③(*,①,②), ④(:=, ③,x)。

  4. 四元式表示:(运算符,运算对象1,运算对象2,运算结果),x := (a+b)*(c+d) 的 四元式表示为:
    ① (+, a,b,t1), ② (+, b,c,t2), ③ (*, t1,t2,t3), ④ (:=,t3,_,x)

    后缀式、属性表示适用于解释器,编译器多采用四元式。

3. 解释程序

在词法、语法、语义分析方面有编译程序的工作原理基本相同;但解释程序不产生源程序的目标程序。

编译与解释的比较:

  1. 效率。编译比解释方式可能取得更高的效率。
  2. 灵活性。由于解释程序要反复检查源程序, 使得解释程序比编译程序更灵活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值