离散数学

四色定理的内容?解决方法?
四色定理又称四色猜想、四色问题,是世界三大数学猜想之一。四色定理是一个著名数学定理,通俗称:每个平面地图都可以只用四种颜色来染色,而且没有两个邻接区域颜色相同。/在平面内任意分割区块,只用四种颜色就能保证所有相邻的区块不同色。
1976 年借助电子计算机证明了四色问题,问题也终于成为定理,这是第一个借助计算 机证明的定理。四色定理的本质就是在平面或者球面无法构造五个或者五个以上两两相连 的区域。

离散里面的图怎么去掉环

如果月亮是方的,那 2+2=4 正确吗
正确,因为前提与结论不相关

离散中闭包原理

  • 离散数学中,一个关系R的闭包是指加上最小数目的有序偶而形成的具有自反性、对称性或传递性的新的有序偶集,此集就是关系R的闭包。
    关系的闭包运算时关系上的一元运算,它把给出的关系R扩充成一新关系R’,使R’具有一定的性质,且所进行的扩充又是最“节约”的。
    比如自反闭包,相当于把关系R对角线上的元素全改成1,其他元素不变,这样得到的R’是自反的,且是改动次数最少的,即是最“节约”的。
  • JS中的闭包:能够读取其它函数内部变量的函数。如javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数”。本质上是将函数内部和函数外部链接起来的桥梁

图形中的矢量和标量
概念区别:标量只用数字表示量的大小,矢量还要用方向表示
运算法则区别:矢量用平行四边形法则或者 三角形法则
正负号区别:矢量表示方向的正反性
表达式区别:比如里的表达式要考虑矢量方向,正负号加进表达式中

永真式和永假式
若A在所有赋值下取值均为真,称A为重言式或永真式
若A在所有赋值下取值均为假,称A为矛盾式或永假式
若A至少存在一组成真赋值,则称A为可满足式
永真式一定是可满足式,可满足式未必是永真式
设A为任一命题公式,若A在它的各种赋值下取值均为假,则称A是永假式。又称矛盾式。

  • p当且仅当q称作p与q的等价是。

  • 设A、B为两个命题公式,若等价式A↔B是重言式,则称A与B是等值的。记作A<=>B。

  • 仅由有限个命题变项或其否定构成的析取式成为简单析取式

  • 仅由有限个命题变项或其否定构成的合取式成为简单合取式

    • 一个简单析取式是重言式,当且仅当它同时含一个命题变项及其否定
    • 一个简单合取式是矛盾式,当且仅当它同时含一个命题变项及其否定
  • 仅由有限个简单合取式构成的析取式是析取范式

  • 仅由有限个简单析取式构成的合取式是合取范式

  • (范式存在定理) 任一命题公式都存在与之等值的析取范式和合取范式
    不过不唯一

  • 设有n个命题变项,若在简单合取式中每个命题变项与其否定有且仅有一个出现一次,则这样的简单合取式成为极小项

  • 如果公式A的吸取范式中的简单合取式全是极小项,则称该析取范式为A的主析取范式

  • 任何命题公式都有唯一的主析取范式

    用途1. 判断两个命题公式是否等值主析取范式唯一,因而A<=>B,说明A与B有相同的朱析取范式,反之若A,B有相同的主析取范式,必有A<=>B2. 判断命题公式的类型设A是含n个命题变项的命题公式,A为重言式,当且仅当A的主析取范式中含全部2^n个极小项。A为矛盾式,当且仅当A的主析取范式中不含任何极小项,此时记A的主析取范式为0,。当然,若A的主析取范式中至少含一个极小项,则A是可满足式。3. 求命题公式的成真和成假赋值
    
  • 设有n个命题变项,若在简单析取式中每个命题变项与其否定有且仅有一个出现一次,则这样的简单析取式成为极大项

  • 如果公式A的合取范式中的简单析取式全是极大项,则称该析取范式为A的主合取范式

  • 任何命题公式都有唯一的主析取范式

  • 任何命题公式都有唯一的主析取范式

  • 构造证明方法技巧

  1. 附加前提证明法
  2. 归谬法
  • 等价关系和划分
    设R为非空集合A上的关系,如果R是自反的对称的传递的,则称R为A上的等价关系
  • A上等价关系R的所有不交的等价类的集合称为A在R下的商集,记作A/R。
  • 设A是非空集合,如果存在一个A的子集族π(π包含于P(A)),满足以下条件
  • 偏序关系:设R为非空集合A上的关系,如果R是自反的反对称的传递的,则称R为A上的偏序关系,简称偏序,记作≤。集合A和A上的偏序关系一起叫作偏序集,记作<A,≤>
  • x与y是可比 设<A,≤>为偏序集,对于任意的x,y∈A,如果x≤y或y≤x成立
  • y盖住x 如果x<y(x≤y∧x≠y),且不存在z∈A,使得x<z<y

  • 零图 只有顶点没有变的图
  • 平凡图 只有一个顶点的零图
  • 既不含平行边也不含环的图,称为简单图。(平行边:关联一对顶点的方向相同的边多于一条,平行边的条数称为重数)
  • 完全图 设G为n阶(n个顶点)无向简单图,若G中任何两个顶点均相邻,则称G为n阶完全图,记作Kn。
    设D为n阶(n个顶点)有向简单图,若D中任何两个顶点之间均有两条方向相反的边,则称D为n阶有向完全图
  • n阶无向简单图,若G中每个顶点的度数均为k,则G为k正则图
    若图的节点可以任意挪动位置,而边是完全弹性的,只要在不拉断的条件下,一个图可以变形为另一个图,那么这两个图是同构的。
    图同构的必要条件结点数目相同,边数相同,度数相同的结点数相同

  • 握手定理 任何图(无向图或有向图)中所有顶点的度数之和等于边数的两倍,任何有向图中所有顶点的入度之和等于所有顶点的出度之和等于边数。
    任何图中奇度顶点的个数为偶数。
  • G的连通分支数记作p(G)
    • 弱连通图 若略去有向图D中各边的方向所得无向图是连通图
    • 单向连通图 若D中任何两顶点至少一个可达另一个
    • 强连通图 若D中任何两顶点都是相互可大的
    • 强连通图一定是单向连通图,单向连通一定是弱连通图

