Pagine

sabato 25 gennaio 2025

A passeggio con l'informatica #16 – Dati o programmi? Questo è il problema

di Enrico Nardelli

In questo ultimo post dedicato alla presentazione dei concetti fondamentali dell’informatica iniziamo ad affrontare quello che forse è il contributo più rilevante da un punto di vista culturale apportato da questa disciplina alla visione del mondo.

I concetti di algoritmo, linguaggio, automa, che – insieme agli altri – abbiamo esplorato nei precedenti post di questa serie, fanno parte del bagaglio concettuale di un informatico e sono gli strumenti intellettuali che un informatico usa per modellare e interpretare il mondo. Essi possono essere impiegati con successo per fornire descrizioni complementari a quelle fornite da altre scienze, per esprimere il punto di vista informatico sui fenomeni, arricchendo così la capacità di comprendere la realtà intorno a noi.

Nel post n.5 (Come istruire un computer) avevamo presentato un semplice programma scritto in linguaggio simbolico per una semplicissima macchina a registri (MR). Avevamo poi commentato che tale automa, per poter eseguire effettivamente il programma ha bisogno di una sua traduzione in linguaggio macchina. Come abbiamo infatti spiegato nel precedente post (Dalla virtualizzazione al cloud), il livello della macchina fisica è l’unico che può concretamente eseguire i programmi e ha bisogno di un linguaggio al suo livello (si veda la figura del post).

Nella figura sottostante, dove a sinistra vi sono le istruzioni e a destra i dati, viene presentata la versione in linguaggio macchina del programma presentato nel post n.5.

Rimandando alla sezione 4.2.2 del volume La rivoluzione informatica per una spiegazione di dettaglio di come tale programma viene ottenuto dalla versione in linguaggio simbolico, qui lo prendiamo così com’è perché ci serve per iniziare a discutere un concetto molto rilevante dell’informatica, cioè la natura duale che ha la rappresentazione per l’esecutore.

Infatti, ciò che c’è scritto nelle celle di memoria della MR non ha un’intrinseca caratterizzazione come dato o come istruzione. Nell’esempio di programma in linguaggio simbolico per MR presentato nella figura del post n.5 (Come istruire un computer) abbiamo distinto la zona di memoria con il programma e quella con i dati a solo scopo didattico. In quell’esempio noi, in quanto esseri umani, possiamo distinguere se ciò che leggiamo in una cella è un’istruzione o un dato, ma dal punto di vista della macchina stessa questa distinzione in realtà non esiste.

Consideriamo la seconda figura del post n.4 (Come funziona un computer): in tale figura, c’è scritto che la MR “legge l’istruzione all’indirizzo IC”, quando in realtà la MR sta leggendo semplicemente una sequenza di “0” e “1” e non ha – diversamente da noi esseri umani – alcuna consapevolezza che ciò che legge sia un’istruzione. Soltanto l’azione espressa in basso nella stessa figura, “esegui istruzione letta”, assegnerà l’effettiva natura di istruzione a quella sequenza binaria.

Ciò si capisce bene nella versione in linguaggio macchina del programma mostrato nella figura qua sopra. Infatti, in tale figura, nella cella di memoria di indirizzo 0 (che contiene un’istruzione) c’è scritta la sequenza “0000 00 0001”, ma anche nelle celle di memoria di indirizzo 15 e 16 (che contengono dati che il programma deve elaborare), c’è scritto lo stesso valore “0000 00 0001” (ricordate che gli spazi non contano). Nello stesso modo, nella cella 6 (istruzione) c’è scritto “0000 00 0000”, che è lo stesso valore scritto sia nella cella 10 che 17 (entrambi dati).

Questa osservazione implica che ogni dato gestito da una MR, o da qualunque calcolatore, ha in realtà una natura duale, potendo essere interpretato anche come un’istruzione per la macchina. Questa natura duale del dato fornisce all’informatica un potere di “riproduzione” che in precedenza era posseduto solo da sistemi biologici. È proprio questa natura duale il meccanismo concettuale di base per la costruzione dei virus informatici, che arrivano nei dispositivi digitali come dati e poi entrano in azione come programmi.

