什麼是狀態機?

轉自知乎https://zhuanlan.zhihu.com/p/47434856

咱們程序員在看資料的時候,“狀態機”這個詞時不時的會出現一下。雖然咱們不是計算機科學家,但是對於這樣的計算機理論方面的詞彙還是要有基本理解的。

定義

我們先來給出狀態機的基本定義。一句話:

狀態機是有限狀態自動機的簡稱,是現實事物運行規則抽象而成的一個數學模型。

先來解釋什麼是“狀態”( State )。現實事物是有不同狀態的,例如一個自動門,就有 open 和 closed 兩種狀態。我們通常所說的狀態機是有限狀態機,也就是被描述的事物的狀態的數量是有限個,例如自動門的狀態就是兩個 open 和 closed 。

狀態機,也就是 State Machine ,不是指一臺實際機器,而是指一個數學模型。說白了,一般就是指一張狀態轉換圖。例如,根據自動門的運行規則,我們可以抽象出下面這麼一個圖。

 

 

自動門有兩個狀態,open 和 closed ,closed 狀態下,如果讀取開門信號,那麼狀態就會切換爲 open 。open 狀態下如果讀取關門信號,狀態就會切換爲 closed 。

狀態機的全稱是有限狀態自動機,自動兩個字也是包含重要含義的。給定一個狀態機,同時給定它的當前狀態以及輸入,那麼輸出狀態時可以明確的運算出來的。例如對於自動門,給定初始狀態 closed ,給定輸入“開門”,那麼下一個狀態時可以運算出來的。

這樣狀態機的基本定義我們就介紹完畢了。重複一下:狀態機是有限狀態自動機的簡稱,是現實事物運行規則抽象而成的一個數學模型。

四大概念

下面來給出狀態機的四大概念。

第一個是 State ,狀態。一個狀態機至少要包含兩個狀態。例如上面自動門的例子,有 open 和 closed 兩個狀態。

第二個是 Event ,事件。事件就是執行某個操作的觸發條件或者口令。對於自動門,“按下開門按鈕”就是一個事件。

第三個是 Action ,動作。事件發生以後要執行動作。例如事件是“按開門按鈕”,動作是“開門”。編程的時候,一個 Action 一般就對應一個函數。

第四個是 Transition ,變換。也就是從一個狀態變化爲另一個狀態。例如“開門過程”就是一個變換。

上面這四大概念,在使用狀態機思想來寫程序時候經常用到,參考 https://github.com/jakesgordon/javascript-state-machine 。

應用

最後再來說說狀態機的應用。狀態機是一個對真實世界的抽象,而且是邏輯嚴謹的數學抽象,所以明顯非常適合用在數字領域。可以應用到各個層面上,例如硬件設計,編譯器設計,以及編程實現各種具體業務邏輯的時候。

來舉個例子。街上的自動售貨機中明顯能看到狀態機邏輯。我們做一下簡化,假設這是一臺只賣2元一瓶的汽水的售貨機,只接受五毛和一塊的硬幣。初始狀態是”未付款“,中間狀態有”已付款5毛“,”已付款1塊“,”已付款1.5塊“,”已足額付款“,四個狀態。狀態切換的觸發條件是”投一塊硬幣“和”投5毛硬幣“兩種,”到達足額付款“狀態,還要進行餘額清零和彈出汽水操作。所以如果畫出一張完整的狀態轉換圖,也會是比較複雜的一張圖了。而實際中的售貨機對應的狀態機就會更加複雜了。

總之,狀態機應用範圍很廣,這裏就不展開了。插一句,跟狀態機類似的概念還有圖靈機,圖靈機就是計算機底層採用的計算模型。

總結

這就是對狀態機概念的一個通俗的簡述了。總結一下,狀態機不是實際機器設備,而是一個數學模型,通常體現爲一個狀態轉換圖。涉及到的相關概念是 State 狀態,Event 事件,Action 動作,Transition 轉換。狀態機是計算機科學的重要基礎概念之一,也可以說是一種總結歸納問題的思想,應用範圍非常廣泛。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章