点割集: V是一些顶点的集合,如果删除V中的所有顶点之后,G不在连通,但是对于V的任何真子集V1,删除V1后G仍然连通,则称V是点割集。
割点:如果点割集里只有一个顶点,那么这个顶点叫做割点。点连通度:最小的点割集的大小。
边割集:E是一些边的集合,如果删除E里的所有边之后G不在连通,但是对于E的任何真子集E1,删除E1之后G仍然连通,则称E是边割集。
:如果边割集里只有一条边,该边称为桥。
边连通度:最小的边割集的大小.
双连通:如果一个图没有割点,那么这个图称为2-连通的,或者双连通的.一个图的极大双连通子图称为双连通分量注意是极大而不是最大,即意味双连通子图不一定只有一个.

设V’包含V且V’不为空集,使得在无向图中去掉V’中的点之后,图的连通分支增加,则V’称为无向图中的一个点割集。
当删除V’的任何一个真子集中的点后,不会增加图的连通分支,当集合V’中只含有一个元素时,该元素可称为图的一个割点。

着色 给无环的无向图的每一个顶点涂一种颜色,使得相邻的顶点涂不同的颜色,称作图的点着色,简称着色。图的着色问题是如何用尽可能少的颜色给图着色。


二部图把一个图的顶点划分为两个不相交集和 ,并且同一集合中不同的两点没有边相连

匹配:一个匹配是一个边的集合,其中任意两条边都没有公共顶点
完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么他就是一个完美匹配
无向图G为二部图当且仅当G中无奇数长度的回路
Hall定理(霍尔定理)
欧拉图(边)

  • 欧拉回路与欧拉通路 经过图中每条边一次仅一次并且行遍图中所有顶点的回路(通路),称为欧拉回路(通路),有欧拉回路的图称为欧拉图。

    • 无向图G有欧拉回路当且仅当G连通且无奇度顶点.
    • 无向图 G有欧拉通路但无欧拉回路当且仅当G连通且恰好有两个奇度顶点。这两个奇度顶点是每条欧拉通路的两个端点
    • 有向图D有欧拉回路当且仅当D连通且每个顶点的人度等于出度:
    • A有向图D有欧拉通路、但无欧拉回路当且仅当D连通,且除两个顶点外,其余顶点的入度等于出度,这两个例外的顶点中,一个的入度比出度大1,另一个的人度比出度小1.

哈密顿图(顶点)
哈密顿回路与哈密顿通路 经过图中每个顶点一次仅一次的回路(通路)称为哈密顿回路(通路)。有哈密顿回路的图称为哈密顿图
平面图 如果能将无向图G 画在平面上,使其除在顶点处外没有边相交,则称G为平面图.画出的无边相交的图称为G的平面嵌入。

平面图的面与次数 平面图 G的平面嵌人中的边将平面分成若千个区域,每个区域称为G的一个面,其中有一个面积无限的面称为无限面或外部面,其余面积有限的面称为有限面或内部面,包围一个面的所有边构成的回路称为该面的边界,边界的长度称为面的次数,面R的次数记作deg®.
设G是个平面图,图中边围成的区域,其内部不含有结点,也不含有边
围成一个面r的所有边构成的回路,称之为这个r面的边界。此回路中的边数,称之为r面的次数,记作deg®。面的面积有限称为有限面,反之称为无限面

极大平面图 如果在简单平面图G的任意两个不相邻的顶点之间再加一条边,所得图为非平面图,则称G为极大平面图
极小非平面图若在非平面图 G中任意删除一条边,所得图为平面图,则称G为极小非平面图.

  • 平面图的所有面的次数之和等于边数的两倍
  • 极大平面图是连通的
  • 设G是n(n>=3)阶简单的连通平面图,则G为极大平面图当且仅当G的每个面的次数均为3。

非平面图K5和K3,3:

地图着色地图是连通的无桥平面图的平面嵌入,每出个面是-一个国家.对地图的每个国家涂一种颜色,使相邻的国家涂不同的颜色,称为地图着色,地图着色问题就是要用尽可能少的颜色给地图着色,地图着色可以转化成平面图的点着色。

欧拉公式 设G为连通的平面图,则有n-m+r=2顶点数-边数+面数=2,其中n、m、r分别为G的顶点数、边数和面数。
欧拉公式的推广 设平面图G有p个连通分支,则有n-m+r = p+1顶点数-边数+面数=连通分支数+1

同胚 如果两个图G1和G2同构,或经过反复插入或消去2度顶点后同构,则称G1和G2同胚
库拉图斯基定理 图G为平面图当且仅当G中没有可以收缩成K5或K3,3的子图
库拉图斯基定理图G为平面图当且仅当G中没有与K5或K3,3同胚的.
子图,
四色定理任何平面图都是4-可着色的.

无向树 连通不含回路的无向图
生成树若无向图G的生成子图T是一棵树,则称T为G的生成树,G在T中的边称为T的树枝,G不在T中的边称为T的. T的全体弦组成的集合的导出子图称为T的余树.注意,T的余树不一定是树,它可能不连通,也可能含回路.
基本割集与基本割集系统 对T的每一条树枝a,G中有唯一一个由a和T的弦构成的割集,称为对应树枝a的基本割集,G中所有基本割集的集合称为对应T的基本割集系统



