考研复试6 编译原理
第一章 编译器简介
- 前端:依赖于源语言,与目标机器无关。将输入的代码映射到 IR。包括分析部分(词法、语法、语义分析)、中间代码生成与优化以及这部分的符号表管理错误处理。
- 后端:依赖于目标机器,与源语言无关;将 IR 映射到目标机的指令集和有限资源上,处理前端生成的 IR。包括目标代码生成、与目标机有关的优化以及这部分的符号表管理和错误处理工作。
- 编译的效率,即编译一个程序的速度和代价
- 编译生成代码的效率,即编译器生成的可执行程序的运行效率
- 编译生成代码的质量,即和源代码语义等价性
词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序、出错处理程序。
前者生成目标代码,而后者不生成;前者产生的目标代码的执行速度比解释程序的执行速度要快;后者人机交互好,适于初学者使用。
- 一种抽象的计算模型,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人类进行数学运算。
- 它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。
第二章 文法
语言结构的定义和描述,是有穷非空的产生式集合,由终结符、非终结符、产生式、开始符号四部分组成。
终结符:是文法所定义的语言的基本符号,可称为单词、token
(1)0型文法:对于推导式 α→β,α属于非终结符和终结符并集的正闭包,且α至少含有一个非终结符,并且 β 属于非终结符和终结符的闭包。它可由图灵机识别。
- 左式可以有多个字符但是必须有一个非终结符;
- 右式可以有多个字符,可以是终结符或非终结符,但是必须是有限个字符;
- 左式长度必须不大于右式(除了右式为空)。
(3)2型文法:上下文无关文法。它可由下推自动机识别。2型文法(即上下文无关文法)是描述程序设计语言语法的形式化工具
- 左式只能有一个字符,而且必须是非终结符;
- 右式可以有多个字符,可以是终结符或非终结符,但是必须是有限个字符
(4)3型文法:正规文法,包括左线性文法和右线性文法。它可由有限自动机识别。3型文法是是描述程序设计语言词法的形式化工具
- 左式只能有一个字符且必须是非终结符
- 右式至多有两个字符,如果有两个字符则必须是一个终结符和一个非终结符;如果有一个字符则必须是终结符。
- 右式如果是终结符+非终结符,则为右线性文法;如果是非终结符+终结符,则为左线性文法。
二义性文法:一个文法存在某个句子对应两棵不同的语法树。或者说一个文法存在某个句子有不同的最左(最右)推导。
二义性文法存在问题:同一个程序有不同的含义;程序运行的结果不是唯一的。
在推导的任何一步 α → β,都是对 α 中的最左非终结符进行替换。
第三章 词法分析
词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析。执行词法分析的程序称为词法分析程序或扫描程序。
- 正则表达式与正规文法等价:对任意一个正规文法,存在一个定义同一个语言的正则表达式;对每个正则表达式,存在一个生成同一个语言的正规文法;两者可相互转化。
- 正规式和有限自动机之间可以相互转换,它们之间存在着等价性。
- 有限状态自动机:字母表,状态集、初始状态、终结状态集、转移函数
- 非确定的有限状态自动机(NFA):状态转移函数是不确定的,即对于任意字符有多于一个状态可以转移
- 确定的有限状态自动机(DFA):每次接受字符走到的状态是确定的,即对于任意字符最多有一个状态可以转移
- NFA和DFA在表达力上是等价的;任何DFA是某个NFA的一个特例,任何NFA可以通过一个DFA模拟
(4)DFA转化为词法分析器代码:Hopcroft最小化算法;
第四章 语法分析
需要掌握的:LL(1),LR(0),SLR,LR(1),LALR
- 概念:在词法分析的基础上将单词序列分解成各类语法短语,如“程序”、“语句”、“表达式”等。这种语法短语也成为语法单位,可以表示成语法树。
- 步骤:
- 根据语言的语法描述形式,定义各种基本语法结构的抽象语法树
- 选择一种合适的语法分析算法,并在分析程序中插入动作
- 从输入串开始,逐步进行“归约”,直至归约到文法的 开始符号;或者说从语法树的末端开始,步步向上“归约”,直到根节点。
- 应用面广:能够通过LR分析程序识别所有采用上下文无关文法描述的程序设计语言的语法结构
- 能有效实现:是无回溯的移进—归约方法
- 容易查错:LR分析器能够及时发现语法错误和准确指出错误位置
推导可以表达成树状结构,和推导所用的顺序无关(最左、最右、其他),树中的每个内部节点代表非终结符,每个叶子节点代表终结符,每一步推导代表如何从双亲节点生成它的孩子节点
递归下降分析方法是一种自上而下的语法分析方法,该方法执行一组递归函数判断输入的单词序列是否符合语法规则。为每个非终结符构造一个分析函数, 用前看符号指导产生式规则的选择
- 其中的第一个 L 代表从左向右扫描输入,第二个 L 表示产生最左推导,1 代表在决定分析器的每步动作时向前看一个输入符号。
- LL(1)分析算法优点:算法运行高效,有现成的工具可用;缺点: 能分析的文法类型受限, 往往需要文法的改写
- 从左至右扫描和自底向上的语法分析,且在分析的每一步,只须根据分析栈当前已移进和归约出的全部文法符号,并至多再向前查看 0 个输入符号
- L是指自左(Left)向右分析输入单词序列;R是指分析过程都是构造最右(Right)推导的逆过程(规范归约);括号中的 0 是指在决定当前分析动作时向右看的单词个数。
- LR(0) 分析算法优点:容易实现;缺点:能分析的文法有限,LR(0) 分析表可能包含冲突。
- 与 LR(0) 分析算法基本步骤相同,仅区别于对规约的处理。
- 优点:有可能减少需要规约的情况;有可能去除需要移进-规约冲突。
- 缺点:仍然有冲突出现的可能。
- 缺点:同心集的分裂使状态数目剧烈增长,导致存储容量的急剧增加。
- 同心集:如果除前看符号外,两个LR(1)项目集是相同的,则称这两个项目集是同心的。
- LALR: lookahead-LR
- 对 LR(1) 的同心集进行合并
- 分析能力介于SLR和LR(1)二者之间:SLR < LALR(1) < LR(1)
- 任何一个二义性文法不是LR类文法,也不是LL(k)文法
- 任何一个二义性文法不存在与其相应的确定的语法分析器
- 但对某些二义性文法,可以人为给出优先级和结合性的规定,构造出比相应的非二义性文法更优越的LR分析器
第五章 语义分析
- 基于属性文法的处理过程,对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算。
- 属性文法:是在短语结构文法的基础上加入每个短语和整个句子语义信息所构成的文法
- 综合属性:用于“自下而上”传递信息。在语法树中,一个结点的综合属性的值,由其子结点的属性值确定。只包含综合属性的属性文法称为S-属性文法。
- 继承属性:用于“自上而下”传递信息。 在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的。既包含综合属性又包含继承属性的是L-属性文法。
审查源程序有无语义错误,为代码生成阶段收集类型信息。其任务是检查程序结构(控制结构和数据结构)的一致性或完整性。比如控制流检查,唯一性检查,名字的上下文相关性检查,类型检查等。
第六章 中间表示
进行了语法分析和语义分析阶段的工作后,将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。
图IR:语法分析树、抽象语法树、有向无环图、控制流图、依赖关系图、调用图
第七章 代码优化
对被优化的程序进行的一种语义保持的变换,语义保持就是程序的可观察行为不能改变
代码优化是尽量生成“好”的代码的编译阶段。也就是要对程序代码进行 一种等价变换,在保证变换前后代码执行结果相同的前提下,尽量使目 标程序运行时所需要的时间短,同时所占用的存储空间少。
3. 分类:前端优化、中间表示上的优化、窥孔优化、局部优化、循环优化、全局优化
第八章 目标代码生成
把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。其任务是给源程序的数据分配计算资源、给源程序的代码选择指令。
相关文章:
考研复试6 编译原理
第一章 编译器简介 1. 编译器的核心功能 把源代码翻译成目标代码 2. 编译器设计两个原则: 语义相同;以某种可察觉的方式改进输入程序 3. 编译器内部结构 前端:依赖于源语言,与目标机器无关。将输入的代码映射到 IR。包括分析部…...

