当前位置: 首页 > news >正文

考研复试6 编译原理

第一章 编译器简介

1. 编译器的核心功能

把源代码翻译成目标代码

2. 编译器设计两个原则:

语义相同;以某种可察觉的方式改进输入程序

3. 编译器内部结构

  1. 前端:依赖于源语言,与目标机器无关。将输入的代码映射到 IR。包括分析部分(词法、语法、语义分析)、中间代码生成与优化以及这部分的符号表管理错误处理。
  2. 后端:依赖于目标机器,与源语言无关;将 IR 映射到目标机的指令集和有限资源上,处理前端生成的 IR。包括目标代码生成、与目标机有关的优化以及这部分的符号表管理和错误处理工作。

4. 编译器的什么性质最重要:

  1. 编译的效率,即编译一个程序的速度和代价
  2. 编译生成代码的效率,即编译器生成的可执行程序的运行效率
  3. 编译生成代码的质量,即和源代码语义等价性

5. 编译程序的主要构成成分有

词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序、出错处理程序。

6. 编译程序与解释程序区别

前者生成目标代码,而后者不生成;前者产生的目标代码的执行速度比解释程序的执行速度要快;后者人机交互好,适于初学者使用。

7. 图灵机

  1. 一种抽象的计算模型,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人类进行数学运算。
  2. 它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。

第二章 文法

1. 文法:

语言结构的定义和描述,是有穷非空的产生式集合,由终结符、非终结符、产生式、开始符号四部分组成。

2. 终结符和非终结符

终结符:是文法所定义的语言的基本符号,可称为单词、token

非终结符:是用来表示语法成分的符号,称为语法变量

3. 0型文法、1型文法、2型文法、3型文法区别

0型文法 包含 1型文法 包含 2型文法 包含 3型文法

(1)0型文法:对于推导式 α→β,α属于非终结符和终结符并集的正闭包,且α至少含有一个非终结符,并且 β 属于非终结符和终结符的闭包。它可由图灵机识别。

(2)1型文法:上下文有关文法。它可由线性线界自动机识别。

  1. 左式可以有多个字符但是必须有一个非终结符;
  2. 右式可以有多个字符,可以是终结符或非终结符,但是必须是有限个字符;
  3. 左式长度必须不大于右式(除了右式为空)。

(3)2型文法:上下文无关文法。它可由下推自动机识别。2型文法(即上下文无关文法)是描述程序设计语言语法的形式化工具

  1. 左式只能有一个字符,而且必须是非终结符;
  2. 右式可以有多个字符,可以是终结符或非终结符,但是必须是有限个字符

(4)3型文法:正规文法,包括左线性文法和右线性文法。它可由有限自动机识别。3型文法是是描述程序设计语言词法的形式化工具

  1. 左式只能有一个字符且必须是非终结符
  2. 右式至多有两个字符,如果有两个字符则必须是一个终结符和一个非终结符;如果有一个字符则必须是终结符。
  3. 右式如果是终结符+非终结符,则为右线性文法;如果是非终结符+终结符,则为左线性文法。

4. 二义性文法

二义性文法:一个文法存在某个句子对应两棵不同的语法树。或者说一个文法存在某个句子有不同的最左(最右)推导。

二义性文法存在问题:同一个程序有不同的含义;程序运行的结果不是唯一的。

二义性文法解决方案:文法的重写

5. 最左推导

在推导的任何一步 α → β,都是对 α 中的最左非终结符进行替换。

第三章 词法分析

词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析。执行词法分析的程序称为词法分析程序或扫描程序。

词法分析器实现方法:手工编码实现法、根据正则表达式画DNF

正则表达式

  1. 正则表达式与正规文法等价:对任意一个正规文法,存在一个定义同一个语言的正则表达式;对每个正则表达式,存在一个生成同一个语言的正规文法;两者可相互转化。
  2. 正规式和有限自动机之间可以相互转换,它们之间存在着等价性。

状态自动机:

(1)DNF

  1. 有限状态自动机:字母表,状态集、初始状态、终结状态集、转移函数
  2. 非确定的有限状态自动机(NFA):状态转移函数是不确定的,即对于任意字符有多于一个状态可以转移
  3. 确定的有限状态自动机(DFA):每次接受字符走到的状态是确定的,即对于任意字符最多有一个状态可以转移
  4. NFA和DFA在表达力上是等价的;任何DFA是某个NFA的一个特例,任何NFA可以通过一个DFA模拟