阿贝尔(Abel)群若群G中的二元运算是可交换的,如整数集Z、有理数集Q、实数集R和复数集C关于数的加法构成群
对有限群G,G 中元素的个数叫作G的阶
只含幺元e的群称为平凡群,是1阶群


是否构成代数系统——封闭


编译原理

确定性有限DFA的非确定性NFA定义与区别
有限自动机是一种数据模型,就像函数、数列是一种数学模型一样。有限自动机 通过状态转换图来实现功能,给它一个初始状态和一个输入符号,它能根据你输入的符号将原状态转换到另一个状态,模拟计算机的识别过程。

NFA初态可有多个,转换函数为多值映射

联系:NFA和DFA都是有限自动机,都用于接收、识别一定的字符串。确定有限自动机是非确定有限自动机的特殊形式,非确定有限自动机是对确定有限自动机的扩展。

- 初始状态可能有多个 ,因此,在没有接受任何符号串(或者说接受空串ε)时,自动机 所处的状态是不确定的,可能处于多个初始状态中的任何一个
- 在一定的状态下,可以接受一个符号串,包括空串ε
- 在一定的状态下,接受一定的符号串时,要转移的后继状态是不确定的。

区别:

  • NFA多值函数,DFA单值函数
  • NFA可以有多个初态,DFA只有一个初态
  • NFA的每条弧允许用∑*上的一个字作标记,DFA的每条弧只允许用∑上的一个字符作标记。

一个能实现状态转移的自动机。对于一个给定的属于该自动机的状态和一个属于该自动机字母表求和的字符,它能根据实现给定的转移函数转移到下一个状态(这个状态可以是先前那个状态)。

对每个状态和输入符号对可以有多个可能的下一个状态的有限状态自动机。

  • 确定有限自动机用来识别一定类别的单词符号,它描述识别单词符号的算法基本思想:开始时,自动机处于初始状态,每一时刻根据自动机所处的状态和当前的输入符号来决定自动机要转移的状态(并读入当前的输入符号)。如果一个符号串被自动机读到结尾时正好处于自动机的终止状态,则认为这个符号串能被相应的自动机接受或识别。
  • 非确定有限自动机可以用来识别符号串。

DFA 跟NFA之间的关系,NFA怎么确定化为DFA
确定定:与某一NFA等价的DFA不唯一
最小化:消除多余状态和合并等价状态
1.如果有一个不确定的有限自动机,则可以转化为图的方式。此处不详述怎样转图的方式。
2.先将初态确定,然后根据输入的每个元素可以得到哪些状态,依次列表。
3.这些状态集合可以称为这个有限状态集合n个子集。按0,1,2……的顺序编号。
4.因为这些子集之间的关系是输入一个确定值确定的,所以这些子集之间存在一些关系,即把这些子集的关系写出来完成NFA向DFA的转换。

  • 区别
    确定有限自动机的函数是单值映射函数,非确定有限自动机的函数是多值映射函数
    确定有限自动机由唯一的一开始状态,非确定有限自动机的函数开始状态不唯一。

确定的有限状态自动机和不确定的有限状态自动机哪个可容纳度更高
不确定的
DFA的识别功能
对于 ∑*(西格玛)中任何字a,如果存在一条从初态结点到某个终态结点的道路,这条路上所有的标识符连成的字等于a, 则a可被DFA M所识别(接受,读出)
若M的某些结点既是初态结点又是终态结点,或者存在一条从某初态结点到某个终态结点的ε通路,那么空字ε可为M所识别