Nel prossimo post vedremo un esempio concreto di tale capacità di riproduzione.

--
Versione originale pubblicata da "Osservatorio sullo Stato digitale" dell'IRPA - Istituto di Ricerche sulla Pubblica Amministrazione il 22 gennaio 2025.

sabato 18 gennaio 2025

A passeggio con l'informatica #15 – Dalla virtualizzazione al cloud

di Enrico Nardelli

Nella tappa n.5 di questa passeggiata con l’informatica (Come istruire un computer) avevamo visto come fornire a un computer le istruzioni che esso deve eseguire. In quel post avevamo presentato un semplicissimo esempio di programma con istruzioni scritte in un linguaggio di programmazione a livello simbolico (brevemente, linguaggio simbolico), chiarendo che l’effettiva esecuzione da parte di un automa richiede invece istruzioni espresse in linguaggio di programmazione a livello macchina (cioè, linguaggio macchina).

Da un punto di vista concettuale possiamo considerare il computer “come se” fosse in grado di eseguire direttamente il programma in linguaggio simbolico. Questa visione del computer lo considera quindi come una macchina virtuale in grado di eseguire direttamente le istruzioni del linguaggio simbolico. Poiché non lo è, per poter realizzare questo comportamento, deve essere fatta una traduzione del programma dal linguaggio simbolico a quello macchina.

La traduzione può avvenire in due modi, detti compilazione e interpretazione. La differenza tra i due è che con la compilazione il programma di livello simbolico viene interamente tradotto in quello di livello macchina e la sua esecuzione avviene dopo che l’intero processo di traduzione è terminato. Con l’interpretazione, invece, lo stesso programma viene tradotto un’istruzione per volta, che viene subito eseguita dalla macchina fisica. In alcuni casi è preferibile la compilazione, in altri l’interpretazione: entrambi gli approcci sono largamente usati. Si tratta della stessa differenza che c’è tra il traduttore di un libro, che vi consegna l’intero volume tradotto (compilazione) e l’interprete simultaneo, che invece esegue volta per volta la traduzione della frase pronunciata (interpretazione).

Se riprendete in considerazione la tappa n.5 vi rendete conto, però, che anche quel linguaggio simbolico era un po’ involuto, con termini non troppo chiarissimi (p.es., X Dim o Vai Y per indicare un’istruzione che verifica il contenuto della cella X e poi o lo decrementa o predispone la macchina per continuare con l’istruzione nella cella Y). Sarebbe bello quindi poter avere un linguaggio simbolico di alto livello, con istruzioni quasi vicine al senso comune e applicare lo stesso meccanismo di traduzione. In questo caso, il computer verrebbe considerato come una macchina virtuale in grado di eseguire direttamente programmi scritti in un linguaggio simbolico di alto livello, mentre in realtà il tutto passerebbe attraverso un processo di traduzione come precedentemente spiegato.

Questa visione concettuale di scatole cinesi (o di bamboline russe) viene illustrata, per la situazione appena descritta, nella figura sottostante.

Al livello più basso c’è la macchina fisica, cioè il livello dei circuiti elettronici, che sono in grado di eseguire fisicamente le operazioni logiche e aritmetiche. Quando si passa da questo livello a quello della macchina in grado di eseguire le istruzioni del linguaggio simbolico, si compie un processo di astrazione, si prescinde cioè da ciò che si ha fisicamente a disposizione, immaginando invece di avere qualcosa di più potente, cioè un calcolatore in grado di eseguire direttamente le istruzioni del linguaggio simbolico.

La macchina simbolica così definita non deve però essere fisicamente realizzata perché viene virtualmente ottenuta con il processo di traduzione delle istruzioni in linguaggio simbolico in quelle del linguaggio macchina, che vengono poi eseguite dalla macchina fisica.