uni-app:登录与支付--用户信息
用户信息 实现用户头像昵称区域的基本布局 在 my-userinfo 组件中,定义如下的 UI 结构: <template><view class"my-userinfo-container"><!-- 头像昵称区域 --><view class"top-box"><image src"…...

Docker 部署 MySQL
1. 进入下面路径下 -v 使用相对路径的方式挂载的目录docker会自动创建,路径为:/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日,Web of Science核心期刊目录再次更新!此次2023年3月SCIE & SSCI期刊目录更新,与上次更新(2023年2月)相比,共有50本期刊被剔除出SCIE & SSCI期刊目录…...

【 Linux入门 】之 手搓 命令行解释器 bash(带源码)
目的基本结构提取输入命令fgets的使用命令初步处理命令的本质创建子进程重要知识补充进程替换命令处理简单 bash 完成及演示优化bashls颜色输出颜色实现cd命令ecport 命令envecho $echo $?目的 主要目的在于进一步了解 Linux 系统下使用进程相关的系统调用 及 shel…...
【运维】运维常用命令
shell大全读取文件每一行内容文件是否存在数组定义和循环取值变量循环流程控制语句:case判断数值相等/大于/小于判断字符串相等awk求和、平均、最大、最小sed用法exprbc计算器读取文件每一行内容 while read line doecho $line done < a.txt文件是否存在 if [ …...
MYSQL常用命令大全
文章目录 基本语句链接数据库显示已有数据库创建数据库选择数据库显示数据库中的表显示当前数据库的版本信息,链接用户名删除数据库创建表表 增加将查询结果插入到新表中:表 删除表 修改表 查询in子查询between ~ and ~ 模糊查询模糊查询regexp中的OR:多个信息查询同义词:删…...
锚点定位方案
一 背景知识: 1.1 #号的作用 #代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如,http://www.example.com/index.html#print 就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。 为网页…...

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

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

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

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

STM32之点亮一个LED小灯(轮询法)
目录 一、初始化GPIO口 二、按键点亮LED灯(轮询法) 一、初始化GPIO口 1、点亮LED小灯前,需要先初始化GPIO口 HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) GPIO_TypeDef *GPIOx: //指初始化GPIO…...

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

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

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

手撕数据结构—栈
Tips不得不再次提一下这个语法问题,当数组创建的时候,进行初始化的时候,分为全部初始化或者说部分初始化,对于不完全初始化而言,剩下的部分就全部默认为零。现在比如说你想对整型数组的1万个元素把它全部变成-1&#x…...
【java刷题】排序子序列
这里写目录标题问题描述解决思路实现代码问题描述 牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序…...

Springboot怎么快速集成Mybatis和thymeleaf?
前言有时候做方案,需要模拟一些业务上的一些场景来验证方案的可行性,基本上每次都是到处百度如何集成springbootmybatisthymeleaf这些东西的集成平时基本上一年也用不了一次,虽然比较简单,奈何我真得记不住详细的每一步࿰…...
shell常见面试题一
(1)、set //查看系统变量 (2)、chsh -s /bin/zsh test //修改用户登录shell (3)、2>&1 //标准错误重定向到标准输出 &> //同样可以将标准错误重定向到标准输出 如下: ls test.…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...