编译原理知识点整理

选择判断知识点记录

  • 编译程序是一种系统软件

  • 对编译程序分“遍”可以使编译程序结构清晰

  • 编译程序各阶段的工作都涉及到的是表格管理和出错处理

  • BNF是一种广采用的描述文法的工具

  • 编译程序生成的目标代码不一定的可执行的程序
    编译原理知识点整理_第1张图片

  • 文法识别符号经过任意步推导得到的结果是句型

  • 词法分析所依据的是构词规则

  • 自下而上的语法分析中,应该从句子开始分析

  • 中间代码生成时依据的规则时语义规则

  • 四元式的中间代码便于优化处理

  • 三元式之间的联系通过指示器实现,四元式通过临时变量实现

  • 间接三元式表示法的优点是采用间接码表,便于优化处理

  • 四元式表示法的优点是便于优化处理,也便于表的更动

  • 堆式动态分配申请和释放存储空间遵守任意原则

  • 动态分配存储分配包括栈式和堆式两种分配方式

  • 动态存储分配,即指在目标程序或操作系统运行阶段动态地为源程序中的量分配存储空间。静态存储才是由编译器来确定的

  • FORTRAN按静态存储分配,C和Pascal语言采用静态和动态存储分配的策略

  • 运行阶段的存储组织与管理的目的式为运行阶段的存储分配做准备及提高目标程序的运行速度

  • 编译程序使用说明标识符的过程或函数的静态层次来区分标识符的作用域

  • 词法分析器作为独立的阶段使整个编译程序结构更加简洁、明确,因此词法分析器作为子程序较好

  • 采用确定的自顶向下分析时必须避免回溯

  • 编译程序绝大数时间花在表格管理上

  • 解释程序的特点是处理程序不产生目标代码

  • 在规范规约中,用句柄来刻画可规约串

  • 把汇编程序翻译成及其可执行的目标程序的工作是由汇编器完成的

  • 编译过程中,语法分析程序的任务是:分析单词串是如何构成语句和说明的;分析语句和说明是如何构成程序的;分析程序结构

  • 若文法G定义的语言是无限集,则文法必然是递归的

  • 源语言编写被编译的程序使用的语言

  • 每个阶段读入整个输入并进行处理的过程称为遍或躺

  • NFA的初始状态可以是多个。DFA的初始状态只有一个

  • 对任何正则文法G,存在定义同一语言的正则表达式r;对任何正则表达式r,存在生成同一语言的正则文法G

  • 一般不一定把所有与编译有关的基本工作放在唯一的一遍中,也不一定把每个基本工作作为独立的一遍完成,往往是进行适当的组合

  • 要构造行之有效的自上而下的分析器,则必须消除回溯

  • 算符优先分析法每次规约的都是当前句型的最左素短语,而LR分析法规约的为当前句型的句柄

  • LR分析法在自左至右扫描输入串时就能发现错误,并能准确指出出错地点

  • LR分析技术可以适用二义性文法

  • 只含有综合属性的属性文法称为S-属性文法,它是L-属性文法的特例

  • DAG图表示基本块,流图反映基本块之间的关系

简答题

NFA与DFA的区别
①NFA可以有若干个开始状态,而DFA仅一个;
②NFA的映像M不是单值函数,而DFA的映像是单值函数。

何谓优化?按所涉及的程序范围可以分为那几级优化?
优化:从程序进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码
局部优化:是在一个基本块内完成的优化,考察一个基本块中的四元式序列就可以完成;
全局优化:必须在考察基本块之间的相互联系与影响的基础上才能完成。
试联系C语言,简述源程序的一般编译过程,并简要说明可采用哪些技术?
(1) 词法分析。基于正则文法,从左到右扫描源程序正文的字符,根据词法规则识别具有独立意义的各个最小语法单位符号,以供下一阶段语法分析程序使用。
(2) 语法分析。根据给定的语法规则,识别各个语法结构。
(3) 语义分析。语义分析能完成确定类型、类型检查、识别含义以及相应语义的处理,
(4) 代码优化。为改进目标代码质量而进行的各项工作。,把它变换成功能相同、但效率更高的优化了的中间表示代码。
(5) 目标代码生成。把中间表示代码变换成等价的目标程序,即目标语言代码。

简述手工编写词法分析程序的基本思路
词法分析程序手工实现时的基本思路是:
(1) 首先基于某程序设计语言设计属性字,
(2) 然后设计各类表格(如标识符表、常量表.符号机内表示对照表等),
(3) 再画出总控流程图及取符号、取字符与查造标识符表等子程序的程序控制流程图,
(4) 最终完成编程及其调试。

文法规则在计算机内存中有哪几种存储表示法?

  1. 用整数去代替符号,用在终结符号集中的序号代替终结符号,用在非终结符号集中的序号代替非终结符号。
  2. 将文法设计成链式表示的数据结构。

试简述语义分析的基本工作
语义分析阶段分析源程序的含义,并作相应的语义处理。
(1)确定类型。确定标识符所关联数据对象的数据类型。
(2)类型检查。按照语言的类型规则,对运算及进行运算的运算分量进行类型检查。
(3)识别含义,并作相应的语义处理。
(4)其他一些静态语义检查。例如控制流检查。

试联系C语言说明运行时刻的存储分配策略
在运行时刻,存储分配策略有静态分配策略与动态存储分配策略。
静态分配策略:指在编译时就能确定每个数据目标在运行时刻的存储空间需求。
动态存储分配策略有栈式分配策略与堆式分配策略。
栈式存储分配,是由一个类似于堆栈的运行栈来实现的,和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,栈式存储分配按照先进后出的原则进行分配。
堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例。堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放。

试说明中间代码的作用(优点)及其形式。

中间代码是对程序设计语言结构成分含义的分析产物,
(1) 通常与机器无关,可使一个语义分析程序适用于多个目标代码生成程序;
(2) 对其进行与机器无关的优化,有利于提高目标代码的质量;
(3) 分阶段进行使得各阶段的开发复杂度降低,有利于编译程序本身的开发。
形式:抽象语法树、逆波兰表示、四元式序列、三元式序列
试简述代码优化的概念及分类。
概念:代码优化指的是编译时刻为改进目标程序的质量而进行的各项工作。
分类:按照与机器相关的程度,可分为与机器相关的优化和与机器无关的优化。
从优化范围的角度,分为局部优化和全局优化两类。
从优化语言级看,可以把代码优化分成对中间表示代码进行的优化与对目标语言代码进行的优化。

你可能感兴趣的:(编译原理,编译原理)