软件设计师考试 | 第二章 程序设计语言基础知识 | 语言处理程序基础

(一)汇编程序基本原理

1.汇编语言

汇编语言是为特定的计算机设计的面向机器的符号化的程序设计语言。
汇编程序的分类:

  • 指令语句(机器指令语句)
    在汇编后能产生相应的机器代码,这些代码可以被CPU直接识别并执行相应的操作,基本指令有ADDSUBAND等;
    可分为传送指令、算术运算指令、逻辑运算指令、移位指令、转移指令、处理机控制指令等。
  • 伪指令语句
    指示汇编程序在汇编源程序时完成某些工作;
    伪指令语句经汇编后不产生机器代码。
  • 宏指令语句
    用户将多次重复使用的程序段定义为宏;
    每个宏都应按照相应的规定去定义,要有相应的宏名。

2.汇编程序

汇编程序的功能是将用汇编语言编写的源程序翻译成机器指令程序(一般扫描两次源程序才能完成翻译工作)。
基本工作:

  • 将每一条可执行汇编语句转换为对应的机器指令
  • 处理源程序中出现的伪指令

由于汇编指令中形成操作数地址的部分可能出现后面才定义的符号,因此汇编程序一般扫描两次源程序。

  • 第一次扫描
    • 定义符号的值,并创建一个符号表ST(记录汇编时所遇到的符号的值)
    • 单元地址计数器LC的初始值置为0
    • 扫描源程序的语句,设置LC的值
  • 第二次扫描
    • 把机器指令助记符转换成二进制机器指令操作码,可通过查找MOT2表(机器指令表)来实现
    • 求出操作数区各操作数的值

(二)编译程序基本原理

1.编译过程概述

编译程序的功能是把某高级语言书写的源程序翻译成与之等价的目标程序。
编译程序 过程分为6个阶段:

  • 词法分析,对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号。
  • 语法分析,在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如“表达式”、“语句”、和“程序”等。
  • 语义分析,分析各语法结构的含义,检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用。
  • 中间代码生成,根据语义分析的输出生成中间代码(通常采用四元式)。
  • 代码优化,依据等价变换原则,在对程序的控制流和数据流分析的基础之上进行优化。
  • 目标代码生成,把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码。

2.文法和语言的形式描述

(1)字母表、字符串、字符串集合及运算

(2)文法和语言的形式描述

  • 文法的定义,描述语言语法结构的规则称为文法。文法G是一个四元组,可以表示为G=(Vn,Vt,P,S)Vn是一个非空有限集,每个元素称为非终结符,Vt是一个非空有限集,每个元素称为一个终结符,P是产生式的有限集合,S属于Vn,称为开始符号。
  • 文法的分类,分为四种类型,即0型,1型,2型,3型。这四种文法之间的差别在于对产生式要施加不同的限制。
  • 句子和语言
    • 推导与直接推导
    • 直接规约和规约
    • 句型和句子
    • 语言
  • 文法的等价,若文法G1与文法G2产生的语言相同,则称这两个文法是等价的。

3.语法分析

语法分析的任务是把构成源程序的字符串转换成单词符号序列。

(1)正规表达式和正规集

正规表达式产生的集合是语言基本字符集(字母表)上的字符串的一个子集,称为正规集。
若两个正规式表示的正规集相同,则认为两者等价。

(2)有限自动机

  • 确定的有限自动机(DFA
  • 不确定的有限自动机(NFA

(3)NFADFA的转换

任何一个NFA都可以转换为DFA

(4)DFA的最小化

NFA转换为DFA不一定是最简化的,可以通过等价变换将DFA进行最小化处理。

4.正规式与有限自动机之间的转换

  • 有限自动机转为正规式
  • 正规式转为有限自动机

5.词法分析器的构造

构造词法分析器的步骤:

  • 用正规式描述语言中的单词构成规则;
  • 为每个正规式构造一个NFA,它识别正规式所表示的正规集;
  • 将构造出的NFA转换成等价的DFA
  • DFA进行最小化处理,使其最简;
  • DFA构造词法分析器。

6.语法分析

语法分析的任务是根据语言的语法规则分析单词串是否构成短语和句子,即表达式、语句和程序等基本语言结构,同时检查和处理程序中的语法错误。
根据产生语法树的方向,可分为:

  • 自底向上
  • 自顶向下

7.语法制导翻译和中间代码生成

程序设计语言的语义分为静态语义和动态语义。
描述程序语义的形式化方法主要有属性文法、公理语义、操作语义和指称语义等。

(1)中间代码

中间代码:将源程序首先翻译成中间代码表示形式,以利于进行与机器无关的优化处理。
常见的中间代码有后缀式、三元式、四元式和树等形式。

  • 后缀式(逆波兰式),将运算符写在运算对象的后边,例如:a+b写成ab+
  • 树形表示
  • 三元表示,例如:表达式x:=(a+b)*(c+d)的三元表示为:
(1)(+,a,b)
(2)(+,c,d)
(3)(*,(1),(2))
(4)(:=,(3),x)
  • 四元式表示,是一种普遍采用的中间代码形式,例如表达式
    x:=(a+b)*(c+d)的四元式表示为:
(1)(+,a,b,t1)
(2)(+,c,d,t2)
(3)(*,t1,t2,t3)
(4)(:=,t3,_,x)

(2)常见语法结构的翻译

常见的语法结构主要有算术表达式、布尔表达式、赋值语句和控制语句等。

8.中间代码优化和目标代码生成

优化是对程序进行等价变换,使得从变换后对程序能生成更有效的目标代码。
等价是指不改变程序的运行结果。
有效是指目标代码的运行时间较短,占用的存储空间较少。


(三)解释程序基本原理

1.解释程序的基本结构

解释程序通常可以分为两部分:

  • 分析部分,包括通常的词法分析、语法分析和语义分析程序,经语义分析后把源程序翻译成中间代码,中间代码常采用逆波兰式表示形式;
  • 解释部分,用来对第一部分产生的中间代码进行解释执行。

2.高级语言编译与解释方式的比较

从以下几个方面进行比较:

  • 效率,编译比解释方式可能取得更高的效率;
  • 灵活性,解释方式能够比编译方式更灵活;
  • 可移植性,解释器一般也是由某种程序设计语言编写的,因此只要对解释器进行重新编译,就可以使解释器运行在不同的环境中。

你可能感兴趣的:(软件设计师考试 | 第二章 程序设计语言基础知识 | 语言处理程序基础)