最近一直在忙软件设计师考试,由于没有参加自考,不像自考人员对于软考内容接受起来那么容易。其中第一个让自己头疼的就是FSM(有限状态自动机),视频中是针对题来讲的,而软考书中又都是一些专业术语、一些晦涩的数学式子。软考讲课小组中我又负责讲这部分内容,哎呀!通过查一些资料,理解好多了。
一、专业性的解释(百度百科)
有限状态自动机(FSM "finite state
machine" 或者FSA "finite state automaton" )是为研究有限内存的计算过程和某些语言类而抽象出的一种计算模型。有限状态自动机拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。有限状态自动机可以表示为一个有向图。有限状态自动机是自动机理论的研究对象。
二、闲言碎语
参加自考的童鞋应该对FSM不陌生,因为编译原理中都学了。其实编译器就是用了FSM来做词法分析的。对于这一个初次接触的人,就没那么容易了。FSM的概念在网上一搜可以搜一大堆出来,但估计相当一部分人也看不大明白。
现实生活中,状态是随处可见的,并且通过不同的状态来做不同的事。比如冷了加衣服;饿了吃饭;困了睡觉等。这里的冷了、饿了、困了是三种不同的状态,并且根据这三个状态的转变驱动了不同行为的产生(加衣服、吃饭和睡觉)。
三、再看FSM是什么
所谓有限状态机,就是由有限个状态组成的机器。再看上面举到的例子:人就是一部机器,能感知三种状态(冷、饿、困)。由于气温降低所以人会觉得冷;由于到了吃饭的时间所以觉得饿;由于晚上12点所以觉得困。状态的产生以及改变都是由某种条件的成立而出现的。不考虑FSM的内部结构时,它就像是一个黑箱子,如下图:
左边是输入一系列条件,FSM通过判定,然后输出结果。
四、FSM的处理流程
上图FSM屏蔽了判定的过程,事实上FSM是由有限多个状态组成的,每个状态相当于FSM的一个部件。比如要判断一个整数是否偶数,其实只需要判断这个整数的最低位是否为0就行了,
对数字5来说,它的二进制表示为0101。二进制只能为0或1,所以二进制的字符集合为:{0, 1},对应到FSM来说,就是有2种状态,分别为S0和S1。如果用FSM来处理,它总是从左边读取(当然也可以把FSM反过来),也就是从0101最左边那位开始输入:首先输入左边第一位0,停留在S0状态,然后输入第二位1,转到S1状态,再输入第三位0,则又回到S0状态,最后输入是后一位1则又回到S1状态。如下图所示:
上图忽略了一个很重要的细节,就是0和1是怎么输入的。状态S0和状态S1是FSM里的2个小部件,它们分别关联了0和1(也可以说是特定的输入语句),所以只能通过FSM来输入。当FSM接收到0时,它就交给S0去处理,这时S0就变成当前状态,然后对S0输入1,S0则将它交给S1去处理,这时S1就变成当前状态。如此这般,FSM持有有限多个状态,它可以接收输入并执行状态转移(比如将最初的0交给S0去处理)。状态S0和状态S1也是如此。
但是为什么最开始FSM接收输入的0后会交给S0去处理呢?这是因为FSM的默认状态是S0。就像是有一台电视机,它总是有默认的频道的,您一打开电视机就可以看到影像,即使是满屏的雪花点。而且可以在按下电视机的开关前预先调整频道,之后也可以调整频道。
五、再举个例子
文章开头部分已经提及过,编译器中的词法分析就是能通过FSM完成的,那么怎么完成的?标识符就是词法分析的一项内容。C语言中对标识符的规定为由“_”或以字母开头的由“_”、字母和数字组成的字符串,该标识符的定义可以表示为下图中的内容:
图中上方的是正规表达式,式中的a代表字母符{A,…,Z,a…,z},d代表数字字符{0,1,…,9}。图中下方是对应的FSM。通过编译器中的此自动机就能完成对词法的分析。
目前自己只能理解表面上的这些内容,讲得也比较粗浅,请拍砖,多多指导!