闭包运算(*)
闭包运算是一目运算。对于符号串集合A,其闭包运算A结果是一个新的符号串集合,该集合中每个元素是由A中的符号串之间经过有限次(0次或者多次)连接得到的符号串,
例如,A={a}, 则A
= {e,a, aa, aa,…其中:表示空串,是由A中的元素经过0次自连
接得到的。

正规式
对于词法分析来说,不是任意符号串的集合,而是程序设计语言所有合法单词符号构成的集合,这些集合中的元素在构成上是由规律的,如标识符的集合是由所有合法标识符构成的,即其中每个元素以字母开始的字母数字串,这些规律可以用正规式来描述。单词符号的集合,用正规式来描述,或正规式代表相应的单词符号集合。

利用正规式描述单词符号的构成规则,如字母( 字母数字) 描述多数程序设计语言标识符的构成规律:以字母开始的字母数字串,根据前面的定义容易看出,该正规式所代表的正规集为所有以字母开始后跟0个或多个字母或者数字构成的符号串的集合,显然是标识符的集合。再如,整数类型的常数用正规式描述为: (±le)(数字)(数字) 。

简述正规式和有限自动机的关系

  • 用正规式描述出单词符号的构成规则后,下一步是构造识别程序,该程序应能对任意输入的字符串,判断是否属于正规式所表达的正规集,或者说是否符合正规式所描述的构成规律。需要用有限自动机来描述。
  • 任何有限自动机识别的符号串集合都是正规集,可以认为正规式、确定有限自动机、非确定有限自动机从描述能力上讲是等价的。任意的正规式都存在等价的确定或非确定的有限自动机,该自动机识别的符号串的集合就是相应的正规式所代表的的正规集。
  • 正规式适合描述单词符号的规则,确定有限自动机适合描述识别单词符号的算法

如何构造与任意给定的正规式等价的确定有限自动机
自动机识别的符号串集合是给定正规式所代表的的正规集。如果能做到这一点,并且由正规式构造确定有限自动机的过程自动化,在设计词法分析器时,设计者只需用正规式描述给类单词符号的构成规则, 然后用正规式到确定有限自动机的自动转换算法生成确定有限自动机,用该自动机识别所描述的各类单词符号。由正规式到确定有限自动机的转化过程分为两步:
(1)由正规式构造非确定有限自动机;

首先,构造只含初始状态和终止状态的自动机,从初始状态到终止状态的边用给定的正规式来标记。然后,通过引入新的状态和状态之间的边,来逐个分解正规式,直到每条边用字母表上的字母标记或空串ε标记。

(2)对非确定有限自动机进行确定化,得到确定有限自动机。.
在非确定有限自动机中,从初始状态出发,如果接受相同的符号串,停止于不同的状态,从单词符号识别的角度来看,不同的状态是等价的。
子集法确定化:需要找出所有等价的状态子集,将每个状态子集合并成一个状态。

思想:
- 首先,定义状态子集的ε闭包的概念。对于任意的状态集合X,其ε闭包也是一个状态集合,其定义为:- X中的任意状态也属于X的ε闭包- 从X中的任意状态出发经过一条或者多条ε标记的边所能到达的所有状态也属于X的ε闭包首先, 非确定有限自动机初态集合ε闭包中的所有状态是等价的,在没有接受任何符号的情况下,自动机处于这些状态中任何一个,这些状态应该合并成一个状态,作为确定有限自动机的初始状态。
- 然后,在非确定有限自动机中,考察从初态集合ε闭包中的每个状态出发,在读取相同符号的情况下,所有可能停止的状态(即Next函数值),这些状态也是等价的,应该合并成一个状态,作为确定有限自动机初态在相应输入符号情况下的后继状态。对于该新状态(对应于非确定有限自动机的一一个状态集),也采用同样的方式,考察-定输入下所有可能停止的状态,合并这些状态。上述过程不断进行,直到没有新状态(对应于非确定有限自动机的一个状态集)没有被考察为止。包含非确定有限自动机终止状态的状态子集所对应的状态应该作为确定有限自动机的终止状态。 ,

(3)化简
多余的状态需要进行化简。基本思想:
把确定有限自动机的状态集划分成不相交的等价类,等价类中的每个状态子集中的状态之间是等价的,而属于不同状态子集的状态是可以区分的,然后每个状态自己中选一个母个状念于集中的状念之间是等价的,而属于个同状态子集的状态是可以区分的,然后每个状态子集中选一个状态作 为代表,删除其他状态。首先介绍状态等价和可区分的概念。
对于两个状态X和Y,如果从X出发能够接受任意符号串w而停止于终止状态,并.且从Y出发也可以读取相同的符号串w而停止终止状态,则认为X与Y是等价的,否则认为X与Y是可区分的。

正则文法跟上下文无关文法以及两者的关系

利用上下文无关文法描述语言的语法规则
设计语法分析器,首先需要对语言的语法进行描述。

什么是上下文无关文法,由几部分组成的
上下文无关文法所定义的语法范畴,是完全独立于这种范畴可能出现的环境的。由四部分组成:
一组终结符号:组成语言的不可再分的基本符号,在程序语言中是单词符号(基本字、标识符、常数、算符和界符)
一组非终结符号(语法变量):代表语法范畴(算术表达式、布尔表达式、赋值句、分程序、过程)。
一个开始符号:特殊的非终结符
一组生产式(产生规则或简称规则):定义语法范畴的一种书写规则

编译原理正则式和上下文无关文法分别能表示什么语言?简述一下编译原理
上下文无关文法的产生式规则具有A→β形式,其中A∈VN, β为由终结符和非终结符构成的符号串,包括空串。
正则文法的产生式规则具有A >aB或者A→a的形式,其中A和B都是文法非终结符,
a是由文法终结符构成的符号串。

  • c语言,php,java的语法规则都涉及到上下无关文法,大部分程序设计语言的语法规则。

  • 正规文法产生的语言都可以用上下文无关文法来描述

  • 上下文无关文法比正规文法具有更强的描述能力

    上下文无关文法是2型文法,正则文法是3型文法,从上题的分析可以看出,3型文法是2型文法的特例,3型文法可以描述的语言都可以用2型文法来描述,而2型文法可以描述的语言则不一定能用3型文法来描述。即2型文法比3型文法的描述能力强
    
  • 正则文法用来识别单词

区别:正则定义中不允许递归定义

何为递归下降分析法。
答:在不含左递归和每个非终结符的所有的首符集都两两不想交的条件下。我们就可以构造-一个不带回溯的的自,上而下的分析程序。该程序是由一组递归过程组成的。每个过程对应文法的–个非终结符。这种语法分析的方法称为文法递归下降分析法。
什么叫做递归下降分析器?
答:当一个文法满足LL (1)条件时,我们就可以为它构造一个不带回溯的自上而下分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符,这样的一个分析程序称为递归下降分析器。

编译执行过程?
词法分析,
语法分析,
语义分析和中间代码生成,
优化,
目标代码生成
对于 c 语言:源程序文件,预编译处理(cpp),编译程序本身,优化程序,汇编程序,链接程序,可执行文件
缓存模块举例:hibernate spring3 有缓存模块

优化
优化的目的是为了产生更高效的代码
优化遵循的原则:等价原则,有效原则、合算原则
常用的优化技术:删除公共子表达式,复写传播,删除无用代码
以下三种涉及循环:代码外提、强度削弱、删除归纳变量

  • 局部优化
    基本块入口语句:
  1. 程序的第一个语句
  2. 能由条件语句或者无条件语句转到的语句
  3. 紧跟在条件转移语句后面的语句
  • 循环优化
    活跃变量,指A的值要从P开始的某通路上被引用。

语法分析方法
自上而下分析法与自下而上分析法
自上而下面对的主要问题是:如何消除文法的左递归,以及在由文法的开始符号出发推导句子的过程如何避免回溯
自下而上:在由输入串出发向文法的开始符规约的过程中,如何确定可归约子串(句柄或最左素短语)

说明消除文法二义性的方法有那些

  • 改写二义文法为非二义文法
  • 为文法中的符号规定优先级与结合性

语法分析器在编译器中应完成什么任务?

  • 语法分析器根据语法规则是被出记号流中的结构,并构造一课能够正确反映该结构的语法树
  • 检查输入中的错误,调用出错处理器进行适当处理

语法制导 简要说明在编译过程中引入中间代码的好处,以及中间代码应具有的特点
好处主要有两点:
一是便于编译程序的开发和移植;
二是便于对代码进行优化处理。
特点:
便于语法制导翻译;
既与机器指令的结构相近, 又与具体机器无关。

语法制导翻译过程中使用的拉链-回填技术
拉链-回填技术是语法制导翻译过程中使用的一种基本技术,其基本思想是当三地址码中的转向不确定时,将所有转向同一地址的三地址码拉成一个链;而一旦所转向的地址被确定,则为此链上所有的三地址码回填入此地址。

中间语言
中间语言是一种面向语法、复杂性介于高级语言书写的源程序和用机器语言表示的目标程序之间,是一种易于翻译成目标代码的代码形式
作用:利用它作为中间环节,不仅可以较快地实现源程序翻译过程,而且可在此基础上应用优化方法, 将源程序翻译成为运行时间短、占用内存少的目标程序。

以·c和.h文件编译成了执行文件过程是什么,要用编译原理知识去解释
3个.c文件和3个.h文件如何编译成一个可执行文件,运用编译原理的知识回答


编译器的最终目的是将源代码转化为机器能够识别运行的二进制机器码。
步骤
1.头文件的预编译,预处理

编译器在编译源代码时,会先编译头文件,保证每个头文件只被编译一次。

在预处理阶段,编译器将c文件中引用的头文件中的内容全部写到c文件中。

2.词法和语法分析(查错)

3.编译(汇编代码,.obj文件)

转化为汇编码,这种文件称为目标文件。后缀为.obj。

4.链接(二进制机器码,.exe文件)

将汇编代码转换为机器码,生成可执行文件。

预编译
首先是源代码文件hello.c和相关头文件,如 stdio.h 被编译器 cpp预编译到一个 .i 文件。预编译过程主要是处理那些源代码文件中以 # 开始的预编译指令。比如#include 、#include 等。经预编译后的 .i 文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件已经被插入到 .i 文件中
编译
编译过程就是把预处理的文件经过一系列的词法分析、语法分析、语义分析、生成中间代码、生成目标代码、优化后生产相应的汇编文件代码。
编译器以中间代码为界限,可分为前端和后端。

 比如clang就是前端工具,LLVM则负责后端处理。另一个知名工具GCC(GNU Compile Collection)则是一个套装,包揽了前后端的所有任务

前端主要负责预处理、词法分析、语法分析,最终生成语言无关的中间代码。后端主要负责目标代码的生成和优化。

  • 编译器就是将高级语言翻译成机器语言的一个工具。

汇编
汇编器件汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。得到目标文件。输入源是汇编代码,输出二进制机器码(后缀.o的目标文件)。输出的二进制机器码可以直接被CPU识别和执行。
链接
在一个目标文件中,不可能所有白娘和函数都定义在同一个文件内部。不同文件之间要做相应的连接处理,包括:

  • 地址和空间分配(Address and storage)

  • 符号决议(Symbol Resolution)决议更倾向于静态链接,绑定更倾向于动态链接

  • 重定位(Relocation)

    重定位假设有个全局变量叫作var,它在目标文件A里面,我们在目标文件B中要访问它。于在编译目标文件B的时候,编译器并不知道变量var的目标地址,所以编译器在没法确定的情况下,将目标地址设置为0,等待链接器在目标文件A和B连接起来的时候将其修正。这个地址修正的过程被叫做重定位,每个被修正的地方叫一个重定位入口。
    链接器就是靠着重定位表来知道哪些地方需要被重定位的。每个可能存在重定位的段都会有对应的重定位表。在链接阶段,链接器会根据重定位表中,需要重定位的内容,去别的目标文件中找到地址并进行重定位。
    

词法分析器的概念和特点
词法分析器,又称扫描器。词法分析是将字符或字符序列转化为记号,分析得到的记号以供后序语法分析使用。
关系代数
关系代数是一种抽象的查询语言,用对关系的运算来表达查询,作为研究关系数据语言的数学工具。关系代数的运算对象是关系,运算结果也是关系。专门的关系运算包括:选择,投影、连接、除等。

编译器与解释器的区别

面向大数据
编译器的组成?
如果有一个类型数组,大小超过内存大小,用什么算法产生中间代码进行优化?
编译器的哪些部分可以进行面向大数据的优化?

第一章 编译原理概述

编译过程

  1. 词法分析
    识别程序中单词符号(标识符、运算符、保留字、各种类型的常量)

第四章 自上而下语法分析


递归下降

编译方式与解释方式的区别
是否生产目标代码,编译方式生成目标代码。
编译程序总框架

词法分析

  1. 状态转换图的功能:识别(接收)一定的字符串

闭包的概念

第二章 文法和语言的形式定义

上下文无关文法的定义
文法:描述语言的语法结构的形式语言(或称语法规则)
上下文无关文法:
它所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境(与它所在的上下文无关)

文法分类
0型文法(短语结构文法):左侧至少含有一个非终结符
1型文法(上下文有关文法):左侧长度<=右侧长度 S->ε 除外,S不能出现在右侧
2型文法(上下文无关文法):左侧只能有一个非终结符( 语法分析)
3型文法(正规文法): A-> aB A->a 右线性; (词法分析)
A->Ba或A->a左线性(看非终结符位置)

句型、句子
句型:符号串x是从识别符号S推导出来的,x称为一个句型
句子: x仅由终结符号组成,仅含终结符号的句型是一个句子
短语:子树的末端(叶子)从左至右连成的串( 包括整棵语法树)
简单子树:只含有单层分枝的子树
直接短语(简单短语):由简单子树的叶子组成
句柄:最左边的直接短语(不一定含终结符)
素短语:至少含有一个终结符的短语,并且除它自身之外不再含任何更小的素短语
最左素短语:最左边的素短语

短语: P (相对于T、E)、p+T (相对于E)、i (相对于P、F)、P+T+i (相对于E)
直接短语: P、i
句柄: P (最左边的 直接短语)
素短语: P+T、i (至少含有一个终结符的短语)
最左素短语: p+T

短语:一个句型的语法树中任一子树的叶节点所组成的符号串都是该句型的短语
直接短语:一个句型的语法树中任一最小子树的叶节点所组成的符号串都是该句型的短语
句柄:句柄是最左边的直接短语
素短语:有后往前对短语进行判断,如果短语中至少含有一个终结符,而且除它自身之外不再含任何更小的素短语,那么称该短语为素短语

文法和语言的对应关系:
一个文法G所产生的句子的全体就是一个语言。给定一个文法,就能从结构上确定其语言;给定一种语言,能找到其文法,但该文法不是唯一的。
语法分析树与二义性
用一棵树来表示句型的推导,简称语法树。若一个文法的一个句子对应两棵不同语法树,则称该句子是二义性句子如果一个文法含有二义性的句子,则称该文法是二义性文法

二义性文法:有两个不同的最左推导或有两个不同的最右推导或能产生两棵语法树

正规式与正规集
正规集:把具有相同特征的字放在一起组成一个集合
正规式:然后使用一种形式化的方法来表示正规集
正规式是描述单词结构的一种形式,正规集是该类单词的全集



递归下降分析法的概念,应满足什么条件?

预测分析表的构造

构造预测分析表,步骤

  1. 消除文法左递归
  2. 构造每个产生式左部(即->符号左边的非终结符)的First集、Follow集.
  3. 构造每个产生式的每个侯选式的first集
  4. 证明文法是一个LL(1)文法
  5. 构造出预测分析表。

自底向上:算符优先、LR(0)、SLR(1)、LR(1)、LALR(1)

规范归约最右推导的逆过程(最左规约)

  • 最右推导是规范推导右句型(最右推导 可得的句型)是规范句型
  • 规范句型的特点:句柄后(右边)不会出现非终结符
  • 规范归约的中心问题是:如何寻找或确定一一个句型的句柄。
  • 可归约串:
    • 最左素短语算符优先分析法)
    • 句柄(R分析法)