Questo approccio viene anche chiamato virtualizzazione, proprio perché consente di avere a disposizione la macchina simbolica non mediante la sua effettiva costruzione fisica, ma attraverso la sua emulazione da parte di una macchina fisica, opportunamente istruita affinché produca i risultati che si sono chiesti alla macchina simbolica.

Nella realtà dell’informatica accade esattamente qualcosa di simile, estendendo ulteriormente questo meccanismo di virtualizzazione, come descritto in maggior dettaglio nel volume La rivoluzione informatica.

È utile ricordare che quando i calcolatori sono nati, nella prima metà del XX secolo, era disponibile solo il livello fisico, quello dei circuiti elettronici. Da subito, però, gli informatici hanno capito che la potenza concettuale di un esecutore automatico poteva essere impiegata per meccanizzare il processo di traduzione dall’espressione umana della procedura risolutiva a quella in grado di essere eseguita dalla macchina fisica. Oltre a consentire alle persone di operare al livello mentale più adeguato a loro, si evitavano in questo modo sia gli errori in cui fatalmente si incorre nel processo di traduzione sia quelli derivanti dal non esprimersi con lo strumento più adatto.

A partire dal secondo decennio del XXI secolo la virtualizzazione, che come abbiamo appena detto fa parte dell’informatica sin dalla sua nascita, ha assunto un ruolo sempre più importante. Infatti, la disponibilità capillare di una rete Internet ad alta velocità ha reso più conveniente, in tutta una serie di circostanze, non comprare direttamente macchine fisiche, cioè calcolatori – come si dice nell’ambiente – “di ferro”, che devono essere gestiti anche da un punto di vista fisico (protezione, spazio, climatizzazione, manutenzione, …), ma noleggiare macchine virtuali disponibili da qualche parte su Internet, appunto in the cloud, cioè “nella nuvola” (termine che deriva dal fatto che negli schemi di descrizione a livello aziendale dei sistemi informatici la parte della rete di comunicazione veniva convenzionalmente rappresentata da una nuvoletta).

Chiudo questa sezione ricordando che lo stesso meccanismo di virtualizzazione che ha permesso lo sviluppo del cloud ci consente di “far rivivere” modelli di calcolatori ormai fuori commercio o che non sono più in grado di funzionare fisicamente, consentendo a loro emulatori, cioè macchine virtuali che si appoggiano su macchine funzionanti, di eseguire il software che ancora esiste per essi ma che non è più in grado di essere eseguito né da tali modelli né direttamente dalle macchine moderne.

--
Versione originale pubblicata da "Osservatorio sullo Stato digitale" dell'IRPA - Istituto di Ricerche sulla Pubblica Amministrazione il 15 gennaio 2025.

sabato 11 gennaio 2025

A passeggio con l'informatica #14 – Il galateo della comunicazione tra automi

di Enrico Nardelli

Con questa tappa concludiamo la sezione dedicata a discutere i principali elementi dello scenario di elaborazioni realizzate mediante la partecipazione di più agenti, ormai attualissimo a causa dell’ubiquità di Internet, e denominato computazione distribuita. Dopo il post introduttivo a questa tematica, abbiamo affrontato i tre concetti fondamentali della cooperazione, sincronizzazione e consenso. Questo post di chiusura affronta un aspetto più tecnologico ma altrettanto rilevante, quello dei protocolli di comunicazione.

Sotto questo nome sono comprese tutte le regole che definiscono come due o più esecutori si coordinano per scambiare informazioni. Non essendo persone in carne e ossa che, se parlano uno stesso linguaggio e fanno parte di una stessa comunità sociale, hanno appreso nel corso della loro esperienza di vita le regole per interagire con gli altri, devono essere istruiti fino all’ultimo dettaglio.

In un certo senso, i protocolli di comunicazione sono come i vari galatei di conversazione che vi sono nei diversi ambienti sociali. Nel mondo delle corti reali, assai diffuse a livello europeo nel XVIII secolo, era previsto, ad esempio, che fossero il re o la regina a rivolgere per primi la parola a chi veniva presentato. Durante la conversazione bisognava usare i termini appropriati e, nel congedarsi, non bisognava girare le spalle. Quando i nostri figli sono piccoli gli insegniamo a salutare quando si entra in un ambiente dove vi sono altre persone e a non interrompere gli adulti quando parlano (o, almeno, a farlo con modi opportuni).

