BUCT往年试题为导向的复习
标*的为往年真题
目录
1.基本概念
*例题(编译主要阶段)
编译程序与解释性程序区别
LL(1)概念
2.正则表达式转DFA
(1)正则表达式转NFA
第一种方法(编程时常用)
第二种(考试时常用)
(2)NFA转DFA及最小化DFA
*例题
3.各种文法(LL1 LR0 SLR LR1 LALR)
* ll1例题
*ll1例题
* lr1例题
3.属性文法
4.中间代码生成及优化
(1)写出三地址码和四元式、划分基本块
*例题
(2)优化基本块
*例题
5.课外知识
国产自主开发的编译器可以在哪些方面创新?
设计一个编译器,需要解决的关键点是什么?
为推进我国系统软件或应用 软件的发展,你的未来有什么计划和安排?
国产编译器有哪些?
当前我国编译器技术的发展?
6.上下文无关文法及分析
句柄、简单短语、短语
1.基本概念
*例题(编译主要阶段)
编译过程通常分为词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成六个主要阶段。
各个阶段的主要功能如下:
1.词法分析阶段:读入源程序,对构成源程序的字符流进行扫描和分解,识别出一个个单词,并表示成计算机内部的形式(TOKEN字)。输入为源代码,输出为词法单元序列。
2.语法分析阶段:在词法分析的基础上,将单词序列分解成各类语法短语,如“表达式”、“语句”、“程序”等,确定整个输入串是否构成语法上正确的程序。输入为词法单元序列,输出为语法树。
3.语义分析阶段:审查源程序有无语义错误,为代码生成阶段收集类型信息。输入为语法树,输出为带有语义信息的语法树。4.中间代码生成阶段:将源程序翻译成一种复杂性介于源程序与目标程序之间的内部形式(中间代码)。输入为带有语义信息的语法树,输出为中间代码。
5.代码优化:对前阶段产生的中间代码进行等价变换,目的是使将来生成的目标代码更为高效。输入为中间代码,输出为优化后的中间代码。
6.目标代码生成:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。输入为优化后的中间代码,输出为目标机器代码。
编译程序与解释性程序区别
1、主要是编译程序能生成目标程序,而解释程序不能。
2、编译程序是整体编译完了,再一次性执行;而解释程序是一边解释,一边执行
解释一句后就提交计算机执行一句,并不形成目标程序。就像外语翻译内中的“口译”一样,说一句翻一句,不产生全文的翻译文本。
3、执行速度不同
编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快。而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快容的。这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)
编译程序:C++ C Pascal
解释程序: JavaScript Python
编译解释程序(中间语言):Java C#
LL(1)概念
第一个L是指从左到右顺序处理输入的token序列
第二个L是指从文法的最左边开始推导
(1)是指用1个token来预测解析方向
2.正则表达式转DFA
NFA允许多值和空转移
DFA里不允许多值和空转移
(1)正则表达式转NFA
第一种方法(编程时常用)
第二种(考试时常用)
(2)NFA转DFA及最小化DFA
*例题
请构造与正则表达式 a*(b|a)a(a|b)*等价的状态最少的 DFA。
先* 再+ 最后|
注:最小化DFA时含有NFA终态6的DFA重新划分区域号为1,其余为0
什么叫含有NFA终态(即6)
NFA转DFA构造了下面这张表
a b
012 123 3
123 123456 3
3 456
123456 123456 356
456 56 56
356 456 56
56 56 56
从上往下依次记为DFAState0、DFAState1、DFAState2...
其中DFAState3 DFAState4 DFAState5 DFAState6为含有NFA终态的DFA
3.各种文法(LL1 LR0 SLR LR1 LALR)
貌似每年都考LL1和LR1这两种文法
这几种文法只有LL1需要消除左递归和提取左因子(其他文法消除了不影响最终结果,但可能会被酌情扣分)
会了LR1,LR0 ,SLR自然也会了
LALR是在LR1基础上合并
* ll1例题
编译原理 LL(1)-CSDN博客
*ll1例题
* lr1例题
比LR0多了向前搜索符
3.属性文法
一般是判断属性类型、画依赖图、求值顺序、计算属性值
语法制导的翻译和属性文法-CSDN博客 (里面两道题都是原题)
4.中间代码生成及优化
(1)写出三地址码和四元式、划分基本块
if条件分支习惯性用if_false
赋值型语句不用中间变量如fact = 1
计算型通常需要中间变量暂存结果如x = x-1 (t1 = x-1 x = t1)
*例题
怎么分基本块?
Goto语句为标志,包括GOTO前面的为一块
Label为标志,不包括Label前面为一块
(2)优化基本块
用DAG进行代码块优化主要是以下几种情况
*例题
5.课外知识
会出一道开放性的题目
国产自主开发的编译器可以在哪些方面创新?
1.多语言支持:设计一个统一的编译器框架,能够支持多种编程语言,方便开发者使用不同的语言进行开发。
2.跨平台兼容性:支持多种硬件架构和操作系统,增强可移植性。
3.智能优化:利用机器学习和人工智能技术进行代码优化,自动学习和识别常见的性能瓶颈并进行针对性优化。
4.高效的调试工具:提供强大的调试和分析工具,包括动态代码分析、性能分析等,帮助开发者更好地理解和优化程序。
5.安全性:集成静态代码分析工具,自动检测可能的安全漏洞和编码问题,提高软件的安全性。
设计一个编译器,需要解决的关键点是什么?
1. 词法分析(Lexical Analysis)
首先,需要一个词法分析器来将源代码转换为标记(tokens)。这涉及定义语言的词法规则,并构建一个扫描器来识别这些标记。2. 语法分析(Syntax Analysis)
语法分析器基于词法分析生成的标记来检查代码是否符合语言的语法规则。通常使用上下文无关文法(Context-Free Grammar, CFG)来描述语法。语法分析器生成一个抽象语法树(AST),表示代码的结构。3. 语义分析(Semantic Analysis)
在此阶段,对AST进行进一步检查,以确保程序的语义正确。例如,检查变量声明和使用的类型一致性,函数调用参数是否匹配等。此外,还需要进行符号表管理,记录变量、函数等符号的作用域和类型信息。4. 中间代码生成(Intermediate Code Generation)
中间代码是介于高层源代码和低层机器码之间的一种中间表示形式。这种中间形式通常是独立于机器的,便于优化和移植。5. 优化(Optimization)
优化阶段通过各种技术来改进中间代码,使其运行更快或者占用更少资源。可以分为局部优化(如消除公共子表达式)和全局优化(如循环优化)。6. 目标代码生成(Target Code Generation)
这一阶段将中间代码转换为目标机器代码。这个过程包括指令选择、寄存器分配和指令调度等。7. 代码生成后优化(Post-Compilation Optimization)
生成目标代码后,还可以进行一些平台相关的优化,如指令流水线优化。8. 错误处理(Error Handling)
需要设计一种有效的错误处理机制,不仅要检查语法和语义错误,还要能够在错误发生时提供有用的诊断信息,从而帮助程序员纠正错误。
为推进我国系统软件或应用 软件的发展,你的未来有什么计划和安排?
1.学习与研究:深入学习编译原理、操作系统、计算机体系结构等基础知识,并跟踪最新的研究成果和技术进展。
2.实践与积累:通过实际项目积累经验,例如参与开源编译器项目,或者自己动手设计一个编译器原型。
3.合作与交流:积极参与学术会议和技术交流活动,与同行分享经验和成果,推动行业共同进步。
国产编译器有哪些?
华为方舟编译器、腾讯捐赠的OpenKona JDK、AI编译器ICRAFT、面向国产高性能加速器的LLVM编译器优化等
当前我国编译器技术的发展?
华为方舟编译器正式开源一年以来,方舟编程体系陆续实现了编译器、引擎、调试器的开源,为我国带来更多话语权,但国产编译器仍需提高自主性。多数做芯片的公司,将资源集中至硬件方面,做软件的资源不足,无法自主研发编译器。
6.上下文无关文法及分析
做过作业但往年试卷没出过的零碎知识点
句柄、简单短语、短语
短语:一个节点每个子树的叶节点
简单短语:子树中不再包含其他的子树,即A只能推导出b,而b不能再推出其他的式子,则b为此句型的简单短语
句柄:直接短语中的最左直接短语为该句型的句柄。