由规范推导推出的句型成为规范句型
由于规范句型是由规范推导推出的句型,故该句型的句柄右边只含有终结符号(因为他是最右推导,右边的非终结符一定被推导成终结符了)
规范归约的关键问题是寻找句柄
在规范归约中,可归约串必出现在栈顶

算符优先分析法不是规范归约方法。


LR分析法的归约过程是规范推导的逆过程,所有LR分析过程是一种规范归约过程。
无回溯的“移进_归约”方法
符号栈中的符号是规范句型的前缀,且不含句柄以后的任何符号(活前缀)
ACTION 移进 归约 接受 出错
ACTION[i,a]=空白 出错.
ACTION[i,a]=acc 符号栈中仅有#和文法开始符号S,输入串仅为#,分析结束。
一个句型的某个前缀的后缀是该句型的句柄,则这个前缀称为该句型的可归前缀
一个规范句型的一个前缀,若不含句柄之后的任何符号,则称它为该句型的一个活前缀。
s->aAc.B项目中.之前aAc为活前缀

从文法出发构造LR(0)分析表

  1. 构造文法G的拓广文法G’
  2. 构造LR(0)项目
  3. 构造G’的项目集规范族
  4. 后遭分析表

LR(0)项目集规范族(识别G的活前缀的DFA)
如果不存在移进归约冲突,归约-归约冲突,则称它是LR(0)文法
拓展文法的目的:使文法只有一个以识别符号作为左部的产生式,从而使构造出来的分析器有唯一的接受状态。

