Qualsiasi programma a thread singolo in esecuzione su una macchina con una quantità finita di memoria può essere modellato come una macchina a stati finiti. Uno stato particolare nella macchina a stati finiti rappresenterà i valori specifici di tutta la memoria rilevante: variabili locali, variabili globali, memoria heap, dati attualmente scambiati nella memoria virtuale, persino il contenuto dei file pertinenti. In altre parole, ce ne saranno molte stati in quel modello di stati finiti, anche per programmi abbastanza banali.
Anche se l'unico stato del programma è una singola variabile globale di un tipo intero a 32 bit, ciò implica almeno 2 ^ 32 (più di 4 miliardi) di stati. E questo non tiene nemmeno conto del contatore del programma e dello stack di chiamate.
Un modello di automa a spinta è più realistico per questo tipo di cose. È come un automa finito, ma ha un concetto integrato di pila. Tuttavia, non è proprio uno stack di chiamate come nella maggior parte dei linguaggi di programmazione.
C'è una spiegazione di Wikipedia , ma non impantanarti nella sezione definizione formale.
Gli automi push-down vengono utilizzati per modellare calcoli generali. Le macchine di Turing sono simili , ma IIRC non identiche, sebbene le loro capacità di calcolo siano equivalenti .
Grazie a Kevin Cline per aver segnalato l'errore sopra - come sottolinea anche Wikipedia , gli automi push-down sono più potenti delle macchine a stati finiti, ma meno potenti delle macchine di Turing.
Onestamente non so dove questo peto cervello è venuto da - io faccio sapere che contesto grammatiche sensibili sono più potenti di contesto di libero, e che le grammatiche sensibili al contesto non può essere analizzato utilizzando un semplice automa push-down. So anche che mentre è possibile analizzare qualsiasi grammatica libera dal contesto inequivocabile in tempo lineare, in genere ci vuole più di un automa (deterministico) di push down per farlo. Quindi, come potrei finire per credere che un automa a spinta sia equivalente a una macchina di Turing è bizzarro.
Forse stavo pensando a un automa push-down con qualche macchinario aggiuntivo aggiunto, ma sarebbe come contare un automa finito equivalente a un automa push-down (basta aggiungere e sfruttare uno stack).
Gli automi push-down sono importanti per l'analisi. Li conosco abbastanza bene in quel contesto, ma non li ho mai davvero studiati come modelli informatici di calcolo, quindi non posso fornire molti più dettagli di quanti ne abbia già.
È possibile modellare un singolo oggetto OOP come macchina a stati finiti. Lo stato della macchina sarà determinato dagli stati di tutte le variabili membro. Normalmente, si contano solo gli stati validi tra le chiamate al metodo (non durante). Ancora una volta, in genere avrai molti stati di cui preoccuparti: è qualcosa che potresti usare come modello teorico, ma non vorrai enumerare tutti quegli stati, tranne forse in un caso banale.
È abbastanza comune, tuttavia, modellare alcuni aspetti dello stato di un oggetto usando una macchina a stati finiti. Un caso comune è l'intelligenza artificiale per gli oggetti di gioco.
Questo è anche ciò che di solito viene fatto quando si definisce un parser usando un modello di automa push-down. Sebbene ci sia un insieme finito di stati in un modello di stato, questo modella solo una parte dello stato del parser: informazioni aggiuntive sono memorizzate in variabili extra insieme a quello stato. Questo risolve, ad esempio, il problema dei 4 miliardi di stati per un intero: non elencare tutti quegli stati, ma solo la variabile intera. In un certo senso fa ancora parte dello stato dell'automa push-down, ma è un approccio molto più gestibile che in effetti disegnare 4 miliardi di bolle di stato su un diagramma.