(2)RE转化为NFA:Thompson算法;

(3)NFA转为DFA:子集构造算法;

(4)DFA转化为词法分析器代码:Hopcroft最小化算法;

第四章 语法分析

需要掌握的:LL(1),LR(0),SLR,LR(1),LALR

1. 语法分析

  1. 概念:在词法分析的基础上将单词序列分解成各类语法短语,如“程序”、“语句”、“表达式”等。这种语法短语也成为语法单位,可以表示成语法树。
  2. 步骤:
    1. 对程序设计语言的语法规则进行形式化描述(用2型文法)
    2. 根据语言的语法描述形式,定义各种基本语法结构的抽象语法树
    3. 选择一种合适的语法分析算法,并在分析程序中插入动作

2. 自顶向下和自底向上:

(1)自顶向下的分析方法(LL)

  1. 概念:也称面向目标的分析方法,也就是从文法的开始符号出发企图推导出与输入的单词符号相匹配的句子,若输入串是给定文法的句子,则必能推出,反之必然出错。

(2)自底向上的分析算法(LR)

  1. 从输入串开始,逐步进行“归约”,直至归约到文法的 开始符号;或者说从语法树的末端开始,步步向上“归约”,直到根节点。
  2. 应用面广:能够通过LR分析程序识别所有采用上下文无关文法描述的程序设计语言的语法结构
  3. 能有效实现:是无回溯的移进—归约方法
  4. 容易查错:LR分析器能够及时发现语法错误和准确指出错误位置

3. 分析树

推导可以表达成树状结构,和推导所用的顺序无关(最左、最右、其他),树中的每个内部节点代表非终结符,每个叶子节点代表终结符,每一步推导代表如何从双亲节点生成它的孩子节点

4. 递归下降分析

递归下降分析方法是一种自上而下的语法分析方法,该方法执行一组递归函数判断输入的单词序列是否符合语法规则。为每个非终结符构造一个分析函数, 用前看符号指导产生式规则的选择

5. 各种语法分析算法:

(1)LL(1) 分析算法

  1. 其中的第一个 L 代表从左向右扫描输入,第二个 L 表示产生最左推导,1 代表在决定分析器的每步动作时向前看一个输入符号。
  2. LL(1)分析算法优点:算法运行高效,有现成的工具可用;缺点: 能分析的文法类型受限, 往往需要文法的改写

(2)LR(0) 分析算法

  1. 从左至右扫描和自底向上的语法分析,且在分析的每一步,只须根据分析栈当前已移进和归约出的全部文法符号,并至多再向前查看 0 个输入符号
  2. L是指自左(Left)向右分析输入单词序列;R是指分析过程都是构造最右(Right)推导的逆过程(规范归约);括号中的 0 是指在决定当前分析动作时向右看的单词个数。
  3. LR(0) 分析算法优点:容易实现;缺点:能分析的文法有限,LR(0) 分析表可能包含冲突。

(3)SLR 分析算法

  1. 与 LR(0) 分析算法基本步骤相同,仅区别于对规约的处理。
  2. 优点:有可能减少需要规约的情况;有可能去除需要移进-规约冲突。
  3. 缺点:仍然有冲突出现的可能。

(4)LR(1)

  1. 缺点:同心集的分裂使状态数目剧烈增长,导致存储容量的急剧增加。
  2. 同心集:如果除前看符号外,两个LR(1)项目集是相同的,则称这两个项目集是同心的。

(5)LALR(1) 文法

  1. LALR: lookahead-LR
  2. 对 LR(1) 的同心集进行合并
  3. 分析能力介于SLR和LR(1)二者之间:SLR < LALR(1) < LR(1)

6. 二义性文法在LR分析中的应用

  1. 任何一个二义性文法不是LR类文法,也不是LL(k)文法
  2. 任何一个二义性文法不存在与其相应的确定的语法分析器
  3. 但对某些二义性文法,可以人为给出优先级和结合性的规定,构造出比相应的非二义性文法更优越的LR分析器

第五章 语义分析

