编译原理期末复习

news2024/11/24 17:45:28

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为此句型的简单短语

句柄:直接短语中的最左直接短语为该句型的句柄

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1852871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

19 Shell编程之条件语句

目录 19.1 条件测试操作 19.1.1 文件测试 19.1.1 整数值比较 19.1.3 字符串比较 19.1.4 逻辑测试 19.2 if条件语句 19.2.1 if语句的结构 19.2.2 if语句应用示例 19.3 case分支语句 19.3.1 case语句的结构 19.3.2 case语句应用示例 19.1 条件测试操作 Shell环境根据命令执行后…

Agile Software Development

Individuals and interactions over processes and tools.(个人和协作超过过程和工具) working software over comprehensive documentation.(工作软件超过完全文档) Customer collaboration over contract negotiation.(客户协作超过合同谈判) Responding to change over f…

数据结构与算法笔记:基础篇 - 初始动态规划:如何巧妙解决“双十一”购物时的凑单问题?

概述 淘宝的 “双十一” 购物节有各种促销活动,比如 “满 200 元减 50元”。假设你女朋友购物车中有 n 个(n > 100)想买的商品,它希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最长…

urfread刷算法题day4|27. 移除元素+复习

27. 移除元素 题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。 元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以…

maven的安装以及配置

前言: Maven是一个强大的构建自动化工具,主要用于Java项目。它解决了软件开发中的两个方面: 构建和依赖管理:Maven通过在项目对象模型(POM)文件中指定依赖关系,简化了项目构建和依赖管理的过程…

Vendors and Customers(酒吧餐厅厨师人物动画动作)

此包包含商店、酒吧和餐馆中顾客和工作人员的各种动画。 包括: 饮食动画。站立、倾斜和坐着(酒吧凳子和椅子),以及各种姿势的进入和退出动画,坐姿变化(腿抬起、弯腰、交叉腿、向后倾斜)和害怕反应动画(举手、躲藏、畏缩)。 厨师烹饪动画(煎锅、炒锅、平底锅、锅)、食…

《Python 机器学习》作者新作:从头开始构建大型语言模型,代码已开源

ChatGPT狂飙160天,世界已经不是之前的样子。 更多资源欢迎关注 自 ChatGPT 发布以来,大型语言模型(LLM)已经成为推动人工智能发展的关键技术。 近期,机器学习和 AI 研究员、畅销书《Python 机器学习》作者 Sebastian …

CMMM Plus+ Calculus Update 超级游戏大作 游戏说明

资源链接 关卡编辑器 ◽️使用 WASD 移动视图。 ◽️LMB 放置单元格。 ◽️Space LMB 删除单元格。Ctrl Space LMB 删除所有相同类型的单元格。 ◽️Q / E 旋转单元格。 ◽️Z / X 在单元格类别之间切换。 ◽️键 1-9 快速选择单元格。 ◽️按 F 显示可拖动的图块。 ⌨️控…

【SpringCloud】OpenFeign-远程调用

本文基于上一篇http://t.csdnimg.cn/0qm2R 的基础上添加OpenFeign的使用。 微服务通信 在微服务架构中,微服务之间的通信通常有两种方式:RPC 和 HTTP。在 Spring Cloud 中,默认使用 HTTP 进行微服务的通信,最常用的实现形式有两…

idea或vscode支持vue语法,ts可解析*.vue

一、ide不能解析vue文件 刚开始导入时,在vscode中的vue文件中内容都是灰色的 ide不能解析vue解决方法: 1.idea或webstorm安装vue.js插件 2.在vscode中 vue2.0的项目安装vetur插件vue3.0及以上的项目安装Vue-official插件(之前是Volar&…

WordPress项目教程:自动采集并发布,让你轻松实现网站内容更新

随着互联网的发展,越来越多的人开始关注自己的个人网站,通过网站展示自己的才华、分享知识、推广产品等。然而,个人网站的运营并非易事,尤其是内容更新方面。为了解决这个问题,今天我们将为大家推荐一款WordPress插件主…

使用C语言实现植物大战僵尸教程

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

数据资产与云计算深度融合:借助云计算技术,优化数据存储、高效处理并创新应用,驱动企业数字化转型

目录 一、引言 二、数据资产与云计算深度融合的必要性 1、数据资产的重要性 2、云计算技术的优势 三、云计算技术在数据资产管理中的应用 1、数据存储的优化 2、数据处理的高效性 3、数据应用的创新 四、云计算驱动企业数字化转型的实践案例 案例一:金融行…

STM32玩转物联网07-WIFI实验

前言 上一节我们学习了串口的简单使用,本节我们增加难度,做一个demo通过AT指令控制ESP8266,使用DMA方式接收ESP8266发来的数据,后续我们便开始通过ESP8266连接物联网云平台,敬请关注。 一、准备 1. ESP8266硬件准备 准…

[图解]建模相关的基础知识-16

1 00:00:00,350 --> 00:00:04,130 刚才那个,就相当于,12这个我们可以认为是什么 2 00:00:05,020 --> 00:00:11,360 我们用类图来表达就是,员工、电话 3 00:00:13,320 --> 00:00:15,080 多个 4 00:00:15,090 --> 00:00:16,440 …

stm32使用time模块输出pwm波,stm32-matlab开发电机控制

simulink: stm32cubemx : 注意在stm32配置了两路的一个互补输出,但实际上在matlab里只需要给定占空比就行了,他会自动输出互补,驱动电机,这是因为有点的电机输出需要6路,有的只需要1路,我们看下图就知道了…

Vue.JS中如何监听生命周期事件?

目录 一、Vue.JS框架介绍二、Vue.JS的监听事件三、Vue.JS的生命周期事件四、Vue.JS中如何监听生命周期事件 一、Vue.JS框架介绍 Vue.js是一个用于构建用户界面的渐进式JavaScript框架。它设计得非常灵活,可以轻松地被集成到现有的项目中,也可以作为一个…

能正常执行但是 cion 标红/没有字段提示

ctrl q 退出 clion 找到工程根目录,删除隐藏文件 .idea 再重新打开 clion 标红消失,同时再次输入函数/类属性,出现字段提示 clion 的智能提示方案存储在 .idea 文件中,如果工程能够正常编译执行,那么说明是智能提示…

ARM32开发--WDGT看门狗

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 什么是看门狗 ARM中的看门狗 独立看门狗定时器 窗口看门狗定时器 独立看门狗FWDGT 初始化配置 喂狗 完整代码 窗口看门狗WWDGT 初始化配置 喂狗 完整代码 注意 总结 前言 嵌入式系统在如今的科技发…

程序猿大战Python——面向对象——私有权限

私有属性 目标:掌握私有属性的使用。 为了更好的限制属性的访问和包含隐私,可以给属性设置私有权限。 当把属性设置为私有属性后,则该属性只能被本类直接访问。 定义私有属性语法: self.__属性名 设置和获取私有属性值语法&am…