保研面试/考研复试编译原理问题整理

1. 编译器/编译程序

把计算机高级语言 (源语言)编写的程序(源程序)翻译成该计算机的汇编语言或机器语言(目标语言)书写的程序(目标程序)的计算机程序称为编译器(或编译程序)。

2. 图灵机

1) 什么是图灵机

图灵机(英语:Turing machine),又称确定型图灵机,是一种将人的计算行为抽象化的数学逻辑机,其更抽象的意义为一种计算模型,可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。

所谓的图灵机就是指一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。

2) 图灵机的基本思想

图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,他把这样的过程看作下列两种简单的动作:

a) 在纸上写上或擦除某个符号;
b) 把注意力从纸的一处移动到另一处;

而在每个阶段,人要决定下一步的动作,依赖于(a)此人当前所关注的纸上某个位置的符号和(b)此人当前思维的状态。

3. 解释程序

工作方式:边解释边执行。

它以源程序为输入,在执行过程中不产生目标程序(代码),而是边解释边执行,即直接执行源程序中蕴含的操作。

4. 编译阶段的组合——前端与后端

  • 前端(Front-End)—与目标机无关的部分
    包括分析部分(词法、语法、语义分析)、中间代码生成与优化以及这部分的符号表管理错误处理。

  • 后端(Back-End)—的与目标机有关部分
    包括目标代码生成、与目标机有关的优化以及这部分的符号表管理和错误处理工作。

5. 编译器逻辑结构的组成

在这里插入图片描述

6. 词法分析器的输出

token序列,每个token包括两个方面的内容:token = 字符串(词义)+ 类型(词法)。

7. 正则表达式和有穷自动机

1) 正则表达式

  • 正规表达式(也称正则表达式):是用特定的运算符及运算对象按规则构造的表达式。
  • 每个正规表达式匹配(或代表、或表示)一个字符串的集合(称为正规集)。
  • 正规表达式是一种技术手段:用有限的表达式去解决无限个字符串匹配的问题。
  • 它是描述语言词法规则的形式化工具。

2) 从正则表达式到有限自动机

  • 正规式是单词的一种描述工具。由于正规式的简洁性,趋向于用正规式来描述单词,然后构造等价的有限自动机。

  • 有限自动机可以描述输入串被识别的过程,可以根据有限自动机构造词法分析程序。在这里插入图片描述

  • 正规式和有限自动机之间可以相互转换,它们之间存在着等价性。

8. chomsky文法

1) 分类

  • 0 0 0 型文法:若文法 G G G 中任一产生式 α → β α→β αβ,都有 α ∈ ( V N ∪ V T ) + α∈(V_N∪V_T)^+ α(VNVT)+ β ∈ ( V N ∪ V T ) ∗ β∈(V_N∪V_T)^* β(VNVT) ,则称 G G G 0 0 0 型文法。

  • 1 1 1 型文法(上下文有关文法):若文法 G G G 中任一产生式 α → β α→β αβ,都有 α ∈ ( V N ∪ V T ) + α∈(V_N∪V_T)^+ α(VNVT)+ β ∈ ( V N ∪ V T ) ∗ , ∣ β ∣ ≥ ∣ α ∣ β∈(V_N∪V_T)^* , |β|≥|α| β(VNVT),βα, 仅仅 S → ε S→ε Sε 除外,则称 G G G 1 1 1 型文法。

  • 2 2 2 型文法:若文法 G G G 中任一产生式 α → β α→β αβ,都有 α ∈ V N α∈V_N αVN β ∈ ( V N ∪ V T ) ∗ β∈(V_N∪V_T)^* β(VNVT) ,则称G为2型文法,也称为上下文无关文法。(对程序设计语言最有用)

  • 3 3 3 型文法:通常,把右线性文法及左线性文法统称为 3 3 3 型文法或正规文法

2) 文法和语言

  • 0 0 0 型文法产生的语言称为0型语言,它可由图灵机识别
  • 1 1 1 型文法或上下文有关文法(CSG)产生的语言称为1型语言或上下文有关语言(CSL),它可由线性线界自动机识别
  • 2 2 2 型文法或上下文无关文法(CFG)产生的语言称为2型语言或上下文无关语言(CFL),它可由下推自动机识别
  • 3 3 3文法或正则(正规)文法(RG)产生的语言称为 3 3 3 型语言正则(正规)语言(RL),它可由有限自动机识别

