Cos’è una macchina a stati? – Statecharts
Che cos’è una macchina a stati?
Wikipedia definisce una macchina a stati finiti (FSM) come:
una macchina astratta che può essere esattamente in uno di un numero finito di stati in qualsiasi momento. L’FSM può passare da uno stato all’altro in risposta ad alcuni input esterni; il passaggio da uno stato all’altro è chiamato transizione. Un FSM è definito da una lista dei suoi stati, il suo stato iniziale, e le condizioni per ogni transizione.
E ancora:
Uno stato è una descrizione dello stato di un sistema che è in attesa di eseguire una transizione.
Una macchina a stati è anche una rappresentazione visiva di una tale macchina astratta.
Esempio
Ecco una rappresentazione visiva di una semplice macchina a stati. È un modello di un semplice interruttore on/off.
Un semplice interruttore on/off con due stati.
Alcune osservazioni su questa macchina.
- È composta da due stati, “on” e “off”. Questa macchina può quindi essere esattamente in uno dei due stati in qualsiasi momento. In altre parole, le transizioni tra gli stati sono istantanee.
- L’evento “flick” causa la transizione tra gli stati.
- Quando la macchina entra nello stato “on”, si verifica un effetto collaterale. Una luce si accende.
- Quando la macchina esce dallo stato “on”, si verifica un altro effetto collaterale. Una luce viene spenta.
Questa semplice macchina a stati è paragonabile a una variabile booleana – che può essere vera o falsa – che controlla l’on-ness di qualcosa.
Che cos’è lo stato comunque?
Lo stato del programma è l’insieme di tutte le variabili in un programma e i loro valori in qualsiasi momento (vedi Wikipedia). Un programma o un componente software che ha cinque variabili indipendenti, ognuna delle quali potrebbe essere vera o falsa, allora potrebbe in teoria essere in uno qualsiasi dei 32 stati (2 alla potenza di 5 = 32). Tuttavia, un programma avrà spesso degli stati non validi, e nel software tradizionale, le variabili sono accuratamente controllate e manipolate in modo tale che questi stati non validi non accadano.
Una macchina a stati è un modo alternativo di modellare lo stato del programma: Invece di definire variabili indipendenti, una macchina è creata specificamente per gestire quali stati sono possibili, e quando una macchina è in un dato stato, quale stato successivo è permesso. Queste cinque variabili booleane indipendenti sono sostituite da una singola macchina a stati che intrinsecamente può essere solo in stati validi.
Relazioni con gli statechart
Comprendere le macchine a stati è quasi lo stesso che comprendere gli statechart. In molti modi, gli statechart sono il “fratello maggiore” delle macchine a stati, progettati per superare alcune delle limitazioni delle macchine a stati. Uno statechart è essenzialmente una macchina a stati che permette ad ogni stato di includere più macchine, in modo gerarchico. Questo per superare alcune delle limitazioni che sono inerenti alle macchine a stati.
L’obiettivo primario di statecharts.github.io è quello di aiutarvi a capire gli statechart. La comprensione delle macchine a stati è un piacevole effetto collaterale. Cos’è uno statechart?
Macchina astratta vs run-time
Un’importante distinzione deve essere fatta tra la macchina astratta stessa (ad esempio il disegno di una macchina a stati, o il codice) e la più concreta esecuzione run-time di una particolare macchina astratta. Questa distinzione è simile alla differenza tra una classe (definizione astratta) e un oggetto (istanziazione concreta). Allo stesso modo, per una singola macchina astratta, ci possono essere molte esecuzioni, proprio come ci sono spesso molte istanze di qualsiasi classe particolare.
I termini “statechart”, “state machine” e “FSM” sono spesso usati per indicare sia la forma astratta che quella run-time, anche se la forma run-time ha talvolta il qualificatore “run” o “execution”, come in “state machine execution” o “statetchart run”.
Una macchina a stati astratta è un componente software che definisce un insieme finito di stati:
- Uno stato è definito come lo stato iniziale. Quando una macchina inizia l’esecuzione, entra automaticamente in questo stato.
- Ogni stato può definire azioni che avvengono quando una macchina entra o esce da quello stato. Le azioni avranno tipicamente effetti collaterali.
- Ogni stato può definire eventi che innescano una transizione.
- Una transizione definisce come una macchina reagirebbe all’evento, uscendo da uno stato ed entrando in un altro stato.
- Una transizione può definire azioni che avvengono quando la transizione avviene. Le azioni avranno tipicamente effetti collaterali.
Quando si “esegue” una macchina a stati, questa macchina a stati astratta viene eseguita. La prima cosa che accade è che la macchina a stati entra nello “stato iniziale”. Poi, gli eventi vengono passati alla macchina non appena accadono. Quando accade un evento:
- L’evento viene controllato rispetto alle transizioni dello stato corrente.
- Se una transizione corrisponde all’evento, quella transizione “accade”.
- In virtù di una transizione che “accade”, gli stati sono usciti ed entrati e le relative azioni sono state eseguite
- La macchina si trova immediatamente nel nuovo stato, pronta ad elaborare l’evento successivo.
Altre letture
- Cos’è un diagramma a stati? – Costruire sulla conoscenza delle macchine a stati per
- Una macchina a stati di esempio – Spiegare alcuni concetti di statechart costruendo sulla semplice macchina a stati “on off”.