+

La storia dei computer, una strada differente dalla solita

E se per una volta raccontassimo la storia delle idee anziché quella degli oggetti? Proviamo!


(Alcuni appunti per organizzare le cose che studio, partendo da questo articolo (opens new window) e integrandolo con le mie note)


Di solito la storia dei computer viene raccontata come una storia di oggetti, dall'abaco all'engine di Babbage fino alle macchine per decodificare i messaggi nazisti durante la Seconda guerra mondiale.

In realtà si tratta di una storia di idee che è emersa da una disciplina considerata minore, la logica matematica.

I pionieri di questo settore sono stati George Boole e Gottlob Frege, ispirati dal linguaggio concettuale universale di Leibniz e dal sistema logico di Aristotele.

Era considerato un settore assolutamente non importante e astratto; "ricerca di base", diremmo oggi.

Il punto di svolta sono due lavori della seconda metà degli anni Trenta:


Claude Shannon A Symbolic Analysis of Switching and Relay Circuits (1938).

Alan Turing On Computable Numbers, With an Application to the Entscheidungsproblem (1936).


Vediamoli in ordine.


Claude Shannon

Shannon era uno studente di ingegneria elettrica al MIT di Boston e il suo docente era Vannevar Bush, che aveva costruito il "Differential Analyzer", prototipo di un computer che poteva calcolare rapidamente equazioni differenziali. Era un sistema meccanico con sottosistemi controllati da relè elettrici, organizzati ad hoc senza che ci fosse una teoria sistematica di come si disegnavano i circuiti sottostanti. Bush chiese a Shannon di occuparsi proprio di questo e studiarlo nella sua tesi.

L'approccio e il metodo di Shannon sono quelli di un ingegnere elettrico (equazioni e diagrammi di circuiti elettrici) ma il riferimento principale del suo lavoro era un libro di 90 anni prima: The Laws of Thought di George Boole.

Nel 1938 il lavoro di Boole era conosciuto solo da chi studiava filosofia. Shannon aveva fatto un esame di filosofia e lo aveva "scoperto". Disse: "Accadde per caso che nessun altro avesse familiarità allo stesso tempo con entrambi i campi di studio".

Boole è considerato un matematico ma lui si definiva un filosofo. Voleva portare avanti il lavoro di Aristotele. Nel suo libro investigava le leggi che regolano il modo con il quale il cervello umano ragiona. Con lo scopo di fornire un modo di esprimerle nel linguaggio simbolico dell'analisi matematica, e costruire su questo la scienza della Logica con la quale capire come funziona la mente umana.

Il riferimento di Boole è Aristotele con la scolastica, perché la Logica - diceva Boole - è associata a Aristotele e all'Organon, sia nella parte tecnica che in quella metafisica, che sino ad oggi ha avuto bisogno di pochissimi aggiustamenti.

La mossa di Boole era coraggiosa perché i sei libri dell'Organon di Aristotele sono il canone del settore da duemila anni. Aristotele ha scritto tutto quel che serve in questo campo. Immanuel Kant ha commentato: «Da Aristotele in poi con la Logica è stato incapace di fare un solo passo in avanti, e quindi sembra che a tutti gli effetti il settore sia finito e completo».

Il centro del ragionamento di Aristotele è che gli argomenti sono o non sono validi in base alla struttura logica e non alle parole usate. Ad esempio, lo schema del sillogismo

Tutti gli uomini sono mortali
Socrate è un uomo
Quindi Socrate è mortale

Si può cambiare Socrate con qualsiasi altro soggetto e mortale con qualsiasi altro predicato ma l'argomento rimane valido perché il lavoro viene fatto dalla struttura. La logica sta in "tutti" "sono" "è" "quindi".