★ \bigstar 2型文法(即上下文无关文法)是描述程序设计语言语法的形式化工具;
★ \bigstar 3型文法是是描述程序设计语言词法的形式化工具。

3) 语言之间的关系

  • 0 0 0 型语言包含 1 1 1 型语言。
  • 1 1 1 型语言包含 2 2 2 型语言。
  • 2 2 2 型语言包含 3 3 3 型语言。

9. 语法分析

1) 自上而下的语法分析(LL 、递归下降)

a) 自上而下的语法分析算法

  • 已知文法 G [ S ] G[S] G[S],对任意输入串 w w w,若从文法的开始符号 S S S 出发, 能为 w w w 构造一个最左推导,则 w w w 是一个合法的句子,即 w ∈ L ( G ) w \in L(G) wL(G),否则 w w w 有语法错误。
  • 该算法自上而下为w的分析结果建立一棵语法树。

⧫ \blacklozenge 从文法开始符号 S S S 出发试图为输入符号串构造一个最左推导;
⧫ \blacklozenge 构造最左推导的过程就是选择产生式和匹配符号串的过程;
⧫ \blacklozenge 有时需要重复扫描词法分析输出的单词序列。

b) 递归下降分析方法

递归下降分析方法是一种自上而下的语法分析方法,该方法执行一组递归函数判断输入的单词序列是否符合语法规则。

c) 语法分析的基本步骤

  1. 对程序设计语言的语法规则进行形式化描述(用 2 2 2 型文法);
  2. 根据语言的语法描述形式,定义各种基本语法结构的抽象语法树
  3. 选择一种合适的语法分析算法,并在分析程序中插入动作(…) -----语法分析程序。

d) LL(1)分析

L L ( 1 ) LL (1) LL(1) 分析方法是一种自上而下的语法分析方法:

  • 第1个“ L L L”指的是由左向右地处理输入;
  • 第2个“ L L L”指的是它为输入串找出一个最左推导;
  • 括号中的数字 1 1 1 意味着它使用输入单词序列中的一个单词预测分析的动作。

构造 L L ( 1 ) LL(1) LL(1) 分析表的步骤:

  1. F i r s t First First 集合;
  2. F o l l o w Follow Follow 集合;
  3. 构造 L L ( 1 ) LL(1) LL(1) 分析表。

2) 自下而上的语法分析(LR)

a) 自下而上的语法分析方法

  • 从输入单词序列开始,自左至右逐步进行归约,试图将其归约为文法的开始符号。
  • 从输入单词序列开始,以单词作为语法树的叶节点,自底向上地构造语法分析的结果----语法树。
  • 在自下而上语法分析工作的每一步,都是从当前串中选择一个子串,将它归约到某个非终结符号。
  • 自下而上的语法分析算法通常采用规范归约,即规范推导的逆过程。
    ⧫ \blacklozenge 规范规约的每一步是从当前的规范句型中将句柄归约为相应的非终结符。

b) LR分析概览

LR分析法是一种有效的自下而上的语法分析技术,它能适用于大部分上下文无关文法的分析,一般叫 L R ( k ) LR(k) LR(k) 分析方法,其中:

  • L L L 是指自左(Left)向右分析输入单词序列;
  • R R R 是指分析过程都是构造最右(Right)推导的逆过程(规范归约);
  • 括号中的 k k k 是指在决定当前分析动作时向右看的单词个数。

★ \bigstar 应用面广:能够通过 L R LR LR 分析程序识别所有采用上下文无关文法描述的程序设计语言的语法结构;
★ \bigstar 能有效实现:是无回溯的移进—归约方法;
★ \bigstar 容易查错: L R LR LR 分析器能够及时发现语法错误和准确指出错误位置。

10. 运行时环境

目标代码运行时,存储空间的组织称为目标代码的运行时环境
在这里插入图片描述

1) 程序执行时的存储器组织

