關于狀態機的一個極度確切的描述是它是一個有向圖形,由一組節點和一組相應的轉移函數組成。狀態機通過響應一系列事件而“運行”。每個事件都在屬于“當前” 節點的轉移函數的控制范圍內,其中函數的范圍是節點的一個子集。函數返回“下一個”(也許是同一個)節點。這些節點中至少有一個必須是終態。當到達終態, 狀態機停止。
包含一組狀態集(states)、一個起始狀態(start state)、一組輸入符號集(alphabet)、一個映射輸入符號和當前狀態到下一狀態的轉換函數(transition function)的計算模型。當輸入符號串,模型隨即進入起始狀態。它要改變到新的狀態,依賴于轉換函數。在有限狀態機中,會有有許多變量,例如,狀態機有很多與動作(actions)轉換(Mealy機)或狀態(摩爾機)關聯的動作,多重起始狀態,基于沒有輸入符號的轉換,或者指定符號和狀態(非定有 限狀態機)的多個轉換,指派給接收狀態(識別者)的一個或多個狀態,等等。
傳統應用程序的控制流程基本是順序的:遵循事先設定的邏輯,從頭到尾地執行。很少有事件能改變標準執行流程;而且這些事件主要涉及異常情況。“命令行實用程序”是這種傳統應用程序的典型例子。
另一類應用程序由外部發生的事件來驅動——換言之,事件在應用程序之外生成,無法由應用程序或程序員來控制。具體需要執行的代碼取決于接收到的事件,或者它相對于其他事件的抵達時間。所以,控制流程既不能是順序的,也不能是事先設定好的,因為它要依賴于外部事件。事件驅動的GUI應用程序是這種應用程序的典型例子,它們由命令和選擇(也就是用戶造成的事件)來驅動。
Web應用程序由提交的表單和用戶請求的網頁來驅動,它們也可劃歸到上述類別。但是,GUI應用程序對于接收到的事件仍有一定程度的控制,因為這些事件要依賴于向用戶顯示的窗口和控件,而窗口和控件是由程序員控制的。Web應用 程序則不然,因為一旦用戶采取不在預料之中的操作(比如使用瀏覽器的歷史記錄、手工輸入鏈接以及模擬一次表單提交等等),就很容易打亂設計好的應用程序邏輯。
顯然,必須采取不同的技術來處理這些情況。它能處理任何順序的事件,并能提供有意義的響應——即使這些事件發生的順序和預計的不同。有限狀態機正是為了滿足這方面的要求而設計的。
有限狀態機是一種概念性機器,它能采取某種操作來響應一個外部事件。具體采取的操作不僅能取決于接收到的事件,還能取決于各個事件的相對發生順序。之所以能做到這一點,是因為機器能跟蹤一個內部狀態,它會在收到事件后進行更新。為一個事件而響應的行動不僅取決于事件本身,還取決于機器的內部狀態。另外,采取 的行動還會決定并更新機器的狀態。這樣一來,任何邏輯都可建模成一系列事件/狀態組合。