Aristotele ha anche definito l'insieme di assiomi da cui deriva il resto del sistema logico

  • Un oggetto è quello che è (legge di identità)
  • Nessuna frase può essere contemporaneamente vera e falsa (legge di non contraddizione)
  • Ogni frase è o vera o falsa (legge dell'esclusione del mezzo)

Questa è logica. Non stiamo parlando di come pensa una persona reale (quella è psicologia) ma di come ragiona una persona ideale.

Il metodo assiomatico di Aristotele è confluito negli Elementi di Euclide, che è l'altro libro importante per la logica e la geometria. È il libro di testo per insegnare il modo di ragionare deduttivo più rigoroso.

Euclide rappresenta le idee geometriche con diagrammi spaziali e si continuarono a usare i diagrammi sino a quando, nel 1630, René Descartes ha scritto il Discorso sul metodo con cui ha dimostrato che la geometria può essere rappresentata anche con delle formule.

È il primo libro che popolarizza l'idea della notazione algebrica standard. Ad esempio, X, Y e Z sono variabili; A, B e C sono quantità conosciute e così via.

L'algebra di Descartes ha consentito ai matematici di andare oltre le intuizioni spaziali e manipolare i simboli utilizzando delle regole formali definite con precisione. Trenta anni dopo Descartes, Isaac Newton e Gottfried Leibniz arrivano alla stessa logica conseguenza e sviluppano l'analisi matematica.

L'obiettivo di Boole era quello di fare per la logica aristotelica quello che Descartes aveva fatto per la geometria euclidea. Liberarla dalle limitazioni dell'intuizione umana dandogli una precisa notazione algebrica.

Aristotele:

Tutti gli uomini sono mortali

Boole sostituisce "uomini" e "mortali" con le variabili e "tutti" e "sono" con operatori aritmetici

X=X*Y

Che si può leggere: tutto quello che è nell'insieme X è anche nell'insieme Y

Le Leggi del pensiero crearono una nuova disciplina: la logica matematica (o "logica simbolica" o "metamatematica"). Negli anni successivi divenne un settore tra i più attivi nella ricerca di matematici e filosofi. Bertrand Russell definiva il libro di Boole "il lavoro in cui è stata scoperta la matematica pura".

L'idea di Shannon era che il sistema di Boole poteva essere mappato direttamente nei circuiti elettrici. All'epoca infatti non c'era una teoria sistematica nella progettazione dei circuiti.

Per Shannon la teoria giusta doveva essere perfettamente corrispondente al sistema di calcolo delle proposizioni usato nello studio simbolico della logica. Crea quindi una mappa di corrispondenza tra circuiti elettrici e operatori booleani. Questa corrispondenza consente agli informatici di avere accesso a decenni di lavoro di Boole e dei suoi discepoli della logica e matematica.

Shannon mostra anche come fare a creare un circuito per sommare due cifre binarie. Collegando tra loro questi circuiti è possibile costruire operazioni aritmetiche sempre più complesse.

In questo modo Shannon distingue tra il lato logico e quello fisico del computer. Oggi è buon senso conoscere questa distinzione, all'epoca è stata una rivoluzione concettuale.

Negli anni successivi il lavoro ha accelerato grazie ad alcune pietre miliari. Una è stata l'invenzione nel 1947 del transistor da parte di William Shockley e dei suoi colleghi dei Bell Labs. Il transistor potenzia in maniera incredibile l'idea dei relè elettrici di Shannon. Negli anni successivi il settore dei semiconduttori è riuscito a comprimere sempre più transistor in spazi sempre più ridotti. Oggi un processore ha 3,3 miliardi di transistor, ognuno un "relé" come quelli di Shannon.


Alan Turing

Il lavoro di Shannon riguarda la mappatura della logica nel mondo fisico.

Invece, Alan Turing ha mostrato come progettare computer nella lingua della logica matematica.

Nel 1936 Turing stava cercando di risolvere il "problema di decisione" identificato dal matematico David Hilbert. Esiste un algoritmo capace di determinare se una qualsiasi affermazione matematica è vera o falsa?

Il lavoro di Turing è estremamente tecnico. Ma il suo valore storico non è tanto nella risposta al problema, bensì nel modello di computer progettato come strumento per risolvere il problema.

Il lavoro di Turing segue la tradizione di pensiero che va fino a Gottfried Leibniz (alternativa a quella di Isaac Newton) per l'analisi matematica. Fra le altre cose, Leibniz aveva pensato a un nuovo linguaggio linguaggio formale universale che aveva chiamato "Characteristica universalis" cioè "carattere universale" in grado di esprimere tramite simboli concetti matematici, scientifici e metafisici.

Era un'idea ispirata dal filosofo religioso Ramon Llull del XIII secolo. Leibniz aveva postulato che fosse un linguaggio ideografico come i geroglifici degli Antichi Egizi, in cui ogni carattere avrebbe avuto corrispondenza con un "concetto-atomo" della matematica e della scienza. Secondo Leibniz questo linguaggio avrebbe dato all'umanità lo strumento per potenziare capacità di ragionare degli esseri umani, così come il microscopio e il telescopio potenziavano di gran lunga la capacità di vedere.

Aveva anche immaginato una macchina che potesse processare questo linguaggio, il "calculus ratiocinator". A che scopo? Ad esempio, in caso di controversie tra due persone, due filosofi piuttosto che due avvocati, sarebbe bastato utilizzare questo linguaggio e poi "calcolarlo" per vedere cosa succedeva, cioè per vedere chi avesse ragione.

Nel 1879 il filosofo tedesco Gottlob Fregbe pubblicò il suo trattato di logica "Begriffsschrift", ispirato dalla mossa di Boole per migliorare la logica di Aristotele, Frege tentò di sviluppare un sistema logico ancora più avanzato. Il sistema di Frege è la base praticamente invariata sulla "logica del prim'ordine" o "logica del predicato" che si studia ad informatica e filosofia.

Frege è importantissimo. Il suo lavoro ha portato alla "svolta linguistica" della filosofia. La filosofia dell'Illuminismo era ossessionata dalle domande dei problemi sulla conoscenza. Dopo Frege la filosofia diventa ossessionata da domande sui problemi del linguaggio. Due suoi discepoli sono i più importanti filosofi del XX secolo: Bertrand Russell e Ludwig Wittgenstein.

La logica di Frege è capace di rappresentare in modo molto più accurato la struttura logica del linguaggio ordinario. Separa gli oggetti dai predicati, utilizza per primo i quantificatori ("per ogni", "esiste") ed è il primo a sviluppare concetti poi fondamentali per l'informatica e per il pensiero computazionale: funzioni ricorsive, variabili di portata e vincolanti (variables with scope and binding).

Linguaggio formale di Frege: regole ben definite manipolano simboli senza significato. L'interpretazione viene data in maniera separata. Questo permette di distinguere la sintassi dalla semantica. Diventa un "gioco di simboli, con token senza senso che seguono delle regole puramente sintattiche". Tutto il significato viene eliminato: il sistema meccanico permette di provare varie proposizioni.

Conseguenza inaspettata: vengono trovare inconsistenze e debolezze nelle fondamenta della matematica. Negli Elementi di Euclide si trovano errori logici. Ad esempio: se tre punti sono su una linea, un punto deve essere tra gli altri due. Ma nelle definizioni non viene mai definito cosa vuol dire "che sta fra gli altri due" ("between-ness") e questo è un errore di logica formale.

La crisi della matematica però è facilmente risolta perché lo stesso metodo per vedere gli errori viene usato per correggerli. Giuseppe Peano nel 1889 sviluppa gli assiomi per l'aritmetica e nel 1899 David Hilbert fa lo stesso per la geometria.

Però David Hilbert fa anche una cosa in più: formalizza il metodo per correggere il resto della matematica con tutti i requisiti che devono essere soddisfatti per riuscirci, inclusi questi due:

  • Completezza: ci deve essere una prova che tutte le dichiarazioni vere della matematica possano essere provate nel sistema formale
  • Decidibilità: ci deve essere un algoritmo che permetta di decidere la verità o falsità di ciascuna dichiarazione matematica.

Questo secondo è il "problema della decisione" o "Entscheidungsproblem" di cui si occupa Turing nel suo lavoro.

Questo è il programmata di Hilbert. Fino al 1930 è stato il centro degli interessi di logici e matematici come Hilbert stesso, Russell, Kurt Goedel, Hohn Von Neumann, Alonzo Church e Alan Turing.

Il programma di Hilbert va avanti su due fronti.

Sul primo fronte i logici creano sistemi logici che cercano di provare se i requisiti di Hilbert possono essere soddisfatti o no.

Sul secondo fronte i matematici usano i concetti dei logici per ricostruire la matematica classica.

Ad esempio, Peano inizia con una funzione molto semplice, il successore, che permette di aumentare ogni numero di una unità. Lo usa per definire in maniera ricorsiva la somma. E usa la somma in maniera ricorsiva per definire la moltiplicazione, e così via. In questo modo riesce a definire tutte le operazioni della teoria dei numeri. Utilizza poi queste definizioni, assieme alla logica formale, per provare i teoremi dell'aritmetica.

Tutto questo però produce una notevole complessità, perché gli stessi strumenti possono essere adoperati anche per distruggere, se vengono utilizzati per costruire dichiarazioni autoreferenziali e paradossali.

L'esempio classico è il paradosso del bugiardo: "Questa frase è falsa". Se è vera, allora è falsa. E se è falsa, allora è vera. È un loop di auto-contraddizione insuperabile.

Russel utilizza il paradosso del bugiardo nella logica matematica e dimostra che il sistema di Frege ammette insiemi autocontraddittori.

Il paradosso di Russell: "Definiamo R come l'insieme di tutti gli insiemi che non sono membri di se stessi. Se R non è membro di se stesso, allora la sua definizione lo obbliga a contenere se stesso. Se contiene se stesso, allora contraddice la sua stessa definizione come insieme di tutti gli insiemi che non sono membri di se stessi".

Lo stesso Frege rimase colpito da questo paradosso, e lo scrisse a Russell, dicendosi distrutto).