目标代码运行时,操作系统为目标代码的运行分配的存储空间按用途可划分为下面几个部分:
在这里插入图片描述

  1. 代码区域:目标代码的存储区域,由于代码区在执行之前是固定的,在编译时所有目标代码的地址都是可计算的,程序执行结束后代码区域内存由系统释放。
  2. 全程/静态区域:静态数据区用来存放那些具有绝对地址的数据和变量(如静态变量和全程变量);编译器可以确定其所占用存储空间的大小,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序执行结束后由系统释放。
  3. 栈区:函数中的形参和在函数中定义的局部变量以及局部临时变量(C、C++、Java),这些变量分配在栈区,每次函数执行的时候会在栈中为函数的执行分配相应的存储区,而在函数执行完毕后,释放相应的存储区。
  4. 堆区:供用户动态申请存储空间,编译器“不需要”知道究竟得从 h e a p heap heap 中分配多少空间,也不需要知道从 h e a p heap heap 上分配的空间究竟需要存在多久。
    在C中由 m a l l o c , f r e e malloc,free mallocfree 运算产生释放的存储空间,在C++中由 n e w new new d e l e t e delete delete 运算符作用的存储空间,以及在Java中由 n e w new new 分配的存储空间都在堆中进行分配。

2) 活动记录

  • 在C语言中, 采用以函数(或过程)为单位的动态存储分配方案:
    当一函数被调用时,就在栈顶为该函数分配所需的数据空间(过程活动记录),当一个函数工作完毕返回时,它在栈顶的数据空间(过程活动记录)也即释放。
  • 过程的活动记录(activation record, AR)是一段连续的存储区,用于存放函数的一次执行所需要的信息,当调用或激活函数时,必须为被调用函数的活动记录分配空间。
  • 活动记录存放的信息至少应包括以下几个部分:
    在这里插入图片描述

3) 堆管理

  • 对于允许程序为变量在运行时动态申请和释放存储空间的语言,采用堆式分配是最有效的解决方案。
  • 堆式分配的基本思想是,为运行的程序划出适当大的空间(称为堆 H e a p Heap Heap),每当程序申请空间时,就从堆的空闲区找出一块空间分配给程序,每当释放时则回收之。
  • 7
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
1. 什么是编译原理编译原理是计算机科学与工程中的一门重要学科,研究的是如何将高级语言程序翻译成机器语言的方法和技术。 2. 编译器的工作流程是什么? 编译器的工作流程大概可以分为以下几个步骤: (1)词法分析:将代码分解成一个个单词(Token)。 (2)语法分析:将代码转换成一棵语法树。 (3)语义分析:检查代码的语义是否合法。 (4)中间代码生成:将高级语言程序转换成中间代码。 (5)代码优化:对中间代码进行优化,提高代码效率。 (6)目标代码生成:将中间代码转换成机器码。 3. 什么是词法分析? 词法分析是编译器的第一步,它的作用是将整个代码分解成一个个单词(Token),并将单词分类为不同的语法成分。 4. 什么是语法分析? 语法分析是编译器的第二步,它的作用是将单词流转换成一棵语法树,反映出程序的结构和语法。 5. 什么是语义分析? 语义分析是编译器的第三步,它的作用是检查代码的语义是否合法。检查包括:类型匹配、定义检查、作用域检查、引用检查等。 6. 什么是中间代码? 中间代码是一种可读性高、与机器无关的代码,它是在源代码翻译到目标代码的过程中产生的。中间代码通常是一种结构化的、包含高级语言的特定结构的代码。 7. 什么是代码优化? 代码优化是编译器的一项重要任务,它的目标是提高中间代码的效率,最终提高程序的执行效率。常见的代码优化方法包括常量替换、循环展开、函数内联等。 8. 什么是目标代码? 目标代码是编译器编译后直接可执行的机器代码,其格式和指令集取决于目标机器的架构和操作系统。在目标代码生成过程中,会进行指令选择、寄存器分配、代码空间分配等过程。 9. 什么是LLVM? LLVM是一个开源的编程语言工具链,可以用于编译任何语言到任何平台。它的核心是一个虚拟指令集,称为LLVM IR(Intermediate Representation),它是一种低级别编程语言,只比汇编语言高一个级别,但比它易于优化和跨平台。因此,LLVM可以拥有高效的优化技术,同时仍然具有跨平台的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一匹好人呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值