编译原理保研面经

编译原理

1. 什么是编译?★

编译是将高级程序语言(源代码)转换为计算机可执行的低级机器语言(目标代码)的过程。编译器是执行这一过程的软件工具。

编译过程一般包括以下几个步骤:

(1)词法分析:从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词。这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义。

(2)语法分析:根据语法规则,在词法分析的基础上将单词序列分解成各类语法短语,如“程序”、“语句”、“表达式”,将词法单元构建成语法树。

(3)语义分析:审查源程序有无语义错误,为代码生成阶段收集类型信息。对语法树进行遍历和分析,进行类型检查、语义检查以及生成中间表示等。

(4)中间代码生成:将语法树转换为一种中间表示形式,如三地址码 (Three-Address Code)、虚拟机代码(Virtual Machine Code)等。中间代码更加接近于机器语言,但仍是与具体机器无关的形式。

(5)代码优化:对中间代码进行优化,以提高程序的执行效率、减少资源消耗或改进 代码质量。优化可能包括删除冗余代码、重新排序指令、利用寄存器等。

(6)目标代码生成:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。

2. 编译和解释有什么区别?★

编译和解释是两种不同的程序执行方式。

1)编译

是将整个源代码文件一次性转换为目标机器语言的过程。编译器会对源代码进行词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等步骤,生成一个可执行文件。

编译的优点:

执行速度快:编译器将整个源代码转换为机器码,执行效率更高。

独立性强:生成的目标代码与具体机器无关,可以在不同平台上执行。

一次编译,多次执行:编译后的可执行文件可以重复使用,无需再次进行翻译。

编译的缺点:

开发周期长:需要在编译阶段进行多个步骤的处理,产生可执行文件前的过程较为繁琐。

调试困难:由于编译生成的是目标代码,调试时难以直接定位到源代码的具体位置。

2)解释

是逐行解释执行源代码的过程。解释器会逐行读入源代码,并逐行解释执行,将每一行翻译成目标机器语言并立即执行。解释器不会事先将整个源代码文件转换成目标代码,而是边解释边执行。每次运行程序时,都需要重新解释源代码。

 解释的优点:

快速开发和测试:解释器无需额外的编译过程,可以直接执行源代码,加快了开发和调试的速度。

跨平台性:解释器本身可以在不同平台上运行,解释执行源代码时也可以保持跨平台的特性。

解释的缺点:

执行速度相对较慢:解释器需要逐行解释执行源代码,每次都需要进行翻译,执行效率相对较低。

依赖解释器环境:每次运行程序都需要有对应的解释器环境。

综上所述,编译适用于需要长时间运行、对执行效率要求较高的场景,而解释适用于快速开发、跨平台性要求较高的场景。实际选择编译还是解释取决于具体的应用需求和执行环境。

3. 自上而下分析法和自下而上分析的思想是什么?★

(1)自上而下分析

自上而下分析的思想是从文法的起始符号开始,逐步向下展开产生式,直到推导出输入串。它的基本过程是匹配输入串中的符号,并根据产生式选择合适的扩展方式,最终得到输入串。自上而下分析是一种预测性的分析方法,通过预测下一个可能的语法结构来构建语法树。常见的自上而下分析方法有递归下降分析和 LL(k)分析。

(2)自下而上分析

 自下而上分析的思想是从输入串的底部开始,逐步将终结符号转化为非终结符号,直到达到文法的起始符号。它的基本过程是将输入串进行规约操作,即根据产生式将较长的符号串替换为更短的符号串,最终得到文法的起始符号。自下而上分析的重点在于识别并构造出输入串中的局部语法结构,然后将其合并成更大的语法结构,直到得到整个语法树。常见的自下而上分析方法有 LR(k)和 LALR(k)分析。

4. 简述文法的分类。★★

文法是乔姆斯基(Chomsky)提出的一种文法分类体系。

0 型文法(短语文法): 没有限制产生式规则的形式,可以包括任意的字符串。

1 型文法(上下文有关文法): 1 型文法限制了产生式规则的形式,要求产生式的左部长度不小于右部长度。也就是说, 产生式的左部必须至少包含一个非终结符号,并且非终结符号的数量不能超过右部非终结符号的数量。

2 型文法(上下文无关文法): 产生式的左部只能是一个非终结符号,而右部可以是任意字符串。

3 型文法(正规文法): 3 型文法是最受限制的文法类型。它的产生式规则形式非常简单,要求每个产生式的右部只能有以下三种情况:

(1) A -> ε(A 可以直接推导出空串)

(2) A -> a(A 可以直接推导出一个终结符号 a)

(3) A -> aB(A 可以推导出一个终结符号 a 和一个非终结符号 B)。

0型文法的能力相当于图灵机,任何0型语言都是递归可枚举的。

3 型文法对应着正则语言,可以通过有限状态自动机进行识别和处理。

5. NFA 和 DFA 的区别。★

有穷自动机(有限自动机)作为一种识别装置,能准确得识别正规集,即识别正规文法所定义的语言和正规式所表示的集合。

有穷自动机分为两类:确定的有穷自动机(Deterministic Finite Automata,DFA)和不 确定的有穷自动机(Nondeterministic Finite Automata,,NFA) 。

NFA:在当前状态和输入符号的组合下,可以有多个可能的下一个状态。换句话说, NFA 允许非确定性转移,即可以通过空转移或者多个转移路径到达下一个状态。

 DFA:在当前状态和输入符号的组合下,只能存在唯一的下一个状态。DFA 不允许非 确定性转移,每个输入都有且只有一个对应的转移路径。

6. 词法分析

词法分析阶段对应的形式语言为正规集。

7. 语法分析

语法分析阶段对应的形式语言为上下文无关文法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值