Russell e Alfred North Whitehead lavorarono assieme per fare i Principia Mathematica, tre volumi fra il 1910 e il 1913, È il tentativo più ambizioso di completare il programma di Hilbert.

Ci vogliono 300 pagine per provare che 1+1+=2

Russell e Whitehead cercano di risolvere il paradosso di Frege con la Teoria dei tipi. L'idea è di dividere il linguaggio in livelli multipli o "tipi". Ognuno può essere il riferimento a quelli inferiori ma non a quelli superiori. Questo risolve il paradosso degli auto-referenziali perché in sostanza vieta le auto-referenzialità. Questa soluzioni non piace particolarmente ai logici ma diventa molto influente per gli informatici: molti linguaggi di programmazione moderni hanno funzionalità ispirate alla Teoria dei tipi.

Esempio: se "pippo" è una stringa e "5" è un intero, con la tipizzazione che proibisce la somma di stringhe e interi, si fa in modo che non sia possibile fare "pippo"+"5" che non avrebbe senso. Questa proibizione è assoluta per i linguaggi con tipi statici mentre è relativa nei linguaggi con tipi dinamici perché non si può sapere a priori se un programma fa un uso corretto dei valori.

Tuttavia, i paradossi di auto-referenzialità mostrano che il programma di Hilbert non poteva avere successo. Il primo colpo serio arriva nel 1931 quando Goedel pubblica il suo teorema dell'incompletezza.

