![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编译原理
文章平均质量分 80
音程
这个作者很懒,什么都没留下…
展开
-
递归语言、递归可枚举语言和非递归可枚举语言
引言考虑下面一个问题:那大家是不是觉得这个语言是不可枚举的语言了?即给定一个属于该语言的句子比如b,如果按照字典序来枚举,先列a开头的,那么我们给定的字符串b永远也不会被列举出来,因为在该语言中,a开头的字符串有无数个。但是:至于图灵机被0,1编码是怎么回事,可以看文章图灵机的种类中的通用图灵机部分。小结:即上面的3步枚举过程一定可以在有限时间内枚举到你所指定的图灵机。递归可枚举语言例子假设语言L=anbn,n>0a^nb^n,n>0anbn,n>0这个语原创 2020-12-18 10:49:26 · 5279 阅读 · 4 评论 -
图灵机及其种类
标准图灵机定义例子:构造设计如下:还剩下最关键的转移函数。可以根据一个例子,走一遍。图灵论题标准图灵机变种其转移函数需要改为:可以认为是输入串会复制在多个带上,小理解:如果是2带的话,显然其可以模拟离线图灵机,保持另外一个带只读就好了。小结:以上各种图灵机均没有使得表达能力更强,而是和标准图灵机等价。非确定性图灵机例子通用图灵机看了这么久,给大家看一个笑话开心一下通用图灵机产生的想法:怎么做到?注意上述的编码是对作为输入的那个原创 2020-12-17 15:46:11 · 1411 阅读 · 0 评论 -
DFA确定性有穷自动机及其化简
DFA:deterministic finite automator介绍概念:有穷自动机的每一步操作都是确定的,因此可称为确定型有穷自动机。确定有穷自动机就是说当一个状态面对一个输入符号的时候,它所转换到的是一个唯一确定的状态。表示例子那么可以根据上面的5元组,绘制出下面的状态转移图。解释:q0,q1,q2都是状态,所以都是节点,其中q0是开始状态,q1是终止状态(我打了两个圈)。{0,1}表示输入串中允许出现的符号,比如给你的可能是001010等等。而δ(q0,0)=q0\delta原创 2020-12-12 16:07:46 · 3304 阅读 · 1 评论 -
Point-to Analysis指针分析(2)
上一篇文章是Point-to Analysis指针分析(1)下面介绍一种新的指针分析的算法Steensgaard算法,并将其与上一篇文章介绍的Andersen算法相比较。Steensgaard算法不同于Andersen算法,Steensgaard在前者的基础上,再次对问题进行了简化,从而指针分析的速度变快了,但是损失了精度。那么其究竟是如何的一个过程呢?约束前面都和Andersen算法过程及其类似,但是约束变了。这个是Andersen的约束条件(其实就是上一篇文章中的那个表)。Steens原创 2020-12-11 18:44:10 · 1416 阅读 · 1 评论 -
Point-to Analysis指针分析(1)
前言指针分析是一个非常复杂的工作,这些工作很多方向,比如是否是上下文敏感分析或上下文不敏感分析,显然,这难易度是不一样地。比如下图。对于同一段代码,敏感性分析如蓝色,不敏感分析如红色。相比之下,不敏感分析不在乎语句的顺序,比如2,4两个语句换一下位置,得到的结果还是一样的,同时也不要求结果是否精确。不敏感分析特点:安全。即确保召回那个唯一正确的值就好,而不管精确不精确,是不是多了。下面我们要讨论的就是不敏感分析。所以有些语句我们是不会管的,比如:即,我们只管那些赋值的,和指针相关的语句。从而原创 2020-12-10 17:46:30 · 1551 阅读 · 0 评论 -
2型文法:基于预测分析表的自顶向下语法分析
文法的预处理左递归定义左递归的消除预测分析表的构造first集合follow集合计算的例子假设有如下文法:先计算first集合如下:计算过程中,要牢牢抓住first集合的概念,即非终结符A被推导替换后的一个终结符,注意空算是一个终结符。技巧:这个只看产生式左边。然后看右边第一个,所以很快!然后计算follow集合如下:技巧:这个计算起来比较麻烦,需要多次看产生式左边和右边。而且此处的follow集合不包含空,是真正现实中的终结符,所以处理空的时候比较麻烦,需要深入原创 2020-12-09 18:03:53 · 288 阅读 · 0 评论 -
SSA(static single assignment)(静态单赋值)
SSA属于控制流分析,所以有些相关的概念如控制流图,控制树,n控制m,直接控制和真控制需要参考如下文章:控制流分析引入例如:SSA一个问题:这是肯定的,有了SSA,做出上面的判断不难。上面都是一些简单的SSA改写,下面有分支,则更加麻烦,需要一些程序化的方法(后面介绍)。如下:这个时候经过分支之后,对x引用,我们很难知道到底引用了哪一个x,所以我们引入了一个非常重要的PHINode也就是ϕ\phiϕ节点,从而将这个SSA的初衷完成。初衷前面已经说了,现在啰嗦一遍,即:这样,我们原创 2020-12-09 17:15:00 · 2472 阅读 · 0 评论 -
控制流分析-自然循环识别
基本块:识别基本块:例子,下面第一个红色到第二个红色(不包括)之间的都是一个基本块。一共4个。从而可以绘制控制流图。控制流图控制节点的概念,比如2是3的控制,且是真控制,且是直接控制。控制关系的性质:上面的s是开始的那个基本块,即程序开始的地方。有了上述的控制的概念,有假设有如下的控制流图。我们可以画出控制树。控制树有了控制流图和控制树,我们可以识别一些循环。有如下发现。回边进一步要求:自然循环识别例如对于,下面的控制流图,(6,6)是回边,因为6控制6原创 2020-12-08 17:29:50 · 1241 阅读 · 0 评论 -
数据流分析:可用表达式的计算+活跃变量计算+到达定值。
引言什么是可用表达式和活跃变量?假设有如下代码:int main(){ int a=1,b=2,c=1; int x=a+b+b+b+b; int y=a+b+b+b+b; int z=a+b+b+b+b; return 0;}可用表达式:举例来说,a+b+b+b+b就是可用表达式,如果不加以优化,其将被计算三次,太浪费了,所以编译优化过程要求发现这个可用表达式。活跃变量:举例来说,a,b就是活跃变量,c是不活跃变量,前者叫做live,后者叫做dead。上面只是直观的理解了以原创 2020-12-08 16:07:25 · 1911 阅读 · 1 评论 -
编译原理四种文法的理解补充
如果你是学习,给定一个文法,判断是哪一个文法的话,那这篇不是讲这个,只是一点小小的理解补充。四种文法如下:补充:1.0型文法,即递归可枚举文法相当于图灵机是指:给定一个文法G,一个句子g,如果g属于G,那么可以在有限时间内判断完毕(即使存在递归,机器一直枚举,总有一天会结束),判断完毕就是算法执行结束,也叫图灵停机,所以才说描述能力和图灵机等价,计算性一样强。2.2型文法,即上下文无关...原创 2020-05-03 22:44:40 · 699 阅读 · 0 评论 -
正则表达式的使用
正则表达式(regular expression),是一个能够表达和描述一个字符串的组成规则特点的一个式子,用它我们可以去在一个很长的文本里找到能够匹配我们要求的单词。这个很多的开发语言都支持,自带了这个与处理匹配正则表达式相关的库。比如java.util.regex,其他还有js,linux系统等,js可以用在表单验证,比如验证网页注册的时候判断用户的邮箱和手机号等是否符合一个标准,然后在lin...原创 2019-04-11 19:05:22 · 263 阅读 · 1 评论