Sesta puntata del nostro viaggio
Con questo post completiamo il discorso sugli automi (termine tecnico che si usa nell’informatica per denotare i computer), cioè i meccanismi che eseguono le elaborazioni di cui abbiamo bisogno.
Nel post precedente abbiamo descritto una versione molto semplice di macchina a registri (MR), un automa che nonostante la sua semplicità ho lo stesso potere computazionale dei computer che vengono quotidianamente usati.
Dobbiamo adesso parlare del linguaggio che la MR è in grado di “comprendere”, cioè descrivere quali istruzioni essa è in grado di eseguire. Sono possibili tante scelte, ma per i nostri scopi divulgativi possiamo rimanere al minimo necessario per poter esprimere qualunque computazione. A questo scopo sono necessarie solo le quattro istruzioni presentate in dettaglio nel seguito che, nonostante costituiscano tutto il linguaggio che possiamo usare per comandare la MR, le danno lo stesso potere computazionale di qualunque altro computer.
- L’istruzione Fine è quella che arresta il funzionamento della MR, cioè è quella che fa percorrere la transizione verso lo stato “Fine” all’automa a stati finiti che descrive il comportamento dell’Unità di Controllo della MR.
- L’istruzione Incrementa X è quella che aumenta di 1 il valore contenuto nella cella di memoria di indirizzo X. Nel seguito diremo “cella X” per indicare in modo più sintetico la “cella di memoria di indirizzo X”.
- L’istruzione Vai X è quella che fa sì che la prossima istruzione che eseguirà la MR sarà quella all’indirizzo X. Questo viene ottenuto scrivendo il valore X dentro IC.
- L’istruzione X Dim o Vai Y è composta di due parti. Dapprima si verifica se il contenuto della cella il cui indirizzo è scritto dentro la cella X è maggiore di 0. Se questo è vero allora il contenuto della cella il cui indirizzo è scritto dentro la cella X viene diminuito di 1. Se questo non è vero si scrive invece il valore Y dentro IC (e quindi al passo successivo la MR eseguirà l’istruzione contenuta nella cella Y).
Si invita il lettore a prestare attenzione al fatto che nell’istruzione “Incrementa X” è il contenuto della cella X che viene modificato, mentre nell’istruzione “X Dim o Vai Y” viene manipolato non il contenuto della cella X ma il contenuto della cella il cui indirizzo è scritto nella cella X.
Presentiamo adesso nella parte sinistra della seguente tabella il programma che risolve il problema enunciato due post fa (cioè contare quanti “2” ci sono in una sequenza), mostrando nella parte destra un’istanza (cioè, uno specifico esempio) del problema da risolvere.
Abbiamo assunto che IC sia la cella di indirizzo 0 e che il valore iniziale dentro di essa sia 1, cioè che il programma da eseguire sia memorizzato a partire dalla cella di memoria di indirizzo 1. Abbiamo altresì assunto che i dati del problema, cioè la sequenza di valori per la quale bisogna calcolare quanti sono i valori “2”, sia nella memoria a partire dalla cella di indirizzo 12 (si tratta, per quest’istanza, di una sequenza di sei valori, di cui l’ultimo è “0” e che contiene tre “2”). La cella di memoria di indirizzo 10 serve per contare quanti valori “2” si sono finora incontrati e quindi conterrà, quando la MR si arresta, il valore di conteggio desiderato, mentre la cella di memoria di indirizzo 11 serve per poter scandire la sequenza di valori da processare. L’idea che il programma realizza è quella di decrementare per due volte di seguito il contenuto della cella il cui indirizzo è scritto nella cella 11. Se dopo il primo decremento il valore arriva a zero allora la cella non conteneva “2” e non si incrementa il contatore nella cella 10. Altrimenti, conteneva “2” e il contatore viene incrementato. In entrambi i casi si passa a considerare il successivo valore della sequenza.
Se il lettore avrà la pazienza di eseguire passo dopo passo, in modo meccanico, le istruzioni del programma proposto, potrà appunto verificare che viene calcolato il valore desiderato (tre, per questa istanza). Si suggerisce anche di provare l’esecuzione del programma con altre sequenze di valori in ingresso, così da convincersi del fatto che esso risolve in modo completamente meccanico qualunque istanza del problema considerato.
Rimane un ultimo aspetto da discutere. Come fa l’automa a “capire” cosa vuol dire, per esempio, l’istruzione “Incrementa X” o le altre istruzioni? Come abbiamo visto per l’istruzione “Vai X”, il suo significato è dato dalle azioni che il progettista dell’automa stesso ha associato all’istruzione data. Nel caso di “Vai X” il suo “significato” è quindi dato dal fatto che quando essa viene incontrata nel corpo del programma il valore di X viene scritto dentro IC. A questo scopo, in effetti, non c’è bisogno che nel programma ci sia scritto “Vai X”, basta scrivere un breve codice numerico, ad esempio 10, e far sì che questo, quando viene “eseguito”, attivi i meccanismi fisici (normalmente, circuiti elettronici) che realizzano il comportamento desiderato. Seguendo questa linea si ottiene un programma scritto interamente in codifica binaria: è il livello cosiddetto del linguaggio macchina, cioè quel linguaggio che la macchina fisica, cioè la realizzazione fisica dell’esecutore è, con buona approssimazione, in grado di comprendere ed eseguire direttamente. Si può pensare, per fare un’analogia meccanica, che sia il livello al quale agiscono le leve e ruote dentate di un oggetto meccanico. Il programma presentato inizialmente è invece al livello cosiddetto del linguaggio simbolico. Per ora accenniamo soltanto che il passaggio da un programma scritto in un linguaggio simbolico alla sua versione in linguaggio macchina può, e questo non dovrebbe sorprenderci, essere eseguito in modo del tutto meccanico da parte di appositi programmi di traduzione, che discuteremo più avanti, quando riprenderemo questo discorso quando parleremo di virtualizzazione.
( I post di questa serie sono basati sul libro dell’Autore La rivoluzione informatica: conoscenza, consapevolezza e potere nella società digitale, al quale si rimanda per approfondimenti. I lettori interessati al tema possono anche dialogare con l’Autore, su questo blog interdisciplinare. )