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.
--Versione originale pubblicata da "Osservatorio sullo Stato digitale" dell'IRPA - Istituto di Ricerche sulla Pubblica Amministrazione il 29 gennaio 2025.
Nessun commento:
Posta un commento
Sono pubblicati solo i commenti che rispettano le norme di legge, le regole della buona educazione e sono attinenti agli argomenti trattati: siamo aperti alla discussione, non alla polemica.