对给定的文法,利用LR(0)方法判断符号串是否为该文法的句子:
1.扩充文法为拓广文法;
2.构造识别此文法的全部活前缀的DFA,即构造LR(0)项目集规范族;
3.判断是否为LR(0)文法;
4.是构造LR(0)分析表 利用LR 分析算法分析符号串。
5.否,做其他处理。
SLR (1) 对所有非终结符都求出其FOLLOW集合
发生冲突时,归约项目左部终结符FOLLOW集与移进项目.后的终结符交集为空时,才能按此规约项目的产生式进行归约。

  • LR(0)分析对所有终结符均采用归约动作
  • SLR(1)分析参考FOLLOW集,以确定归约动作。

Follow集无法解决移进-归约冲突或归约-归约冲突,考虑后继符

归约动作的选择:
a)LR(0)分析考虑所有终结符
b)SLR(1)分析参考FOLLow集,为了确定归约
c)LR(1)分析仅考虑LR(1)项目中的后继符(归约展望集,向前搜索符)
拓展文法的后继符为#,即[ S->S , #为初态集的初始项目,S后first(ε, #)= {#}
LR (1)项目集规范族中,每个状态中添加新的产生式时,需求产生式左部字母后面的First集作为新产生式的后继符;否则后继符照抄前一个状态的
I : A->a.Bβ
B->.e ,需求出First (β )作为B->.e的后继符

任何二义文法决不是一个LR文法
LL(k)文法都是LR(k)文法

a=bc+bd
逆波兰式: abcbd+= ( 算符优先的-一个应用)
无括号;运算对象顺序不变;运算符号的位置反映运算顺序。
◆三元式运算结果用三元式编号表示
bc (,b,c)
◆四元式运算结果用临时变量表示
bc (, b,c,t)
注意最后一步写法
四元式直观写法:
t1:=bc
t2:=b
d
t3:=tq+t2
a:=b
中间代码优化处理时,四元式比三元式方便的多

