A passeggio con l’informatica – 17. Bit che si riproducono

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