1. 语法制导翻译

  1. 基于属性文法的处理过程,对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算。
  2. 属性文法:是在短语结构文法的基础上加入每个短语和整个句子语义信息所构成的文法
  3. 综合属性:用于“自下而上”传递信息。在语法树中,一个结点的综合属性的值,由其子结点的属性值确定。只包含综合属性的属性文法称为S-属性文法。
  4. 继承属性:用于“自上而下”传递信息。 在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的。既包含综合属性又包含继承属性的是L-属性文法。

2. 语义分析的概念

审查源程序有无语义错误,为代码生成阶段收集类型信息。其任务是检查程序结构(控制结构和数据结构)的一致性或完整性。比如控制流检查,唯一性检查,名字的上下文相关性检查,类型检查等。

第六章 中间表示

1. 中间表示的概念

进行了语法分析和语义分析阶段的工作后,将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。

2. 中间表示的结构:

图IR:语法分析树、抽象语法树、有向无环图、控制流图、依赖关系图、调用图

线性IR:堆栈机代码、三地址代码

第七章 代码优化

1. 代码优化概念

对被优化的程序进行的一种语义保持的变换,语义保持就是程序的可观察行为不能改变

2. 代码优化的目的和意义

代码优化是尽量生成“好”的代码的编译阶段。也就是要对程序代码进行 一种等价变换,在保证变换前后代码执行结果相同的前提下,尽量使目 标程序运行时所需要的时间短,同时所占用的存储空间少。

3. 分类:前端优化、中间表示上的优化、窥孔优化、局部优化、循环优化、全局优化

第八章 目标代码生成

1. 目标代码生成概念

把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。其任务是给源程序的数据分配计算资源、给源程序的代码选择指令。

相关文章:

考研复试6 编译原理

第一章 编译器简介 1. 编译器的核心功能 把源代码翻译成目标代码 2. 编译器设计两个原则&#xff1a; 语义相同&#xff1b;以某种可察觉的方式改进输入程序 3. 编译器内部结构 前端&#xff1a;依赖于源语言&#xff0c;与目标机器无关。将输入的代码映射到 IR。包括分析部…...

uni-app:登录与支付--用户信息

用户信息 实现用户头像昵称区域的基本布局 在 my-userinfo 组件中&#xff0c;定义如下的 UI 结构&#xff1a; <template><view class"my-userinfo-container"><!-- 头像昵称区域 --><view class"top-box"><image src"…...

Docker 部署 MySQL

1. 进入下面路径下 -v 使用相对路径的方式挂载的目录docker会自动创建&#xff0c;路径为&#xff1a;/var/lib/docker/volumes/ cd /var/lib/docker/volumes/ 2. 指定版本5.7启动容器mysql docker run -p 3316:3306 --name mysql-master \ -v mysql-master-log:/var/log/mys…...

警惕,3月20日WOS目录更新,50本SCI/SSCI被剔除,这个出版社多达18本

2023年3月SCI、SSCI期刊目录更新 2023年3月20日&#xff0c;Web of Science核心期刊目录再次更新&#xff01;此次2023年3月SCIE & SSCI期刊目录更新&#xff0c;与上次更新&#xff08;2023年2月&#xff09;相比&#xff0c;共有50本期刊被剔除出SCIE & SSCI期刊目录…...

【 Linux入门 】之 手搓 命令行解释器 bash(带源码)

目的基本结构提取输入命令fgets的使用命令初步处理命令的本质创建子进程重要知识补充进程替换命令处理简单 bash 完成及演示优化bashls颜色输出颜色实现cd命令ecport 命令envecho $echo $&#xff1f;目的 主要目的在于进一步了解 Linux 系统下使用进程相关的系统调用 及 shel…...

【运维】运维常用命令

shell大全读取文件每一行内容文件是否存在数组定义和循环取值变量循环流程控制语句&#xff1a;case判断数值相等/大于/小于判断字符串相等awk求和、平均、最大、最小sed用法exprbc计算器读取文件每一行内容 while read line doecho $line done < a.txt文件是否存在 if [ …...

MYSQL常用命令大全

文章目录 基本语句链接数据库显示已有数据库创建数据库选择数据库显示数据库中的表显示当前数据库的版本信息,链接用户名删除数据库创建表表 增加将查询结果插入到新表中:表 删除表 修改表 查询in子查询between ~ and ~ 模糊查询模糊查询regexp中的OR:多个信息查询同义词:删…...

