Diciottesima puntata del nostro viaggio
Nel precedente post (Dati o programmi? Questo è il problema) abbiamo discusso come, a livello del linguaggio di programmazione che la macchina fisica è in grado di eseguire direttamente attraverso i suoi circuiti elettronici, non vi sia una distinzione intrinseca tra cosa costituisce un’istruzione e cosa un dato. Solo le istruzioni dell’Unità di Controllo della macchina a registri, che sono quelle poste all’interno dei cerchi della seconda figura del post n. 4 (Come funziona un computer), sono intrinsecamente delle istruzioni. Quello che comunemente chiamiamo “programma” (indipendentemente se sia in linguaggio simbolico o in linguaggio macchina) è, al livello fisico direttamente eseguibile, solo una sequenza di bit zero e uno. Questo costituisce un vantaggio, perché ci permette di elaborare i programmi trattandoli semplicemente come dati, ma può costituire anche una debolezza, se delle sequenze di bit che erano state considerate dei dati vengono invece interpretate come istruzioni e sono eseguite. Quest’ultimo è infatti il meccanismo con cui i virus informatici si diffondono: in assenza di opportune contromisure, vengono trasferiti da un computer a un altro come se fossero dei dati e poi vengono eseguiti.
Questa natura duale posseduta dalle sequenze di bit, insieme al fatto che – proprio a causa di tale dualità – una stessa sequenza di bit può essere interpretata in entrambi i modi e può quindi manipolare se stessa, conferisce all’informatica un potere di riproduzione di cui l’unica altra manifestazione esistente in natura è quella posseduta dai sistemi biologici.
Illustriamo questo potere di riproduzione con un automa molto semplice. Descrivo prima il suo semplice repertorio di istruzioni e poi presento un programma che, nonostante la semplicità dell’automa, è in grado di riprodurre se stesso.
La prima istruzione del repertorio è un’istruzione di assegnazione del tipo
P=100;
che assegna a P il valore 100. Notiamo che ogni istruzione è terminata da un punto e virgola (;). Questo è solo un esempio di uso dell’istruzione, un altro potrebbe essere
Q=3;
che assegna a Q il valore 3. Abbiamo poi un’istruzione di stampa del tipo
stampa P;
che, avendo eseguito l’istruzione di assegnazione precedentemente descritta, produce come risultato
100
Chiaramente l’istruzione «stampa Q;» avrebbe invece prodotto «3»: osservate che in questo caso abbiamo usato le doppie parentesi angolari aperte («) e chiuse (») per denotare con precisione nel corpo del testo le istruzioni di cui parliamo o il loro effetto, mentre prima le avevamo presentate ognuna isolata su una riga.
L’automa possiede anche una variante di tale istruzione di stampa, cioè
stampa “P”;
la cui esecuzione non produce più la stampa del valore eventualmente assegnato a P ma produce come risultato letteralmente quanto è contenuto tra i doppi apici, cioè
P
(analogamente «stampa “Q”;» produrrebbe «Q»). Osserviamo a questo punto che l’istruzione di stampa può avere più oggetti da stampare, come per esempio accade con
stampa P Q;
che produce
100 3
e con
stampa “P=” P;
che invece produce
P=100
Infine, l’automa possiede una convenzione di ripetizione, in base alla quale, ad esempio
3|X;
costituisce un modo abbreviato di rappresentare
X; X; X;
Abbiamo pertanto che il programma (fatto da due istruzioni che per semplicità scriviamo sulla stessa riga)
P=3|X; stampa P;
produce in uscita
X; X; X;
mentre il programma
P=3|X; stampa “P=” P;
produce in uscita
P=X; X; X;
Siamo pronti a questo punto a presentare e discutere il programma che riproduce se stesso, che è costituito da queste due sole istruzioni, presentate di seguito sulla stessa riga
P=2|stampa “P=2|” P; stampa “P=2|” P;
Determiniamo cosa fa l’automa quando esegue questo programma. Con la prima istruzione assegna a P – in base alla convenzione di ripetizione sopra descritta – il valore «stampa “P=2|” P; stampa “P=2|” P;». Con la seconda istruzione produce in uscita il valore «P=2|» seguito dal valore appena assegnato a P, cioè
P=2|stampa “P=2|” P; stampa “P=2|” P;
L’esecuzione del programma ha quindi prodotto in uscita una copia esatta di se stesso! Notate che lo spazio tra le due istruzioni nel primo caso (il testo del programma) è maggiore del secondo (il risultato della sua esecuzione) solo per motivi di chiarezza tipografica.
Abbiamo ottenuto un comportamento che, a livello astratto, è esattamente lo stesso comportamento che realizza una sequenza di DNA durante la replicazione, processo chiave per la riproduzione biologica. Nel nostro caso, otteniamo la “riproduzione dei bit” e questo aspetto dell’informatica costituisce forse il più importante dei suoi apporti concettuali al panorama della cultura scientifica.
(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, su cui i post vengono ripubblicati a partire dal terzo giorno successivo alla pubblicazione in questa sede. )