I protocolli di comunicazione degli automi dell’informatica svolgono concettualmente la stessa funzione e hanno avuto un ruolo fondamentale fin dagli albori di questa tecnologia.

Sono sostanzialmente fatti di due parti. La prima è un insieme di regole che specificano la successione dei passi di interazione. Un esempio banale della vita normale: prima si saluta, poi si chiede come va, poi si fa una specifica domanda, poi si ringrazia, infine si saluta. La seconda è un insieme di regole che definiscono la struttura delle comunicazioni scambiate. Continuando l’esempio di prima, si può specificare che il saluto sia abbreviato e costituito solo dal termine di saluto (“ciao” oppure “salve”) o strutturato con “termine di saluto” (p.es: buongiorno) seguito dal “titolo” (p.es. dottoressa) seguito dal “nome completo” (p.es.: Paola Rossi).

Tra i protocolli moderni più famosi usati nell’informatica, di cui anche molti non informatici hanno sentito parlare, ci sono:

  • HypertText Transfer Protocol (= protocollo per il trasferimento di ipertesti – HTTP) che è alla base dello scambio di pagine web;
  • Transmission Control Protocol (= protocollo per il controllo della trasmissione – TCP) che è uno dei protocolli fondamentali per la gestione delle comunicazioni su Internet;
  • Internet Protocol (= protocollo di Internet – IP) che è il protocollo che consente alle diverse reti di comunicazione di scambiarsi dati per realizzare l’Internet che conosciamo;
  • File Transfer Protocol (= protocollo per il trasferimento di file – FTP) che costituisce il protocollo di base per trasferire file generici da una macchina all’altra sulla rete.

Ad esempio il protocollo HTTP prevede, come regole che specificano l’interazione, che chi voglia ricevere una pagina web invii una richiesta alla macchina che la possiede (trascurando i dettagli di come questa richiesta venga inviata) e che tale macchina risponda con la pagina o un messaggio di errore. Per quanto riguarda la struttura delle comunicazioni scambiate, sia la richiesta che la risposta hanno un formato testuale, cioè sono rappresentate mediante la codifica ASCII (ne abbiamo parlato nel post sulla rappresentazione dei dati).

La richiesta deve avere, semplificando, la seguente struttura:

  • un metodo di richiesta (scelto tra un elenco predefinito),
  • un indirizzo della pagina (il termine preciso è “identificatore univoco di risorsa”, in inglese uniform resource identifier = URI),
  • l’indicatore della versione del protocollo,
  • eventuali informazioni aggiuntive (sono gli header di richiesta = intestazioni della richiesta),
  • un corpo del messaggio (che può essere vuoto).

La risposta deve avere il seguente formato:

  • una riga di stato, che contiene un codice a 3 cifre che caratterizza il successo della risposta o una condizione di errore (il famoso “codice 404”, che quasi tutti avranno incontrato almeno una volta nella loro esperienza di navigazione su Internet e che corrisponde alla situazione di “pagina non trovata”, descrive appunto una condizione di errore) o situazioni intermedie che qui non trattiamo,
  • informazioni aggiuntive relative al tipo di macchina che risponde e al tipo di contenuto restituito (sono gli header di risposta = intestazioni della risposta),
  • il contenuto della risposta (ovviamente in caso di successo).

Con il prossimo post apriremo la trattazione di un nuovo tema, quello della virtualizzazione, che è sempre state presente nell’informatica fin dai suoi albori, ma che recentemente ha conosciuto, sotto la forma della tecnologia del cloud, un’esplosione senza precedenti.

--
Versione originale pubblicata da "Osservatorio sullo Stato digitale" dell'IRPA - Istituto di Ricerche sulla Pubblica Amministrazione l'8 gennaio 2025.