锚点定位方案

一 背景知识: 1.1 #号的作用 #代表网页中的一个位置。其右面的字符&#xff0c;就是该位置的标识符。比如&#xff0c;http://www.example.com/index.html#print 就代表网页index.html的print位置。浏览器读取这个URL后&#xff0c;会自动将print位置滚动至可视区域。 为网页…...

Flink学习--第一章 初识Flink

Flink是Apache基金会旗下的一个开源大数据处理框架&#xff0c;如今已被很多人认为是大数据实时处理的方向和未来&#xff0c;许多公司也都在招聘和储备掌握Flink技术的人才。 1.1 Flink的源起和设计理念 Flink起源于一个叫作Stratosphere的项目&#xff0c;它是由3所地处柏林的…...

电脑技巧:常见的浏览器内核介绍

浏览器是大家日常使用电脑必备的软件&#xff0c;网上查资料、听音乐、办公等等&#xff0c;都不离不开浏览器给我们提供的方便&#xff0c;今天小编来给大家介绍一下常见的浏览器内核&#xff0c;一起来学习一下吧&#xff01;1、Chromium 内核Google Chrom内核&#xff1a;统…...

【数据分析之道①】字符串

文章目录专栏导读1、字符串介绍2、访问字符串中的值3、字符串拼接4、转义字符5、字符串运算符6、字符串格式化7、字符串内置函数专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&#xff0c;专注于分享python领域知识。 ✍ 本文录入于《数据分析之…...

网络安全之防火墙

目录 网络安全之防火墙 路由交换终归结底是联通新设备 防御对象&#xff1a; 定义&#xff1a; 防火墙的区域划分&#xff1a; 包过滤防火墙 --- 访问控制列表技术 --- 三层技术 代理防火墙 --- 中间人技术 --- 应用层 状态防火墙 --- 会话追踪技术 --- 三层、四层 UTM …...

STM32之点亮一个LED小灯(轮询法)

目录 一、初始化GPIO口 二、按键点亮LED灯&#xff08;轮询法&#xff09; 一、初始化GPIO口 1、点亮LED小灯前&#xff0c;需要先初始化GPIO口 HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) GPIO_TypeDef *GPIOx&#xff1a; //指初始化GPIO…...

pandas读CSV、读JSON、Excel

学习让我快乐 pandas的数据读取基本操作 pandas是Python中非常流行的数据处理库&#xff0c;它提供了许多强大的工具来读取、处理和分析数据。在本文中&#xff0c;我们将介绍pandas中的一些基本数据读取操作。 读取CSV文件 CSV文件是最常见的数据文件格式之一&#xff0c;p…...

企业站项目

企业站项目 一、项目实现结果 该项目共分为七大类&#xff1a;头部区域&#xff08;logo图片、输入框&#xff09;、导航区域、轮播图区域、内容区域、市场项目区域、产品中心区域、尾部区域 如图所示&#xff1a; http://企业站项目源码http://xn--vhquvo17e18gllbz7h2v9d …...

STM32开发(九)STM32F103 通信 —— I2C通信编程详解

文章目录一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解GPIO模拟I2C代码SHT30相关代码main函数中循环代码五、结果演示方式一、示波器分析I2C数据方式2、通过Modbus将获取到的数据传到PC上一、基础知识点 本实验通过I2C通信获取SHT30温湿度值&#xff…...

手撕数据结构—栈

Tips不得不再次提一下这个语法问题&#xff0c;当数组创建的时候&#xff0c;进行初始化的时候&#xff0c;分为全部初始化或者说部分初始化&#xff0c;对于不完全初始化而言&#xff0c;剩下的部分就全部默认为零。现在比如说你想对整型数组的1万个元素把它全部变成-1&#x…...

【java刷题】排序子序列

这里写目录标题问题描述解决思路实现代码问题描述 牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序…...

Springboot怎么快速集成Mybatis和thymeleaf?

前言有时候做方案&#xff0c;需要模拟一些业务上的一些场景来验证方案的可行性&#xff0c;基本上每次都是到处百度如何集成springbootmybatisthymeleaf这些东西的集成平时基本上一年也用不了一次&#xff0c;虽然比较简单&#xff0c;奈何我真得记不住详细的每一步&#xff0…...