Il teorema dell'incompletezza dimostra che ogni sistema logico coerente abbastanza potente da comprendere l'aritmetica deve anche contenere affermazioni che sono vere ma che non possono essere provate essere tali.

Questo teorema è uno dei pochi risultati della logica che è diventato popolare grazie a due libri: Goedel, Escher, Bach e La nuova mente dell'Imperatore.

Il colpo finale viene dato in maniera indipendente da Turing e da Alonzo Chuch. Entrambi provano che non può esistere nessun algoritmo che determina se una qualunque dichiarazione matematica è vero o falso.

Per farlo, Church inventa un sistema completamente diverso che si chiama "Lambda calcolo", che poi ispirò alcuni linguaggi di programmazione come il Lisp.

La risposta al problema della decisione è negativa.

L'intuizione di Turing arriva nella prima parte del suo paper del 1936. Per formulare in maniera rigorosa il problema di decisione Turing prima crea un modello matematico di quello che significa essere un computer e poi lo applica al problema. Questo modello matematico è la macchina universale di Turing.

I passaggi del ragionamento di Turing:

  • Un algoritmo è un insieme regole che una persona può seguire in una maniera precisa e meccanica. Dimostra che l'attività possibile di questa persona può essere limitata a poche semplici azioni di base senza che il risultato finale cambi.
  • Con la prova che nessuna macchina che sia in grado di procedere con queste azioni di base potrebbe determinare, utilizzando le regole di Frege, se a una determinata premessa segua o no una determinata conclusione, è in grado di concludere che non esiste un algoritmo per il problema della decisione.
  • Il sottoprodotto di questo lavoro è il modello matematico di una macchina per il calcolo universale.

Dopodiché Turing fa vedere un'altra cosa: un programma memorizzato assieme ai dati sui quali opera. Si tratta dell'architettura a programma memorizzato che è alla base dei nostri computer moderni.

Prima di questo si immaginava che una macchina di questo tipo avesse tre entità separate: macchina, programma e dati,

La macchina era l'oggetto fisico: oggi lo chiamiamo hardware. Il programma era il piano per fare una computazione, all'inizio scritto su schede perforate o tramite una serie di connessioni elettriche con spinotti. Infine, i dati erano l'input numerico. La macchina universale di Turing mostra che la distinzione fra queste tre categorie è una illusione.

