Introduction #
有限状态机 (finite-state machine, FSM) 是一种抽象机器,在任何给定时间内都可以处于有限个状态中的一个状态。FSM 可以根据某些外部输入从一种状态转换到另一种状态,从一种状态转换到另一种状态称为转换。FSM 是由其状态列表、初始状态和每个转换的条件定义的。
状态是对等待执行转换的系统状态的描述。
Example #
下面是一个简单状态机的直观描述。 这是一个简单的开关模型。
- 它由 “开 “和 “关 “两种状态组成。因此,这台机器在任何时刻都可以处于这两种状态中的一种。换句话说,状态之间的转换是瞬时的。
flick
事件会导致机器在不同状态间转换。 - 当机器进入
on
状态时,会产生一个副作用。一盏灯被打开。 - 当机器退出
on
状态时,会产生另一个副作用。一盏灯被关闭。 - 这个简单的状态机就相当于一个布尔变量,来控制某件事情的
on
与off
。
What is state anyway? #
程序状态是程序中所有变量及其在任意时间点上的值的集合 Wikipedia 。
一个程序或软件组件有五个独立变量,每个变量都可能为真或假,那么理论上它可以处于 $2^5=32$ 种状态中的任何一种。然而,程序经常会出现 invalid 状态,而在传统软件中,变量都会经过仔细检查和处理,以避免出现这些 invalid 状态。
Relationship with statecharts #
理解状态机几乎等同于理解 statecharts。 在许多方面,statecharts是状态机的 “大哥”,旨在克服状态机的一些局限性。statecharts 本质上是一种状态机,它允许任何状态以分层的方式包含更多的状态机。这是为了克服状态机固有的一些局限性。
Abstract machine vs run-time #
抽象机器本身(如状态机的绘制或代码)与特定抽象机器更具体的运行时执行之间必须作出重要区分。这种区别类似于类(抽象定义)和对象(具体实例化)之间的区别。同样,对于单个抽象机器来说,可能有许多执行,就像任何特定类往往有许多实例一样。
术语 “statechart”、“state machine “和 “FSM “通常既指抽象形式,也指运行时形式,尽管运行时形式有时带有限定词 “run” 或 “execution”,如 “state machine execution” 或 “statetchart run”。
abstract state machine 是一种软件组件,它定义了一组有限的状态:
- 有一种状态被定义为 initial state。当机器开始执行时,它会自动进入这种状态。
- 每个状态都可以定义机器进入或退出该状态时发生的操作。操作通常会产生 side effects。
- 每个状态都能定义触发转换的 transition。
- transition 定义了机器如何对事件做出反应,即退出一种状态并进入另一种状态。
- transition 可以定义过渡发生时的 actions。动作通常会产生 side effects。
在运行状态机时,会执行这个抽象状态机。首先,状态机进入initial state
。 然后,一旦有事件发生,就会立即传递给状态机。 当事件发生时
- 将根据当前状态的转换对事件进行检查
- 如果某个转场与事件相匹配,该转场就会发生
- 由于 transition 发生,状态 exited 或 entered,并执行相关操作
- 机器立即进入新状态,准备处理下一个事件。