Prev   Top   Next 

La nascita del dualismo Hardware-Software

Nella 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.

Fig.1: Una generica Macchina di Turing

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:

Fig.2: Macchina di Turing Universale

La dimostrazione dell'esistenza di una TM universale segna anche la nascita del dualismo hardware-software, cioè della contrapposizione fra ciò che è fisicamente realizzato e ciò che è descrizione formale delle operazioni da svolgere.
Da quanto detto sopra si nota come hardware e software nascono come equivalenti: quello che si può fare via software è anche realizzabile in hardware, e viceversa.

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:

Fig.3: Architettura di Von Neumann

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, object-oriented logico, parallelo/concorrente)

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).
Per far questo, non partiamo dalla definizione di macchina di Turing vera e propria, ma da quella di macchina di Turing Universale in cui abbiamo:

  • una memoria (il nastro) che contiene dati e programmi. Questi sono rappresentati e strutturati in un modo semplicissimo nelle MT. Ma si puo' pensare di poterle strutturare e rappresentare in altro modo, magari utilizzando il supporto di particolari procedure e strutture, se ce ne fosse bisogno.
  • delle operazioni che si possono fare sulle caselle del nastro. Nelle MT sono veramente ridotte all'essenziale. Possiamo pero' pensare di avere in generale un certo numero di operazioni che possiamo eseguire, senza restringerci a quelle essenziali delle MT.
  • un modo di recuperare gli argomenti delle operazioni. Nelle MT questo modo e' semplicemente leggere quel che c'e' sotto la testina. Pero' se vogliamo astrarre, possiamo pensare che, in generale, le operazioni possono recuperare gli argomenti in vari modi dalla memoria, utilizzando opportuni procedimenti e strutture.
  • un modo per determinare qual'e' la prossima istruzione da eseguire. In generale qualcosa che, servendoso magari di determinate strutture, determini qual'e' il flusso della sequenza di istruzioni da eseguire.
  • qualcosa che, utilizzando tutto cio' che e' a disposizione e coordinandolo opportunamente, permetta l'esecuzione dei programmi.
Sulla base di questo, nella prossima sezione daremo la nostra definizione di Macchina Astratta imperativa.
 Prev   Top   Next