È la prima dimostrazione rigorosa che qualsiasi logica computazionale che può essere codificata nell'hardware può essere codificata anche nel software. L'architettura di Turing viene successivamente chiamata "Architettura di Von Neumann", ma lo stesso Von Neumann ha spiegato che l'idea era di Turing.

Anche se tecnicamente un fallimento, il programma di Hilbert permise tuttavia di dimostrare che buona parte della matematica poteva essere costruita a partire dalla logica.


La materializzazione delle idee

Shannon e Turing mostrarono le connessioni tra elettronica, logica e computazione. A questo punto era possibile esportare questo nuovo armamentario concettuale nella progettazione dei computer.

La Seconda guerra mondiale è stato un notevole acceleratore per lo sviluppo dell'informatica negli Usa grazie alla strategia del governo americano di arruolare un buon numero di logici nei propri laboratori. Von Neumann, a Los Alamos per la costruzione della bomba atomica, lavorò anche alla progettazione del computer per supportare la ricerca fisica. Nel 1945 scrisse le specifiche dell'Edvac, il primo computer a programma memorizzato, basato sulla logica. La sua guida è considerata la fonte definitiva per la moderna progettazione dei computer.

Turing a Bletchley Park contribuì alla progettazione del computer che fu determinante per forzare i codici di comunicazione nazisti. Il contributo di Turing è l'ACE, Automatic Computing Engine.

ACE ed Edvac erano simili in quanto entrambi basati su logica booleana e architetture a programma memorizzato. C'erano anche delle differenze però, che ancora oggi fanno parte del dibattito per la progettazione dei processori.

Il progetto di Von Neumann era simile all'architettura dei moderni processori CISC (insieme complesso di istruzioni) che permetteva di avere funzionalità più complesse direttamente nell'hardware. Il progetto di Turing invece era più simile ai moderni RISC (insieme ridotto di istruzioni) che minimizza la complessità dell'hardware e porta il software a lavorare di più.

Secondo Von Neumann il lavoro dei programmatori sarebbe stato tedioso e impiegatizio. Al contrario, Turing riteneva che programmare sarebbe stato affascinante: "Non c'è alcun pericolo che possa diventare noioso, perché ogni processo ripetitivo può essere delegato alla macchina stessa".


Logica deduttiva e logica induttiva

Programmare è diventato sempre più complesso, ma al cuore c'è sempre l'idea che si tratti di una attività ben definita: il programmatore specifica le regole che devono essere seguite dalla macchina. Se vogliamo dirlo in modo filosofico, la programmazione del computer segue la tradizione della logica deduttiva. È una branca della logica matematica che tratta della manipolazione di simboli seguendo delle regole formali.

Da alcuni anni a questa parte però la programmazione ha iniziato a cambiare grazie alla crescente popolarità di un tipo specifico di intelligenza artificiale, cioè del machine learning. Questa tecnica prevede che si debbano creare dei quadri di riferimento all'interno dei quali le macchine imparano attraverso l'inferenza statistica.

Questo porta la programmazione ad essere sempre più vicina a un'altra branca della logica: la logica induttiva, che tratta del modo di inferire le regole da specifiche istanze.

Oggi la parte più promettente del machine learning utilizza la tecnica delle reti neurali, inventata negli anni Quaranta da Warren McCulloch e Walter Pitts. L'idea dei due era di sviluppare una forma di calcolo pensato per i neuroni che, come la logica booleana, poteva essere utilizzato per costruire i circuiti dei computer.

Le reti neurali rimasero "ricerca di base" ed esoterica per decenni fino a quando vennero combinate con tecniche sofisticate di statistica, che permettono di migliorarle aumentando il quantitativo di dati con cui vengono alimentate. Da questo punto di vista "programmare" in questo campo vuol dire esporre le reti neurali al mondo e lasciare che imparino.

Se davvero è questo il secondo atto della storia dell'informatica, è molto appropriato. La logica è nata come un modo per capire le leggi del pensiero. Ha aiutato a creare macchie che possono ragionare seguendo le regole della logica deduttiva. Adesso, la logica deduttiva e la logica induttiva vengono combinate per creare macchine che possono sia ragionare che apprendere.

L'esplorazione della natura e costituzione della mente umana si è trasformata nella creazione di nuovi tipi di menti artificiali che procedono su una strada differente dalla nostra.



(Rielaborazione da qui (opens new window))