终结符只有综合属性,由词法程序提供;
非终结符可有综合也可由继承属性,但文法开始符号无继承属性

  • 综合属性
    用于“自上而下”传递信息
    在语法树中,一个结点的综合属性的值由其子节点的属性确定。
    因此,通常使用自底向上的方法在每一个节点处使用语义规则计算综合属性的值。
    仅仅使用综合属性的属性文法称s-属性文法五、中间代码生成
  • 继承属性
    用于“自上而下”传递信息。
    在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定。
    用继承属性来表示程序语言结构中的上下文依赖关系很方便。

中间代码
是一种面向语法,易于翻译成目标代码的代码.
中间语言的形式有三种:后缀式、图表示法(包括抽象语法树和有向无环图(DAG两种)、
三地址代码
后缀式(逆波兰式)的概念
把运算量(操作数)写在前面,把算符写在后面
运算法出现的顺序和实际运算顺序一致
后缀式与抽象语法树(表达式树)的关系
后缀式其实是抽象语法书的线性表示形式,并且是按后根序遍历得到的。

将赋值语句表示成后缀式和四元式

第6章 语法制导翻译和中间代码生成

第7章 运行阶段的存储组织与分配

第8章 代码优化

代码优化的基本概念

代码优化指对(中间)代码进行等价变换,以便从这样的代码出发,能生成更有效的目标代码。优化时遵循的原则:

  • 等价原则,即变换前后的代码在逻辑上必须是等价的,变化不能改变程序的运行结果
  • 有效原则,即变换后的代码必须具有更高的效率运行的时间较短,占用的存储空间较小
  • 合算原则,合算原则,即花费在代码变换上的时间和空间必须足够小,以较低的代价达到比较好的优化效果

在进行代码优化时,需要对代码进行各种等价变换。
从变换所涉及的范围来看,划分为局部优化循环优化全局优化,其中局部优化涉及一个基本块内的优化,
循环优化涉及几个基本块(构成循环)内的优化,
而全局优化涉及整个程序的优化。

基本块,怎样把一个中间代码序列划分为基本块
所谓基本块,是指具有单一入口和单一出口的中间代码(后面称其为语句,如四元式)序列,其中第一个语句是其入口,最后一个语句是其出口。
划分基本块的方法如下:
(1)首先按照下列原则确定每个基本块的入口语句。
入口语句是满足下列任意条件的语句:程序的第一个语句;由条件或无条件转移语句可以转移到的语句;紧跟在条件转移语句后的语句。
(2)针对每个入口语句,按下列原则构造其所属的基本块。
对每个入口语句,其所属的基本块是从该入口语句出发(包括该入口语句),到出现下列任意语句为止的语句序列:

  • 下一个入口语句(不包括该语句);
  • 转移语句(包括该转移语句);
  • 停语句(包括该停语句)

凡是不属于任何基本块的语句,都是程序流程无法到达的语句,因此,可以山道

按优化所涉及的程序范围可分为三个级别:局部优化、循环优化、全局优化
局部优化指在只有一个入口一个出口的基本快内进行的优化。

判定入口语句的规则:
(a)代码序列的第1个语句。
(b)条件或无条件转移语句的转移目标语句。If… goto Goto
©紧跟在无条件转移语句或条件转移语句后面的语句。

简述代码优化的原则与优化的级别,并列举三种常用的优化技术
三个原则:

  • 等价原则:经过优化后不应改变程序运行的结果;
  • 有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小;
  • 合算原则:应尽可能以较低的代价取得较好的优化效果

优化级别:

  • 局部优化
  • 循环优化
  • 全局优化

常用的优化技术:

  • 删除公用子表达式
  • 代码外提
  • 强度消弱

基本块、流图的概念,如何画、节点对应基本块、要求进行局部和循环优化
一:首先要了解两种语句的概念和特征
1.转移语句:如果某个句子中含有goto…语句,那么他就是一个转移语句
转移语句又分为两种:

  1. 条件转移语句:形如if"goto"""的语句
  2. 无条件转移语句:只有goto,没有if的语句

2.停语句: halt 这样的语句被称为是停语句。
.
二:接着要知道入口语句的求法:有三种语句是入口语句
1)程序的第一一个语句,
2)能由条件转移语句或无条件转移语句转移到的语句(就是GOTO后面指向的语句,例如(3)号语句里有GOTO (8),那么(8)就是入口语句)
3)紧跟在条件转移语后面的一个语句。

