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