编译原理面试知识点概览

编译原理

一个编译器的结构

在这里插入图片描述

词法分析

读入组成源程序的字符流,输出词法单元

1)有穷自动机

​ 确定的FA–DFA ;非确定的FA–NFA

语法分析

在词法分析的基础上将单词序列组合成各类语法短语,使用各个词法单元的第一个分量来创建树形的中间表示

依据的是语言的语法规则,通过语法分析确定整个输入串是否构成一个语法上正确的程序

自顶向下分析–LL1文法

1)LL1文法:对每个非终结符A的两个不同产生式A→α与A→β,满足SELECT(A→α)∩SELECT(A→β)=Φ

L即从左往右处理输入,第二个L则是为输入生成一个最左推导,1是向前展望一个符号

2)分析方法

  • 递归的预测分析法:在递归下降分析中,根据预测分析表进行产生式的选择

  • 非递归的预测分析法:根据预测分析表构造一个自动机,也叫表驱动的预测分析
    在这里插入图片描述在这里插入图片描述
    3)步骤

  • 构造文法

  • 改造文法:消除二义性、消除左递归、消除回溯

  • 求每个变量的FIRST集和FOLLOW集,从而求得每个候选式的SELECT集

  • 检查是不是 LL(1) 文法。若是,构造预测分析表

  • 对于递归的预测分析,根据预测分析表为每一个非终结符编写一个过程;对于非递归的预测分析,实现表驱动的预测分析算

自底向上分析–LR分析法

1)总体结构
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210330130738735.png ?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N5ZG5leV9f,size_16,color_FFFFFF,t_70#pic_center)

分析表结构
在这里插入图片描述

2)LR文法:如果某一文法能够构造一张分析表,使得表中每一个元素至多只有一种明确动作,则该文法称为LR文法,即要求每一步都有明确的动作,移进和归约都是可确定的

  • LR0:找出句柄前缀,构造分析表,然后根据输入符号进行规约,可能出现归约-移进,归约-归约冲突

  • SLR:使用LR(0)时若有归约-归约冲突,归约-移进冲突,所以需要看先行,则只把有问题的地方向前搜索一次,解决归约-归约冲突,但是不一定能解决移进-归约冲突

  • LR1:只有当合并同心集产生了归约-归约冲突时才只属于LR(1)文法,LALR则是没产生冲突

4)LALR: 构造的是 LR(1)自动机,与 LR(0)自动机的不同是多了向前搜索符,如果两个产生集相同就将他们合并为一个,即需要合并同心集,即合并产生式相同但是向前搜索符不同的项集族

LR(0) 和 SLR文法分析用的是 LR(0)自动机,LR(1)和 LALR文法分析用的是 LR(1)自动机。而LR(1)自动机构造方法和LR(0)自动机的构造方法相同,只是多增加了向前搜索符号。

语义分析

使用语法树和符号表中的信息来检查源程序中是否和语言定义中的语义一致,并且收集类型信息,把信息存放在语法树或符号表中

语义翻译:语义分析&中间代码生成

语法制导定义SDD

1)将每个文法符号和一个语义属性集合相关联;将每个产生式和一组语义规则相关联,这些规则用于计算该产生式中各文法符号的属性值

2)文法符号的属性

  • 综合属性:通过 N的子结点或 N本身的属性值来定义
  • 继承属性:通过N的父结点、N的兄弟结点或 N本身的属性值来定义

3)分类

  • S-属性定义:仅仅使用综合属性的SDD
  • L-属性定义:它的每个属性要么是一个综合属性,要么是满足如下条件的继承属性
语法制导翻译方案

1)SDT是在产生式右部嵌入了程序片段的CFG,是SDD的具体实施方案,显式地 指明了语义规则的计算顺序,以便说明某些实现细节

2)将S-SDD转换为SDT(LR分析技术)

​ 将一个S-SDD转换为SDT的方法:将每个语义动作都放在产生式的最后

3)将L-SDD转换为SDT(LL分析技术)

​ 计算某个非终结符号A的继承属性的动作插入到产生式右部中紧靠在A的本次出 现之前的位置上

​ 将计算一个产生式左部符号的综合属性的动作放置在这个产生式右部的最右端

中间代码生成

有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码

如“三地址指令”的“四元式”

机器无关代码优化

1)类型

  • 识别公共子表达式
  • 识别无用代码
  • 常量合并
  • 代码移动
  • 强度削弱

2)方法

  • 基本块优化
    • 将基本块表示为DAG形式
    • 从DAG上删除所有没有附加活跃变量的根节点
    • 再从DAG到基本块的重组
  • 数据流分析
    • 到达定值分析
    • 计算各基本块的gen和kill,即生成的定值集合和杀死的定值集合
    • 用迭代算法计算每个块的入口处定值合集和出口处的定值合集
  • 活跃变量分析
    • 求各个基本块的使用变量合集和定义变量合集
    • 输出各个基本块的入口出活跃变量合集和出口处活跃变量合集
  • 可用表达式分析

3)流分析

  • 控制流CFG
    • 分析的目的是根据程序中的跳转语句构造一个表达程序结构的控制流图
  • 数据流
    • 程序每个“点”(这些点在每条语句之间)上的变量的值的集合
代码生成

把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码

机器相关代码优化
  • 使用寄存器变量
  • 循环展开
  • 多个累计变量
  • 重新结合变换

概念

文法和语言

1)文法即一种语言规则,G = (VT , VN , P , S )

➢VT:终结符集合

➢VN:非终结符集合

➢P :产生式集合

➢S :开始符号

2)判断方法:推导和归约

3)语言

  • 由文法G的开始符号S推导出的所有句子构成的集合称为文法G生成的语言,记为L(G )。

4)文法的分类

➢0型文法:无限制文法

➢1型文法 :上下文无关文法

➢2型文法 :

➢3型文法:正则文法

5)二义性

如果一个文法可以为某个句子生成多棵分析树,则称这个文法是二义性的

面试问题

设计编译器,并优化
大数据编译器的优化

分布式编译

设计算法减少代码编译过程能耗
  • 删除未使用的代码和依赖项
  • 避免使用全局变量
  • 通过收集profile信息来估算某些代码执行的频繁程度,将高概率执行的代码就都放在一起
  • 分支预测

文法可以为某个句子生成多棵分析树,则称这个文法是二义性的

面试问题

设计编译器,并优化
大数据编译器的优化

分布式编译

设计算法减少代码编译过程能耗
  • 删除未使用的代码和依赖项
  • 避免使用全局变量
  • 通过收集profile信息来估算某些代码执行的频繁程度,将高概率执行的代码就都放在一起
  • 分支预测
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值