Se ci pensate, le architetture sono macchine astratte. Descrivono come dovrebbe comportarsi un grumo di silicio accuratamente fabbricato. La differenza tra le architetture e le macchine di Turing è più una questione di scala che un cambiamento fondamentale nell'approccio.
Il vantaggio delle macchine Turing è che esiste una serie di prove utili che sono molto facili da fare usando una macchina Turing. È semplice dimostrare che qualsiasi macchina abbastanza potente da simulare una macchina di Turing può risolvere qualsiasi problema che una macchina di Turing può (duh). Tuttavia, diventa più interessante quando si definisce una funzione calcolabile . Si scopre che ci sono molte definizioni compatibili di una funzione calcolabile. Se riesci a definire tutto il tuo comportamento come funzioni calcolabili, puoi essere simulato in una macchina di Turing.
Supponiamo quindi che tu abbia un'architettura che supporti direttamente i programmi in stile LISP e un'altra come l'x86 che è più procedurale. Il tuo amico afferma "LISP è più espressivo, quindi puoi scrivere programmi su questa macchina che non potresti mai scrivere sul tuo x86". Questo è brutale da contrastare (soprattutto perché probabilmente non conosci abbastanza LISP). Tuttavia, puoi abusare di diverse macchine astratte come la macchina di Turing:
- La tua macchina LISP può essere elegante, ma tutto ciò che può fare è riducibile al calcolo lambda. Il tuo amico annuisce avidamente. Il calcolo lambda è un po 'una cosa di culto per i programmatori funzionali.
- Il mio x86 può essere elegante, ma tutto ciò che può fare è riducibile a una macchina di registro. Ancora una volta, nessuna domanda dal tuo amico. I registri sono così fondamentali nella moderna teoria informatica!
- Qualsiasi macchina di registro può essere modellata come una macchina di Turing che simula quella macchina di registro. Ora il tuo amico si chiede perché stai tornando all'era del nastro adesivo.
- E anche la tua macchina per il calcolo lambda può essere ridotta a una macchina di Turing. * Il tuo amico obietta, ma li indichi alla tesi di Church-Turing e pendono la testa per la vergogna.
- Quindi la mia scatola x86 può fare qualsiasi cosa la tua macchina basata su LISP possa fare!
Ci sono, ovviamente, molti altri esempi. Conway's Game of Life ha dimostrato di essere Turing completo, il che significa che teoricamente potrebbe fare qualsiasi cosa il tuo computer possa fare. Il modo più semplice per farlo era costruire una macchina Turing in Life . Lo sollevo perché questo sarebbe un caso di quella che hai chiamato una macchina astratta trattata come un'architettura letterale! Potete immaginare quanto sarebbe difficile l'affermazione della calcolabilità in Life senza l'aiuto di modelli astratti (sono certo che diamine non sto modellando un x64, completo di sbirciatina nella cache, solo per dimostrare che la vita è calcolabile!)
Alla fine, la grande differenza tra architetture e macchine astratte è che le architetture si occupano solitamente delle prestazioni. Le architetture vogliono sapere quanto velocemente puoi fare qualcosa. Le macchine astratte tendono ad accontentarsi di sapere se è possibile. Considera il costruttore universale sviluppato per le macchine statali von Neuman. È stato sufficiente per dimostrare che l'UC poteva funzionare, a prescindere dal fatto che gli autori non avessero mai avuto abbastanza potenza di calcolo per poterlo effettivamente vedere.
Il prezzo pagato dalle architetture per dimostrare quanto velocemente possono funzionare è che spesso è tremendamente difficile provare che possono calcolare tutto . Per questo, le architetture tornano indietro e iniziano a usare macchine astratte.