编译原理期末复习

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…

【linux】centos yum 换源

一、问题描述 CentOS 7 更换yum源后,无法正常使用,报错信息如下: [roothost-10-43-1-3 ~]# yum install tmux Loaded plugins: fastestmirror, langpacks Repository base is listed more than once in the configuration Repository updat…

代码随想录算法训练营day23|669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669.修剪二叉搜索树 这道题目需要考虑当前节点是否在[low,high]之间, 因为是平衡二叉树, 所以当当前节点值小于low时,那么其左节点肯定更小,因此删除该节点的方式是给root节点返回其右节点的递归,注意:这里…

爬虫笔记13——网页爬取数据写入MySQL数据库,以阿里recruit为例

下载pymysql库 需要下载pymysql库,以便于在程序中连接MySQL数据库 pip install pymysql # 或者使用国内的镜像文件,安装会快一点 pip install pymysql -i https://pypi.douban.com/simple需要安装MySQL,并创建使用数据库 安装MySQL可以看这…

【ajax基础】回调函数地狱

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

【流星蝴蝶剑game】

由于《流星蝴蝶剑》是一款较旧的游戏,而且我无法提供受版权保护的游戏的代码,我将提供一个简单的2D游戏编程实例,以展示如何使用Unity引擎和C#语言来创建一个基本的游戏。这个例子将涉及到创建一个玩家角色,使其能够移动并收集物品…

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》 本节课实现音乐任务的创建,音乐播放的暂停与继续播放,删…

nf_tables

nf_tables nf_tables 是 Linux 内核中的一个组件,属于 netfilter 子系统的一部分。它的作用类似于 iptables,都是用于配置和执行网络相关的规则,实现防火墙的功能。以下是 nf_tables 的一些主要作用和特点: 规则集管理&#xff1…

算法竞赛创新实践总结

目录 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 复…

如何使得 `git pull origin master`不出现`Merge branch master for `这样的字样?

文章目录 引言使用 git pull --rebase配置 Git 默认使用 rebase 引言 当你执行 git pull origin master 时,Git 默认会执行 git fetch 紧接着 git merge,这可能会导致产生 “Merge branch ‘master’ of…” 样式的提交信息,尤其是在有冲突需…

【python】webdriver报错 is not clickable at point

这个报错一般是使用click()时,点击失败。 一般情况下,还会伴随报错: Other element would receive the click: 这种情况下,一般是页面加载后,需要点击的元素之前有其他元素,其他元素收到了点击动作&…

一文读懂Java多线程优点与代价

多线程的优点 多线程能给程序带来比较多的好处,粗略概括如下几点: 提高资源利用率提高程序响应性能简化程序设计提高资源利用率比较好理解,现代服务器都是多核CPU,单线程并不能充分发挥多核CPU的优势,要提高资源利用率,自然是充分利用CPU,那多线程就是最好的方式。一个…

手撕RPC——前言

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