Provo a risponderti anche se non sono la persona più titolata a farlo.
Ho studiato e sto studiando gli automi a stati finiti nel corso di linguaggi formali e traduttori. In effetti come hai potuto notare, questi automi vengono insegnati come base torica per il riconoscimento di stringhe e, di conseguenza, per i traduttori ed i compilatori.
Li ho trovati anche in un libro sul VHDL, applicati alla logica ed alle macchine a stati finiti.
ATTENZIONE: io sono un manovale e quindi prendi quello che ti dico "as is". Questo è semplicemente uno dei metodi che uso per scrivere programmi.Io uso questa tecnica di programmazione perché la trovo comoda e veloce. In buona sostanza prendo carta e matita e disegno il funzionamento della macchina evidenziando gli stati. Gli stati sono collegati uno all'altro mediante degli archi, delle linee insomma, che indicano il perché l'esecuzione si sta spostando da uno stato all'altro.
Faccio un esempio con un robottino. Siamo nello stato in cui il robottino sta avanzando. Questo vuol dire che è passato attraverso uno stato che ha azionato il motore (io li tengo molto staccati gli stati, a volte ne faccio alcuni che potrebbero sembrare superflui ma mi trovo bene così) ed è passato in uno stato di attesa dal quale può uscire per due condizioni: ha raggiunto il punto desiderato o ha incontrato un ostacolo.
Questo è a grandi linee la macchina a stati.
Il programma in C che implementa questa macchina è il seguente:
- Codice: Seleziona tutto
int16:t posizione;
...
posizone = n;
uint8_t stato = 0;
for(;;)
{
switch(stato)
{
case 0:
stato = 5;
break;
case 1:
motoreOn();
stato = 2;
break;
case 2:
if (incontratoOstacolo()) { stato = 3; break; }
if (getPosizione() == posizione) { stato = 4; break; }
break;
case 3:
motoreOff();
segnalaErrore();
stato = 5;
break;
case 4:
motoreOff();
stato = 5;
break;
case 5:
if (getComando() == MUOVI) { stato = 1; break; }
break;
}
}
Come puoi notare il lavoro più grosso è quello di scrivere un buon diagramma, ricco di particolari, e con tutti i riferimenti agli stati ed alle operazioni che deve eseguire.
Tradurlo poi in un programma in C è un qualcosa di meccanico. Se non ci sono errori di sintassi e la logica del diagramma è fatta bene il programma funziona al primo colpo.
L'ultimo lavoro che ho fatto è un'apparecchiatura con una logica di funzionamento non banale. Prevede diversi modi di funzionamento: autotest, programmazione interattiva dei parametri di funzionamento, funzionamento in modalità utente. Tutti questi modi fanno riferimento ad altrettante macchine a stati ed alcuni di questi modi devono poter essere interrotti in modo asincrono da alcuni eventi esterni.
Ho passato tre giorni e consumato parecchia carta nel disegnare i diagrammi. poi ho implementato le varie funzioni e le ho provate per verificarne il funzionamento, infine ho tradotto i diagrammi in quello "switch" lunghissimo in due o tre ore.
Ho scaricato il programma nell'apparecchiatura e questa ha iniziato a funzionare in modo perfetto.
E' chiaro che i diagrammi sono parte integrante del programma, senza i diagrammi è molto difficile capire cosa fa la macchina, ma un bel chissenefrega lo metto volentieri, anche perché ho risparmiato un mucchio di tempo.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.