三:划分四元式程序为基本快的方法:
对求出的每个入口语句,确定其所属的基本块。它是由
A一个入口语句到下一入口语句(不包括该入口语句)之间的语句序列
B一个入口语句到一转移语句(包括该转移语句)之间的语句序列
C一个入口语句到一停语包(包括该停语包之间的语句序列组成的
四:流图的画法:
每个流图以基本块为结点。如果- -个结点的基本块的入口语句是程序的第一条语句, 则称此结点为首结点。如果在某个执行顺序中,有B1和B2两个基本块,如果存在以下两种情况中的任意一种
1.有一个条件或无条件转移语句从B1的最后–条语句转移到B2的第一条语句;.
2.在程序的序列中,B2紧接在B1的后面,并且B1的最后一条语句不是-一个无条件转移语旬。
我们就说B1是B2的前驱,B2 是B1的后继,并从B1画一条有向边到B2

第一步是找出入口语句:
(1)为程序的第一句;
(4) 为(7)的GOTO得来;
(6) 为(5)的后一句;
(8)为(5)的GOTO得来
第二步画基本块:
(1) (2) (3)为一基本块(对应三种A的方法) (4) (5)为一基本块(对应B) (6)
(7) 为- .基本块(对应B) (8) (9)为一-基本块(对应C)
第三步画流图:

局部优化的方法
DAG是对基本块进行优化的有效工具
利用DAG可以实现局部优化
(1)合并已知量
(2)删除多余运算
(3)删除无用赋值
不变运算的代码外提的条件
不变运算所在的结点是循环L所有出口结点的必经结点.
对于循环不变运算A:=B op C只有A在循环中其他地方未再定值,才能把A:=B op外提;
循环中所有A的引用点只有S中的A的定值才能到达。

循环优化中的强度削弱的含义
把程序中执行时间较长的运算转换为执行时间较短的运算
强度消弱主要是对与归纳变量有线性关系的变量赋值进行;
经过强度消弱后,循环中可能出现一-些新的无用赋值;
对于消弱下标变量地址计算的强度非常有效

目标代码一般有以下三种形式:
能够立即执行的机器语言代码。所有地址已经定位;
待装配的机器语言模块。执行时,由连接装配程序把它们和某些运行程序连接起来,转换成能执行的机器语言代码;

编译原理和离散数学 考研相关推荐

  1. 【编译原理】计算机考研复试问答题总结

    [编译原理]计算机考研复试问答总结 因为复试专业课需要考编译原理,线上复试总结一些编译原理的相关题目~ (ps:只是一些面试的一些概念简答题,如果有笔试相关类型的题目要好好写) 第一章 编译概述 Q1 ...

  2. 编译原理第三版清华pdf_清华网络科学与网络空间研究院考研经验分享

    清华网络科学与网络空间研究院考研经验分享 盛世清北,清北硕博摇篮,专注清华北大考研辅导近十年,盛世清北-北京大学考研辅导班开设清华土木工程考研辅导系列课程.上清华北大,就上盛世清北! 考试科目 参考书 ...

  3. 添物 不花钱学计算机及编程(预备篇)— 编译原理

    编译原理是将一门语言翻译为另一门语言的学科.如果您只是想当个简单的程序员是可以不用学习的,或者有个了解就可以.但是如果您想更好的发展,就要很好的掌握了. 这门课程最大的特色就是,要自己写代码学习,不能 ...

  4. c++ tuling123_现代编译原理-图灵计算机科学丛书.pdf

    基础的重要性(程序员之路) 学习编程有几年了,感觉走了不少弯路,而不少的学弟学妹又在重蹈我当初的覆辙,不免有些痛心.最近在网 上也看了许多前辈们的经验建议,再结合自己的学习经历在这里谈谈基础的重要性, ...

  5. 【C++实现】编译原理 免考小队 消除一切左递归

    背景 期末考试免考,冲! 实验名称 消除一切左递归 实验时间 2020年5月27日 到 2020年5月31日 院系 信息科学与工程学院 组员姓名 Chocolate.kry2025.钟先生.leo.小 ...

  6. 深入浅出编译原理-3-词法分析器

    引言 编译器的工作的开始,就是读入源码(预编译先不考虑),然后,去除一些空字符,然后经过词素匹配,并和其属性(可选),组成一个的词法单元,多个词法单元,连接成词法单元序列.自此,此法分析器的工作就算完 ...

  7. 《编译原理》学习体会

    编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的.从笔者学习实践来看,第一次 ...

  8. 国内外编译原理课程实践教学现状分析

    <自己动手写编译器.链接器> 冯向萍 (新疆农业大学计算机与信息工程学院)   摘 要:本文主要从教材的选择,实践项目的设置以及实践课程占总评成绩的比例等方面分析和比较了国内外多所高校编译 ...

  9. JavaWeb技术内幕四:Javac编译原理

    微信公众号[黄小斜]大厂程序员,互联网行业新知,终身学习践行者.关注后回复「Java」.「Python」.「C++」.「大数据」.「机器学习」.「算法」.「AI」.「Android」.「前端」.「iO ...

最新文章

  1. 微信python天天学_刚学Python一礼拜!我就能模拟登录微信公众号!我是天才吧!...
  2. TSS和内核态堆栈的关系
  3. python代码大全p-Python5种代码维护工具
  4. esp32 tool指令参数及说明
  5. 最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)
  6. c mysql并行多条sql_Linux上使用C语言执行多条SQL命令访问MYSQL数据库的有关问题...
  7. (转)Java中的守护线程
  8. mysql5.6.24安装perl_mysql5.6源码安装
  9. python在多个组中选一组_python-使用 pandas 在每个groupby组的列中选择最大的N
  10. Leetcode每日一题:9.palindrome-number(回文数)
  11. 【转】缺陷与出路—一个游戏开发者的反思
  12. Win9x 与 WinME 磁盘共享密码破解实战
  13. [POJ1952]BUY LOW, BUY LOWER
  14. 超级好用的网站整站下载工具
  15. php简历怎么写比较出彩,如何让简历出彩 简历吸引人有几个方面
  16. 使用国内镜像安装pyqt5
  17. 数据分析报告编写规范
  18. 数据库实现递归查询,获取节点的所有子孙节点
  19. “2020(第二届)中国食品供应链大会”于8月27-28日在湖南长沙召开
  20. 【R language】 清楚区分输出函数 cat、print、paste 区别 经验分享

热门文章

  1. RPC框架系列——Avro
  2. MMA8451Q传感器读值
  3. 第十届蓝桥杯国赛Scratch编程真题解析:沙漠变绿洲
  4. OpenCV--011:像素归一化
  5. 对象存储、文件存储、块存储区别介绍
  6. 【路径规划】基于遗传算法求解多中心VRP问题matlab源码
  7. python excel取列_Python 读取excel指定的列
  8. 多类差异信息柔性融合概念与内涵
  9. android 图片字体涂鸦,android 涂鸦功能
  10. 第八章、使用matplotlib绘制高级图表