编译原理期末复习

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.mzph.cn/bicheng/32465.shtml

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

相关文章

MK的前端精华笔记

文章目录 MK的前端精华笔记第一阶段:前端基础入门1、(1)、(2)、 2、3、4、5、6、7、 第二阶段:组件化与移动WebAPP开发1、(1)、(2)、 2、3、4、5、6、7、 第三…

【JavaEE】Spring Web MVC详解

一.基本概念. 1.什么是Spring Web MVC? 官方链接: https://docs.spring.io/spring-framework/reference/web/webmvc.html Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning…

【ajax基础】回调函数地狱

一:什么是回调函数地狱 在一个回调函数中嵌套另一个回调函数(甚至一直嵌套下去),形成回调函数地狱 回调函数地狱存在问题: 可读性差异常捕获严重耦合性严重 // 1. 获取默认第一个省份的名字axios({url: http://hmaj…

5.什么是C语言

什么是 C 语言? C语言是一种用于和计算机交流的高级语言, 它既具有高级语言的特点,又具有汇编语言的特点 非常接近自然语言程序的执行效率非常高 C语言是所有编程语言中的经典,很多高级语言都是从C语言中衍生出来的, 例如:C、C#、Object-C、…

Android招聘市场技术要求越来越高,从事三年开发是否应该考虑转行?

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。 不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧! 《Framework精编…

Unity 字体创建时候容易导致字体文件不正确的一种情况

上面得到了两种字体格式,一种是TextMeshPro的,另一种是Unity UI系统中默认使用的字体资源。其原因是创建的位置不同导致的。 1.下面是TextMeshPro字体创建的位置 2:下面是Unity UI系统中默认使用的字体资源

【FreeRTOS】任务状态改进播放控制

这里写目录标题 1 任务状态1.1 阻塞状态(Blocked)1.2 暂停状态(Suspended)1.3 就绪状态(Ready)1.4 完整的状态转换图 2 举个例子3 编写代码 参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》 本节课实现音乐任务的创建,音乐播放的暂停与继续播放,删…

算法竞赛创新实践总结

目录 1 算法题目................................... 3 1.1 盛最多水的容器.......................... 3 1.1.1 题目................................ 3 1.1.2 双指针.............................. 4 1.1.3 代码................................ 5 1.2 分巧克力...…

spring-依赖注入DI

Setter注入: 1、引用类型:在bean中定义引用类型属性并提供可访问的set方法,配置中使用property标签ref属性注入引用类型对象; 2、简单类型:在bean中定义引用类型属性并提供可访问的set方法,在配置中使用pr…

反馈时延与端到端拥塞控制

先从 越来越无效的拥塞控制 获得一个直感。 开局一张图,剩下全靠编。这是一道习题: 这图来自《高性能通信网络(第二版)》,2002 年的书,很好很高尚,目前这种书不多了。不准备做这道题,但意思要明白&#x…

Docker 拉取镜像失败处理 配置使用代理拉取

解决方案 1、在 /etc/systemd/system/docker.service.d/http-proxy.conf 配置文件中添加代理信息 2、重启docker服务 具体操作如下: 创建 dockerd 相关的 systemd 目录,这个目录下的配置将覆盖 dockerd 的默认配置 代码语言:javascript 复…

手撕RPC——前言

手撕RPC——前言 一、RPC是什么?二、为什么会出现RPC三、RPC的原理3.1 RPC是如何做到透明化远程服务调用?3.2 如何实现传输消息的编解码? 一、RPC是什么? RPC(Remote Procedure Call,远程过程调用&#xff…

52、U-boot2023的移植教程

uboot:https://ftp.denx.de/pub/u-boot/ nxp-uboot:https://github.com/nxp-imx/uboot-imx 1、顶层Makefile 文件加入编译的两种方式:以xxx/xxx.c文件为例 1、使用menuconfig: 先编辑.c所在目录下的Kconfig&#xff0…

实验六:三维图形修改器的综合应用

如果文章有写的不准确或需要改进的地方,还请各位大佬不吝赐教💞💞💞。朱七在此先感谢大家了。😘😘😘 🏠个人主页:语雀个人知识库 🧑个人简介:大家…

20240623 每日AI必读资讯

🤖原生鸿蒙AI浓度要爆表了! - 一年一度华为开发者大会上,余承东首次揭秘“鸿蒙原生智能”Harmony Intelligence! - 华为小艺进化成系统级智能体。 - 一句话实现跨多个应用的规划和任务执行;在第三方APP上随意处理文…

啥移动硬盘格式能更好兼容Windows和Mac系统 NTFS格式苹果电脑不能修改 paragon ntfs for mac激活码

对于同时使用Windows和Mac操作系统的用户而言,选择一个既能确保数据互通又能满足大容量存储需求的移动硬盘格式尤为重要。下面我们来看看啥移动硬盘格式能更好兼容Windows和Mac系统,NTFS格式苹果电脑不能修改的相关内容。 一、啥移动硬盘格式能更好兼容…

简单了解html常用的标签

HTML 一、基础认知 1、注释 1.1、注释的作用和写法 1.1.1、作用 为代码添加解释性,描述性的信息,主要用来帮助开发人员理解代码,浏览器执行代码时回忽略所有注释。 1.1.2、注释的快捷键 在VS Code中:Ctrl / 2、HTML标签的…

Android-系统开发_四大组件篇----探讨-Activity-的生命周期

当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。你可能会觉得既然活动已经不在栈顶了,还怎么会可见呢? 这是因为并不是每一个活动都会占满整个屏幕,比如对话框形式的活动只会占用屏幕中间的部分…

基于SpringBoot+Vue二手交易平台设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

《Windows API每日一练》5.4 键盘消息和字符集

本节我们将通过实例来说明不同国家的语言、字符集和字体之间的差异,以及Windows系统是如何处理的。 本节必须掌握的知识点: 第31练:显示键盘消息 非英语键盘问题 字符集和字体 第32练:显示默认字体信息 第33练:创建逻…