shell常见面试题一

&#xff08;1&#xff09;、set //查看系统变量 &#xff08;2&#xff09;、chsh -s /bin/zsh test //修改用户登录shell &#xff08;3&#xff09;、2>&1 //标准错误重定向到标准输出 &> //同样可以将标准错误重定向到标准输出 如下&#xff1a; ls test.…...

python如何快速采集美~女视频?无反爬

人生苦短 我用python~ 这次康康能给大家整点好看的不~ 环境使用: Python 3.8 Pycharm mou歌浏览器 mou歌驱动 —> 驱动版本要和浏览器版本最相近 <大版本一样, 小版本最相近> 模块使用: requests >>> pip install requests selenium >>> pip …...

kali内置超好用的代理工具proxychains

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。所以可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。…...

Java栈和队列·下

Java栈和队列下2. 队列(Queue)2.1 概念2.2 实现2.3 相似方法的区别2.4 循环队列3. 双端队列 (Deque)3.1 概念4.java中的栈和队列5. 栈和队列面试题大家好&#xff0c;我是晓星航。今天为大家带来的是 Java栈和队列下 的讲解&#xff01;&#x1f600; 继上一个讲完的栈后&…...

b01lers CTF web 复现

warmup 按照提示依次 base64 加密后访问&#xff0c;可以访问 ./flag.txt&#xff0c;也就是 Li9mbGFnLnR4dA 。 from base64 import b64decode import flaskapp flask.Flask(__name__)app.route(/<name>) def index2(name):name b64decode(name)if (validate(name))…...

三月份跳槽了,历经字节测开岗4轮面试,不出意外,被刷了...

大多数情况下&#xff0c;测试员的个人技能成长速度&#xff0c;远远大于公司规模或业务的成长速度。所以&#xff0c;跳槽成为了这个行业里最常见的一个词汇。 前几天&#xff0c;我看到有朋友留言说&#xff0c;他在面试字节的测试开发工程师的时候&#xff0c;灵魂拷问三小…...

springboot+vue驾校管理系统 idea科目一四预约考试,练车

加大了对从事道路运输经营活动驾驶员的培训管理力度&#xff0c;但在实际的管理过程中&#xff0c;仍然存在以下问题&#xff1a;(1)管理部门内部人员在实际管理过程中存在人情管理&#xff0c;不进行培训、考试直接进行发证。(2)从业驾驶员培训机构不能严格执行管理部门的大纲…...

【pytorch】使用deepsort算法进行目标跟踪,原理+pytorch实现

目录deepsort流程一、匈牙利算法二、卡尔曼滤波车速预测例子动态模型的概念卡尔曼滤波在deepsort中的动态模型三、预测值及测量值的含义deepsort在pytorch中的运行deepsort流程 DeepSORT是一种常用的目标跟踪算法&#xff0c;它结合了深度学习和传统的目标跟踪方法。DeepSORT的…...

Python 基础教程【3】:字符串、列表、元组

本文已收录于专栏&#x1f33b;《Python 基础》文章目录&#x1f315;1、字符串&#x1f95d;1.1 字符串基本操作&#x1f34a;1.1.1 字符串创建&#x1f34a;1.1.2 字符串元素读取&#x1f34a;1.1.3 字符串分片&#x1f34a;1.1.4 连接和重复&#x1f34a;1.1.5 关系运算&…...

(数据结构)八大排序算法

目录一、常见排序算法二、实现1. 直接插入排序2.&#x1f31f;希尔排序3. 选择排序4.&#x1f31f;堆排序5. 冒泡排序7. &#x1f31f;快速排序7.1 其他版本的快排7.2 优化7.3 ⭐非递归7. &#x1f31f;归并排序7.1 ⭐非递归8. 计数排序三、总结1. 分析排序 (Sorting) 是计算机…...

构建GRE隧道打通不同云商的云主机内网

文章目录1. 环境介绍2 GRE隧道搭建2.1 华为云 GRE 隧道安装2.2 阿里云 GRE 隧道安装3. 设置安全组4. 验证GRE隧道4.1 在华为云上 ping 阿里云云主机内网IP4.2 在阿里云上 ping 华为云云主机内网IP5. 总结1. 环境介绍 华为云上有三台云主机&#xff0c;内网 CIDR 是 192.168.0.0…...