什么才是状态机?什么又是状态?

本文探讨了状态机的基本概念及其在软件开发、控制理论等领域的应用。作者通过对有限状态机的理解,分析了其在LUA、OpenGL等程序架构中的作用,并提出状态机不仅适用于算法设计,还可用于框架搭建。
AI助手已提取文章相关产品:

一关于状态机的认识     

最近我正在重新认识状态机的一些内容,这个东西很重要至少目前我知道无论是在硬件和软件上面都有状态机这个东西,而在控制上现代控制理论里也有状态方程的概念,并且几乎是现代控制理论的基石,另外运动控制理论里运动群的概念其本质上也是状态机。

      对于软件还有控制方面我多多少少都知道一些,可是非常可惜的是到底什么是状态机,硬件,软件及控制上侧重点都不一样,做运动控制软件理解状态机甚至比理解面向对象还要重要,为什么要这样说,做过运动控制的估计都见过PLC的梯形图程序,有多少人意识到这个横行运动控制领域几十年的东西是个状态机,呵呵又多少人能意识到,状态机曾被很多软件人员看成比较玄奥的东西,中国竟然有那么多人在天天从事着基于状态机的开发工作,呵呵又有多少人曾经想过,很多人都认为比较简单的PLC梯形图程序,为什么能完成运动控制里大部分的应用(认为梯形图程序简单的不包括我),估计意识到那是基于状态机编程的人不多。

      很多人都认为状态机是理论上的东西,离我们比较远,其实我想说的是,不是那样的。我们几乎每个人天天都在用状态机,生活当中你有取舍嘛!呵呵如果你有的话,有可能你就通过状态机进行选择呢。或许我认为这句话并不过分,这个世界有可能是基于对象的,但是这个世界的运动绝对是基于状态的,我们做了这么多年的程序。世界是由模块构成的,而描述模块的变化应当是状态。状态机不但能做算法,还能做框架。我最近正在看LUA的源码,可惜我几乎就LUA一提出状态机,大家就认为和词法分析有关。其实不是这样的。

      我所找到的状态机的定义是下面这个(有限状态机):

我的第一个问题:什么是状态机?


      FSM 定义:总的来说,有限状态机系统,是指在不同阶段会呈现出不同的运行状态的系统,这些状态是有限的、不重叠的。这样的系统在某一时刻一定会处于其所有状态中的一个状态,此时它接收一部分允许的输入,产生一部分可能的响应,并且迁移到一部分可能的状态。

       五个要素:状态,事件,条件,动作,迁移

       这个是纯软件的定义,或者我认为这个概念太笼统,控制上状态并不是离散的,所以有限状态机并不能和控制上的状态机进行统一,至于无限状态机,我还没有清楚的弄懂它的概念。

   

       我的第二个问题:什么是状态? 上面的概念其实太笼统。

二怎么基于状态机去做程序架构

      我总结了一下过去我所见过的一些程序架构,其中LUA和OPENGL的程序架构,我确信他们是基于状态机的程序架构,PLC的后台肯定也是,还有就是我所见过的我所在行业内的一些软件也是基于状态机的程序架构,另外很多协议的解析及生成原理,包括其设计也都是基于状态机的,不单单只有TCP/IP。诚然国内和国外在就状态机的认识上,国外比我们深刻的多。

       有兴趣的希望大家能一起学,多多交流,目前我主要是在看LUA的源码,希望能通过它的源码获得一些启示。至于运动控制上的状态机,是我必须要搞明白的,希望感兴趣的大家能多多交流。目前就运动控制方面的状态机设计,倒是总结了一些东西但是很不成熟。

您可能感兴趣的与本文相关内容

### 三级标题:安卓系统中的状态机概念及其作用 安卓系统中的状态机是一种基于状态模式的实现,主要用于管理对象的行为和状态之间的关系。状态机的核心在于通过状态的切换、添加和移除等操作,简化复杂逻辑的管理。在安卓系统中,状态机主要继承自 `StateMachine` 基类,该基类提供了状态操作的公共方法,例如状态切换、消息传递等[^1]。 状态机工作原理基于状态的分层结构和行为继承。子状态仅需处理自己感兴趣的消息,而将其他消息交给父状态处理,从而实现行为的继承。这种设计允许状态机在处理消息时,既能专注于特定状态的逻辑,又能继承父状态的通用行为[^3]。 在实现上,状态机通过一个 `Handler` 类(如 `SmHandler`)来处理消息和状态切换。`SmHandler` 包含状态栈、状态信息缓存区以及全局的 `StateMachine` 引用等关键组件。当接收到消息时,`handleMessage` 方法会调用 `processMsg` 处理消息,并通过 `performTransitions` 实现状态的切换[^5]。 状态机的广泛应用源于其在管理复杂状态逻辑上的优势。相比于简单的状态切换逻辑(如使用 `switch` 语句),状态机能够更清晰地组织状态之间的关系,减少状态切换逻辑的复杂性。这种设计尤其适用于需要处理大量状态和事件的场景,例如硬件控制电路设计和软件中的消息处理机制[^4]。 ### 三级标题:状态机的优势 状态机的优势在于其能够将复杂的控制逻辑分解为有限个稳定状态,并在每个状态上判断事件,从而将连续处理转化为离散数字处理。这种设计符合计算机的工作特点,同时由于状态机具有有限个状态,因此可以在实际工程中实现。尽管状态机状态是有限的,但它可以通过闭环系统实现对无限事务的处理[^4]。 在安卓系统中,状态机的这种特性使得开发者能够更高效地管理设备的状态变化,例如 Wi-Fi 模块的状态切换、蓝牙连接状态的管理等。通过状态机,开发者可以将复杂的逻辑分解为多个独立的状态,每个状态只需关注自身的处理逻辑,而无需关心其他状态的细节[^1]。 ### 三级标题:代码示例 以下是一个简化的代码示例,展示了状态机的基本结构: ```java private static class SmHandler extends Handler { private StateInfo mStateStack[]; // 当前状态栈 private int mStateStackTopIndex = -1; // 状态栈索引 private StateInfo mTempStateStack[]; // 状态缓存区 private HaltingState mHaltingState = new HaltingState(); // 状态挂起时使用 private QuittingState mQuittingState = new QuittingState(); // 状态退出时使用 private StateMachine mSm; // 全局状态机引用 private HashMap<State, StateInfo> mStateInfo = new HashMap<>(); // 状态信息存储 private State mInitialState; // 初始状态 private State mDestState; // 目标状态 @Override public final void handleMessage(Message msg) { processMsg(msg); // 处理消息 performTransitions(); // 状态切换 } } ``` ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值