Sistemi Operativi, Applicazioni, Giochi e tutte le altre tipologie di software con cui quotidianamente interagiamo, sia se stiamo seduti davanti ad un PC che se utilizziamo il nostro smartphone, hanno un minimo comun denominatore: sono scritti utilizzando un linguaggio di programmazione.
Oggi esistono decine di linguaggi più o meno complessi, ognuno con i propri punti di forza e i propri punti di debolezza che lo rendono più o meno adatto ad un contesto specifico.
Ma qual è stato il primo linguaggio di programmazione della storia? Ebbene, questa domanda si intreccia in modo diretto con una seconda questione: qual è stato il primo computer elettronico (a relè) della storia?
Per rispondere a queste domande dobbiamo ritornare alla prima metà del secolo scorso, e se il viaggio è temporalmente lungo vi sorprenderà scoprire che non lo è dal punto di vista spaziale poiché ci proiettiamo in Germania.
E’ infatti qui che, nel 1935, Konrad Zuse, ingegnere civile tedesco, inizia i suoi esperimenti informatici con lo scopo di realizzare strumenti in grado di eseguire velocemente i complessi calcoli necessari alla progettazione dei velivoli, attività a cui si dedicava per l’aviazione tedesca.
Konrad Zuse
In realtà si trattava di una strada già percorsa dal matematico inglese Charles Babbage quasi un secolo prima che, però, si rilevò senza sbocchi per l’assenza delle tecnologie necessarie a realizzare i progetti.
Tornando a Zuse, il primo sistema su cui l’ingegnere tedesco comincia a lavorare è lo Z1 (dove la “Z” sta per Zuse), realizzato nella casa di famiglia a Berlino in modo segreto, visto che gli anni erano quelli del terzo reich, dove ogni diritto poteva essere soppresso in funzione delle volontà del Fuhrer. Ad essere precisi il nome originale era V1, con “V” abbreviazione di Versuschmodell (modello sperimentale), ma fu subito cambiato per evitare l’assonanza con i terribili missili nazisti.
Lo Z(V)1 durante la sua realizzazione
Al progetto contribuirono molte persone: dalla famiglia ai compagni di studi, in particolare Herber Weber, passando per semplici conoscenti che diedero il proprio contributo nella realizzazione fisica del calcolatore.
Lo Z1 era un calcolatore programmabile, comandato attraverso un insieme di levette azionate da un motore elettrico. Il sistema era basato sulla rappresentazione binaria (numeri sekundal) e su una netta separazione tra memoria e processore, esattamente in sintonia con la definizione di calcolatore data da John von Neumann dieci anni dopo (1946) e fatta propria dall’ENIAC e dal Mark1. Zuse introduce, inoltre, la rappresentazione dei numeri in virgola mobile basati su segno, esponente e mantissa, praticamente lo standard dell’IEEE (Instituion of English Electrical Engnieers) per il calcolo in virgola mobile.
Spaccato della ricostruzione dello Z1 conservato presso il Deutsche Technik Museum di Berlino
La memoria era di tipo meccanico e organizzata in 64 parole da 22 bit, mentre i dati e le istruzioni venivano caricate tramite un nastro perforato, simile a una pellicola cinematografica.
I tempi di elaborazione erano eccezionali: circa 1/2 secondo per un’addizione, 1 secondo per una sottrazione, 3 secondi per una moltiplicazione e 6 secondi per una divisione, nulla rispetto alle potenze attuali, ma stratosferici per il periodo.
Nonostante ciò, l’importanza dei risultati non fu compresa e solo il supporto di colleghi e amici spinse l’ingegnere tedesco a non abbandonare il proprio lavoro.
Lo step successivo fu quello del passaggio dalla memoria meccanica a quella composta da una struttura a relè, ma Zuse non era un esperto e si affidò al collega Helmut Schreyer che aveva una certa dimestichezza con la teoria elettromagnetica. Shreyer ipotizza, inoltre, la possibilità di introdurre nei calcolatori unità aritmetiche basate sui tubi a vuoto, in modo da diminuire fortemente i tempi di elaborazione. Così, mentre supporta Zuse nella revizione dello Z1 (in ottica relè), si dedica alla realizzazione (1939/1940) di un prototipo di sommatore a 10bit che usa tubi a vuoto ed un prototipo di memoria che usa lampi al neon. Quanto realizzato da Schreyer, però, non venne mai utilizzato direttamente da Zuse per i suoi calcolatori.
Dopo circa sei mesi di lavoro lo Z1-b era in grado di eseguire addizioni, sottrazioni e negazioni con tempi decisamente migliori, rendendo più evidenti i possibili sviluppi. Inoltre il nuovo sistema permette a Zuse di ottenere un finanziamento di 7.000 Reichsmark da parte di Kurt Pannke, proprietario di un’azienda di macchine da calcolo.
A questo punto entra in gioco la logica e l’algebra, in particolare quella Booleana che venne approfonditamente studiata dall’ingegnere e fruttò la formulazione dei principi base del Plankalkül (in tedesco “calcolo dei programmi”), il primo linguaggio di programmazione ad alto livello della storia.
Un esempio, in pseudo-codice, di algoritmo Plankalkül, per il calcolo del massimo di tre variabili attraverso la funzione max, è il seguente:
P1 max3 (V0[:8.0],V1[:8.0],V2[:8.0]) => R0[:8.0]
max(V0[:8.0],V1[:8.0]) => Z1[:8.0]
max(Z1[:8.0],V2[:8.0]) => R0[:8.0]
END
P2 max (V0[:8.0],V1[:8.0]) => R0[:8.0]
V0[:8.0] => Z1[:8.0]
(Z1[:8.0] < V1[:8.0]) -> V1[:8.0] => Z1[:8.0]
Z1[:8.0] => R0[:8.0]
END
Il Plankalkül si può ritenere il “papà” dell’ALGOL (58), tant’è che Heinz Rutishauser, uno dei suoi creatori affermò:
“The very first attempt to devise an algorithmic language was undertaken in 1948 by K. Zuse. His notation was quite general, but the proposal never attained the consideration it deserved.”
[“Il primo tentativo di creare un linguaggio algoritmico è stato intrapreso nel
1948 da K. Zuse. La sua formulazione era piuttosto generica, ma la proposta non hai mai
ottenuto la considerazione che meritava.”]
Zuse era arrivato alla conclusione che grazie ad esso lo Z1 fosse in grado di analizzare le relazioni tra i numeri inseriti e, persino, effettuare una partita a scacchi. Per quanto la cosa possa sembrare incredibile (e all’epoca era semplicemente un’idea folle), nel 2000 il professore Rojas della Technische Universität Berlin in Germania è riuscito a realizzare un gioco degli scacchi proprio attraverso la prima implementazione concreta del Plankalkül, realizzata in java.
Plankalkül Java Applet
Il linguaggio di Zuse conteneva già i concetti di modularità e scope (locale o globale) delle variabili, anche se quest’ultime non erano “tipizzate”, ovvero non era possibile distinguere il tipo di numero rappresentato (reale o intero). Erano inoltre presenti: le operazioni di assegnazione, gli stati condizionali (if-then-else), i loop, la gestione delle operazioni logiche, la gestione delle eccezioni sulle operazioni aritmetiche, l’abolizione del GOTO. Il Plankalkül venne completato, a livello concettuale, tra il 1943 ed il 1945, e reso pubblico solo nel 1972.
Nel frattempo lo scoppio della seconda guerra mondiale porta all’arruolamento obbligatorio di Zuse e solo l’influenza di Pannke gli permette di ottenere alcuni privilegi che gli consentono di continuare i suoi studi, anche se l’ingegnere non riesce inizialmente ad ottenere il congedo. Viene presto trasferito a Berlino, presso una divisione che faceva capo all’industria aereonautica per cui aveva lavorato in precedenza, dove ha l’occasione di applicare le proprie teorie, e, soprattutto, dove è libero, nel fine settimana, di dedicarsi allo sviluppo delle evoluzioni del Z1.
Il nostro viaggio allo scoperta del “papà” del computer elettronico continua la prossima settimana con il secondo ed ultimo post.