【编译原理】期末复习
仅供参考
不一定正确,欢迎指正
【编译原理】导航-CSDN博客
选择题
1.下面不是翻译程序的是:()
A.编译程序
B.解释程序
C.汇编程序
D.源程序
D
2.如果文法无二义性,则与最左归约互为逆过程的是()
A.最右归约
B.最左推导
C.规范归约
D.规范推导
D
规范(最左)归约
规范(最右)推导
3.乔姆斯基把文法分别四种类型,即0型、1型、2型、3型,其中2型文法是:()
A.上下文无关文法
B.正规文法
C.属性文法
D.短语文法
A
0型(递归可枚举,图灵机)
1型(上下文有关文法)
2型(上下文无关文法)
3型(正规文法、线性文法)
4.若在Pascal语言源程序中出现“&#&”,且不出现在允浩和注释里,在编译时会()
A.不报错
B.语法分析时报错
C.词法分析时报错
D.代码生成时报错
C
5.下面哪种方法是自上而下的语法分析()
A.LL(1)
B.LR(0)
C.算符优先分析法
D.规范归约
A
6.在符号表中,作为关键字的是()
A.信息栏
B.名字栏
C.内情向量表
D.previous栏
B
编译原理之符号表_编译原理符号表-CSDN博客
7.C语言,允许递归过程,还允许用户动态地申请和释放空间,应采用以下哪种存储分配策略()
A.静态分配策略
B.栈式分配策略
C.堆式分配策略
D.以上都有
D
编译原理 期末考试复习题_文法 g[d]: d→tl t→i|r l→l,x|x 1)消除该文法的左递归; 2)判断改动后文法-CSDN博客编译原理 第九章复习题 运行时存储空间组织_嵌套过程语言的程序,内层过程引用非局部量可通过( )跟踪外层过程最新活动记录的位-CSDN博客
8.表达式(x+y)*z-w的逆波兰式是()
A.xyzw+*-
B.xy+z*w-
C.xy+zw-*
D.xyzw+-*
B
9.下面的处理属于编译那个阶段的工作()
(IntToReal,60,-,t1) (*,id3,60.0,t1)
(*,id3,t1,t2) (+,id2,t1,id1)
(+,id2,t2,t3)
(:=.t3.-,id31)
A.词法分析
B.语法分析
C.中间代码生成
D.优化
D
10.符号表的三种构造和处理方法为:线性查找、二叉树、()
A.折半技术
B.自适应技术
C.杂凑技术
D.逆序查找技术
C
判断题
1.每个句型都可以为其建立规范推导()
对
2.可以利用高级程序设计语言构造编译程序()
对
3.采用三元式实现三地址代码时,不利于对中间代码进行优化()
对
4.在编译处理过程中,符号表只有在词法分析阶段和语法分析阶段才是有用的()
错
5.在一个连续的存储块存放管理过程的活动所需要的信息,称这样的连续存储块为活动记录()
对
简答题
1.简述典型的编译程序包括了哪些部分?
词法分析
从左到右一个字符一个字符的读入源程序,对构成源程序的字符串进行扫描和分解,从而识别出一个个单词
语法分析
在词法分析基础上将单词序列分解成各类语法短语,如程序、语句、表达式等
语义分析与中间代码生成
审查有无语义错误,并为代码生成收集类型信息(类型检查、变量是否声明、类型是否一致、变量是否已有值等)
将源程序变成一种内部表示形式(中间代码)
代码优化
可在不同的编译阶段进行,其中对中间代码的优化尤其重要
目标代码生成
把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码
表格管理
作为进行语法的合法性检查的依据,作为目标代码生成阶段地址分配的依据
出错处理
错误检测处理与符号表管理工作一样,贯穿整个编译过程
1. 词法分析器(Lexical Analyzer / Scanner)
作用:将源代码字符流分解为有意义的词法单元(Token)。
输出:Token 序列(如标识符、关键字、运算符、常量等)。
工具示例:Flex(基于正则表达式)。
2. 语法分析器(Syntax Analyzer / Parser)
作用:根据语法规则检查 Token 序列的结构,生成抽象语法树(AST)。
输出:抽象语法树(AST)。
工具示例:Bison(基于上下文无关文法)。
3. 语义分析器(Semantic Analyzer)
作用:
检查语义正确性(如类型匹配、变量声明、作用域规则)。
填充符号表(Symbol Table)信息。
输出:带语义标注的 AST。
4. 中间代码生成器(Intermediate Code Generator)
作用:将 AST 转换为与机器无关的中间表示(IR)。
常见形式:三地址码(如
t1 = a + b
)、四元式、控制流图(CFG)。目的:简化后续优化和跨平台移植。
5. 代码优化器(Optimizer)
作用:对中间代码进行优化(局部/全局优化),提升执行效率或减少资源占用。
优化类型:
常量折叠、公共子表达式消除。
循环优化(如循环展开、强度削弱)。
死代码删除、内联函数等。
6. 目标代码生成器(Code Generator)
作用:将优化后的中间代码转换为目标机器代码(汇编或二进制)。
关键任务:
寄存器分配(如图着色算法)。
指令选择(匹配机器指令模式)。
指令调度(优化流水线性能)。
7. 符号表管理(Symbol Table Manager)
作用:全程维护标识符的属性信息(如类型、作用域、内存地址)。
数据结构:哈希表、树形结构(支持嵌套作用域)。
8. 错误处理程序(Error Handler)
作用:
检测并报告编译各阶段的错误(词法、语法、语义等)。
支持错误恢复(如跳过错误代码段继续编译)。
前端 vs 后端:
前端:词法分析 → 语法分析 → 语义分析(与目标机器无关)。
后端:中间代码优化 → 目标代码生成(与目标机器相关)。
2.什么是属性文法,什么是语法制导的翻译模式?
将语义以“属性”的形式附加到各文法符号上,再根据产生式所蕴含的语义,给出每个文法符号的属性的求值规则,从而形成一种带有语义属性的上下文无关文法
根据文法中每个产生式所蕴含的语义,为其配备一个(或多个)语法或子程序,对所要完成的功能进行描述,在语法分析过程中,当分析器使用该产生式进行语法分析时(无论是推导还是归约),除完成语法分析动作之外,还将调用为其配备的寓意子程序,进行相应地语义处理,完成语义翻译工作
3.谈一谈编译技术都有哪些应用,学习编译原理课程你有哪些收获
语言的结构化编辑器:提供关键字及其匹配的关键字,可减少语法错误,加快源程序调试
语言程序的调试工具:提供判定程序的算法与功能是否正确
程序格式化工具:使程序呈现清晰的结构
语言程序的测试工具:静态分析器(对源程序进行语法分析)、动态测试器(测试用例、对程序进行动态测试)
高级语言之间的转换工具:一种高级语言转化成另一种高级语言
嵌入式系统:一般嵌入式系统中资源有限,一般无法提供编译、汇编、链接工具,应用软件也一般不能直接嵌入式平台上开发,需要在交叉斌阿姨环境下开发
并行编译(多核时代):并行编译系统能够处理并行程序设计语言,能够实现串行程序并行化。具有并行优化能力的编译系统
人工智能时代
机器学习:通过对机器学习算法代码的静态和动态分析,优化算法的执行效率,提高模型的训练和推理速度
深度学习框架:将神经网络模型编译成可执行代码在GPU或TPU上运行,从而实现高速的计算和预测
图像处理和计算机视觉:对图像处理算法的优化,提高视觉系统的性能
自然语言处理:通过对自然语言处理领域中的语义分析和语法分析,提高算法的执行效率和准确率
大模型编译:对编译的优化、修复代码错误、代码自动生成和程序合成等
“编译器是计算机科学的缩影”
学习编译原理的价值,远不止于“写一个编译器”。它提供了一套解构复杂系统的方法论,赋予开发者:
透视代码的能力:看清从高级语言到硬件的完整链条;
解决底层问题的工具:性能优化、安全分析、语言设计;
跨领域迁移的思维模型:自动机、IR、数据流等核心思想可复用于众多领域。
正如计算机科学家 Edsger Dijkstra 所言:
“计算机科学不是关于计算机,而是关于抽象。”
编译原理正是对“程序如何被计算机理解”这一终极抽象的系统化诠释。
1. 深入理解程序执行的本质
从代码到机器:掌握高级语言如何逐层降级为机器指令(词法→语法→语义→优化→目标码)。
内存管理机制:理解栈帧分配、寄存器分配、垃圾回收如何实现。
2. 提升系统级设计与调试能力
性能优化思维:识别代码热点,理解编译器优化(如循环展开、内联)的底层逻辑。
调试复杂问题:能分析链接错误、段错误(Segmentation Fault)的深层原因。
3. 掌握核心计算机科学理论
自动机理论:正则表达式(词法分析)、下推自动机(语法分析)的实际应用。
形式语言与文法:理解 BNF 范式如何定义编程语言结构。
算法实践:图论(控制流分析)、动态规划(寄存器分配)的工程落地。
4. 培养工程化思维
模块化设计:编译器前端/后端分离(如 LLVM IR 解耦语言与硬件)。
复杂系统构建:学习符号表管理、错误恢复等大规模系统设计技巧。
5. 扩展技术视野
语言设计能力:理解语法糖、类型系统的实现原理,为设计 DSL 奠基。
跨领域迁移:编译技术中的中间表示(IR)思想被广泛应用于静态分析、AI 模型编译。
6. 实战技能提升
工具链使用:Flex/Bison、ANTLR、LLVM 等工业级工具实践。
代码生成能力:手动实现词法/语法分析器,深入理解状态机与递归下降解析。
传统编译器与解释器
静态编译:C/C++、Rust 等语言通过 GCC、LLVM 生成高效机器码。
即时编译(JIT):Java(JVM)、JavaScript(V8)、Python(PyPy)在运行时动态编译优化。
跨平台编译:如 Android NDK 将 C++ 代码编译为不同 CPU 架构的二进制文件。
程序分析与安全
静态代码检查:ESLint、SonarQube 基于抽象语法树(AST)检测代码缺陷。
漏洞挖掘:通过数据流分析追踪危险函数调用(如缓冲区溢出)。
代码混淆与反编译:保护知识产权(如 ProGuard 混淆 Java 字节码)。
高性能计算与优化
GPU 编程:CUDA/OpenCL 编译器将并行代码映射到显卡指令集。
AI 框架优化:TVM、TensorRT 编译深度学习模型,优化推理速度。
数据库查询优化:SQL 查询被编译为执行计划(如 Apache Calcite)。
领域特定语言(DSL)
嵌入式 DSL:React JSX(编译为 JavaScript)、SQLAlchemy(Python ORM)。
科学计算:Halide 编译优化图像处理流水线。
开发工具链
代码格式化工具:Prettier(基于 AST 重写代码)。
语法高亮与补全:IDE 的语法分析器(如 VS Code 的 LSP 协议)。
代码转译:Babel 将 ES6+ 代码编译为兼容旧浏览器的 JavaScript。
操作系统与虚拟机
系统内核编译:Linux 内核通过 GCC 编译为平台相关二进制。
字节码虚拟机:JVM、WASM 虚拟机执行跨平台中间码。
解答题
1.设有条件语句的文法G[S]为:S->iSeS | iS | i
文法G[S]是二义性的吗?请证明