La nascita del dualismo Hardware-SoftwareNella concezione originale di Turing, i programmi per le Macchine di Turing (TM) erano parte integrante del controllo finito; per ogni problema che si volesse risolvere, bisognava definire un'opportuna TM, che poteva prendere in input i dati da elaborare, ma non poteva essere riprogrammata per eseguire un calcolo diverso da quello per cui era stata pensata.
Ciò era in accordo con l'intento iniziale di Turing, che non era quello di realizzare fisicamente le sue macchine, ma quello di determinare quale fosse l'insieme di funzioni per cui era possibile, in linea di principio, costruire un'apposita TM. Successivamente Turing, considerando il fatto che una macchina di Turing si puo' rappresentare attraverso una stringa di simboli (basta dare una rappresentazione lineare della tabella che descrive la funzione di transizione, per esempio scrivendo una dopo l'altra le quintuple che corrispondono alle varie caselle della tabella di transizione), dimostrò che è possibile definire una Macchina di Turing Universale che, dati in ingresso la descrizione di una TM e il relativo input, simula il comportamento della prima: nasce così l'idea di una vera e propria macchina programmabile:
La dimostrazione dell'esistenza di una TM universale segna anche la nascita del
dualismo La nozione di MT universale e' concettualmente alla base del modello di architettura di Von Neuman (architettura stored program) che prende il nome da chi la propose, il matematico John Von Neumann. In tale tipo di architettura la CPU (Central Processing Unit) e' preposta all'interpretazione del programma memorizzato in un'altra componente fisica, la RAM (Random Access Memory). Schematicamente:
Già in questa architettura sono presenti in nuce tutte quelle componenti presenti nella maggior parte delle architetture sviluppate fino ai giorni nostri.
E' possibile fornire una descrizione astratta e, volendo, piu' dettagliata dei moduli che la compongono (per esempio analizzando le funzionalità della CPU si possono identificare ulteriori componenti al suo interno). Il nostro obiettivo nelle presenti note e' proprio quello arrivare ad una definizione del concetto di Macchina Astratta Imperativa, una descrizione cioe' il piu' generale possibile delle componenti che formano le architetture basate sul modello di Von Neuman, alla cui base abbiamo visto esserci il modello computazionale delle Macchine di Turing. Si noti come non sia possibile fornire una definizione di Macchina Astratta in generale, poiche' alla base di una Macchina Astratta c'e' sempre un particolare Modello Computazionale. Le Macchine Astratte basate sul modello di Turing vengon dette imperative poiche' alla base di tale modello c'e' il concetto di comando (istruzione). Vedremo in seguito come esista una precisa corrispondenza tra Macchine Astratte e linguaggi di programmazione. I linguaggi di programmazione imperativi sono appunto quelli corrispondenti appunto a macchine astratte imperative.
Appare abbastanza evidente come, partendo
da differenti modelli computazionali,
si possa pervenire a differenti nozioni di Macchina Astratta
(per esempio: funzionale, L'attenzione che noi riserveremo alle macchine astratte imperative non e' tanto dovuto alla "migliore qualita'" del modello di Turing rispetto ad altri, ma al fatto che la stragrande maggioranza delle architetture concrete sono basate sul modello di Von Neuman e questo e' dovuto a motivazioni puramente di carattere tecnologico.
Nella definizione di macchina di Turing, essendo questa un modello computazionale,
tutto e' ridotto al minimo necessario e descritto in modo molto formale.
Se vogliamo arrivare ad una definizione di schema di macchina per calcolare
basato su questo modello occorre isolare le "componenti" della macchina di Turing
e descriverle in modo piu' generale possibile (attraverso un procedimento
di "astrazione"). Quello che otteniamo non e' piu' un modello computazionale, ma
uno schema in cui poter inserire tutte le macchine basate sul modello computazionale
imperativo (anche quelle che non calcolano tutte le funzioni calcolabili).
|