Qualche settimana fa, in risposta a un tweet-sondaggio: “What was your first programming language you started with?”, ho tweettato: “Fortran (1973)“. Lì per lì non ho considerato che mezzo secolo di linguaggi e programmazione (un abisso di 47 anni) separava il pensionato di oggi dallo studente di Ingegneria di allora. Per realizzarlo sono bastate le repliche al mio tweet:

  • “Wow”;
  • “Yikes I was still a twinkle in my dads eye, back then. Respect”;
  • “Oh boy … You really are a veteran. 1973, I was one and it would be another 8 or 9 years before I even saw a computer… Unless you count my mums typewriter in work… Guess not”;
  • “Dude. I was born in ’72. Was that a punch card language (risatine con lacrime)”;
  • “1973? Man! I was born a year after”.

Una sola risposta mi ha risollevato un po’:

  • Fortran, 1968.

Per fortuna non sono rimasto al Fortran, sono arrivati (e passati) altri linguaggi. E quindi ci sta un momento-revival.


Mezzo secolo di linguaggi e programmazione, partendo dalle aule del Politecnico

Era appunto il 1973 quando frequentai il corso di Calcolatori Elettronici I nelle aule del piazzale Tecchio, a due passi dallo stadio San Paolo (oggi Maradona) di Napoli.
Il programma era sbilanciato a favore delle questioni hardware. Per il software c’era qualche rapido excursus sui sistemi operativi e su semplici algoritmi, per chiudere poi con teoria ed esercitazioni sul Fortran.

Non ho ricordi precisi sulla versione del linguaggio, da quello che mi ricorda Wikipedia dovrebbe trattarsi del Fortran 66. Ricordo invece molto bene la coda per prendere possesso della macchina perforatrice delle schede, poi l’attesa dell’uscita della stampa, e il giramento di balle quando scoprivi di avere commesso un piccolo errore di battitura. Quindi coda again, attesa e finalmente il tabulato.

Cosa ricordo del Fortran? Ben poco.
Ricordo che ogni scheda perforata riportava una riga di programma con una istruzione, e che occorreva lasciare libere le prime 5 posizioni della riga, destinate a una eventuale etichetta verso cui eseguire dei salti (il GOTO che dovrebbe essere sparito dai linguaggi moderni).
E poi naturalmente l’IF, che aveva una forma primordiale ma funzionale: tipo IF (x – 3) 10, 20, 30. In base al risultato dell’espressione tra parentesi il programma eseguiva un salto vero l’etichetta 10 (se minore di 0) oppure 20 (se uguale a zero) o 30 (se maggiore di 0).

Fortran, ma anche Basic

La mia tesi di laurea trattava gli albori degli algoritmi di compressione per segnali video. Il supporto di calcolo che avevo a disposizione era in realtà variegato:

  1. al centro di calcolo interfacoltà, posto proprio accanto al parco di Edenlandia, avevo la possibilità di eseguire programmi in Fortran, come detto;
  2. nel dipartimento di Telecomunicazioni avevo invece a disposizione un plotter, con linguaggio proprietario, e un minicomputer programmabile in Basic.

Il minicomputer aveva le dimensioni di un armadietto a un’anta. All’accensione dovevo caricare il software di partenza da un nastro, dopo di che era possibile caricare ed eseguire programmi in Basic.
Preferivo di gran lunga lavorare al mini, per tre valide ragioni: potevo averlo per alcune ore a mia completa disposizione; potevo memorizzare i programmi sul mini, senza gestire pacchi di schede perforate; l’ultima ragione era legata alla natura del linguaggio.

Il Fortran, infatti. è un linguaggio compilato, mentre il Basic è un linguaggio interpretato.
I linguaggi compilati prevedono tre passaggi per lavorare: si scrive il programma, lo si traduce in linguaggio di basso livello per ottenere prestazioni ottimali (compilazione del programma in un eseguibile) e, infine, si… esegue l’eseguibile.

I linguaggi interpretati, invece, saltano la fase di compilazione. Le righe del programma vengono tradotte in istruzioni più semplici solo al momento dell’esecuzione. Le prestazioni non sono ottimizzate, ma il processo di messa a punto del programma è molto più semplice e rapido.

Con l’aiuto del mini mettevo a punto gli algoritmi di compressione, che poi dovevo però riportare in Fortran (e schede perforate).

Uno, due, tanti Basic

Con Basic si intende in effetti una classe di linguaggi con regole formali più semplici di altri linguaggi evoluti e che sono, se vogliamo, anche più primitivi. In realtà esiste una gran varietà di dialetti Basic, a volte intimamente legati alla macchina su cui vengono eseguiti (vedi il caso del Commodore 64, ad esempio).

Nel tempo ho utilizzato diverse versioni di Basic, oltre a quello del citato Commodore 64.

Una versione antipatica era il GW-Basic, prodotto Microsoft per MS-DOS.
Dico antipatica per due motivi. Il primo: la Microsoft (e Bill Gates) non mi sono mai stati particolarmente simpatici, per usare un eufemismo. Il secondo e più sostanziale motivo è legato al mio ingresso in Olivetti a fine ottobre del 1977 e alla scoperta di una macchina fantastica, l’Olivetti P6060, dotato per l’appunto di un Basic assolutamente favoloso.
Dopo qualche anno sul P6060, passare al GW-Basic fu un’esperienza per molti versi frustrante.

Un altro Basic, che ho utilizzato fino a non molto tempo fa, è l’UBasic del prof. giapponese Yuji Kida della Rikkyo University.

La versione più recente (anche se ormai abbastanza datata) è la versione 9, scaricabile dal sito Sciencexp.free.fr. Quella che ho usato a lungo è la 8.74, che offre anche molti esempi di codice su applicazioni matematiche.

L’UBasic merita una menzione perché somma alla semplicità dell’utilizzo tipica della famiglia dei Basic, anche un notevole grado di sofisticazione, ad esempio nella precisione raggiungibile nei calcoli, o anche nell’utilizzo di strutture dati evolute. Merita un assaggio, se si accetta di eseguire un programma dal terminale MS-DOS di un pc Windows.


Chi avesse voglia di scaricare l’Ubasic e provarlo, può dare un’occhiata all’articolo Disegnare con il pc, utilizzando la search di google, excel e ancora altro. Ecco, l’Ubasic è l’altro a cui allude il titolo dell’articolo.


Una parentesi evoluta: il Prolog

Per puro caso ho avuto modo, a metà Anni ’80, di conoscere e utilizzare il Prolog.

Si avvicinava l’estate e mi apprestavo a ripulire il PC utilizzato da un borsista di Informatica di Pisa, di cui avevo seguito la tesi di laurea come co-relatore. Tra le cartelle del pc trovai il pacchetto del Prolog della Borland, con un po’ di esempi. Chi volesse provare il brivido dell’archeologia informatica, e provare il mondo della programmazione logica, può scaricare la versione 2.x del Prolog da Winworldpc.com.

Non è semplice passare dalla programmazione tradizionale (Basic, ad esempio) a quella logica, come il Prolog. Però ricordo che, una volta capito il concetto, mi divertii un mondo.

In sintesi: il codice non descrive un flusso di azioni, come nei linguaggi tradizionali, ma un insieme di fatti e relazioni tra predicati. L’esecuzione del codice è semplicemente la richiesta al sistema di risolvere un particolare predicato.

Quell’estate realizzai un programma di gestione per la mia biblioteca di libri cartacei (Excel & co erano ancora di là da venire) e un programma di gestione dei piani operativi, con i diagrammi di Gandt (l’Open source non esisteva ancora).
Nessuno dei due programmi ebbe un utilizzo apprezzabile, però mi divertii un mondo.


Giocando con il Prolog

Sul Web è possibile trovare degli ambienti Prolog interattivi, come ad esempio Swish.swi-prolog.org.
Nell’immagine che segue c’è un semplice esempio di codice Prolog.

In alto a sinistra c’è il programma, in cui vengono elencati dei fatti relativi a delle relazioni tra entità.
La relazione padre, ad esempio, lega due entità (pasquale, valentina) e questa relazione indica per chi legge che Pasquale è il papà di Valentina. Analogamente, la relazione madre lega Orsella e Valentina, e Valentina e Luna.

La relazione figlia è invece definita da due regole: X è figlia di Y se Y è il padre o la madre di X. Analogamente la relazione nonno lega X e Y, se X è padre di un elemento Z, di cui Y è figlia.

A questo punto, nell’angolo in basso a destra ho inserito un’interrogazione: figlia(valentina,X). Elaborando regole e relazioni, il sistema mi risponde che Valentina è figlia di Orsella e Pasquale. Allo stesso modo: nonno(pasquale,Y)Y = luna come risposta.

mezzo secolo di linguaggi e programmazione: prolog
Mezzo secolo di linguaggi e programmazione: prolog.

Script di Unix + Excel

Nella seconda metà della mia vita lavorativa ho avuto a che fare con analisi di dati: prestazioni, utilizzo dei servizi, forecast e compagnia contando. Strumento indispensabile per questo mestiere è Excel, con il suo arsenale di filtri, cerca.vert, somma di qua, somma di là e tabelle pivot. In questo periodo è esattamente questo il modo con cui faccio le mie analisi su Covid-19 e vaccinazioni.

Quando i numeri da analizzare diventano corposi, è preferibile spezzare in due l’analisi: a excel si lascia solo la gestione della parte grafica e interattiva, e si riduce la mole di dati a monte, con degli script.
Uno script è un programma, spesso semplice, che analizza dei file di dati e li pre-mastica, riducendone la dimensione ed estraendo solo le relazioni che interessano. L’ambiente più naturale per eseguire questi script è il sistema operativo Unix.

Se si ha un PC su cui gira Ubuntu, si ha già tutto quello che serve (con LibreOffice calc al posto di Excel).

Il terminale disponibile sul Mac è un terminale Unix, meno ricco e avanzato di quello di Ubuntu, ma comunque funzionale all’esecuzione di script.
Windows 10, invece, da quando integra il terminale di Ubuntu, è, da questo punto di vista, molto avanzato.

Due sono gli attrezzi che serve apprendere: lo scripting del Bash e AWK.

Come si comincia? Come sempre, sarebbe preferibile partire da degli esempi, capire come funzionano e poi provare le proprie variazioni sul tema.
Un grande aiuto arriva anche dal sito Stackoverflow.com, sito sul quale è estremamente probabile che il nostro dubbio di programmazione sia stato già affrontato e risolto.


Uno Stackoverflow in carne e ossa

Molto prezioso può risultare avere un amico bravissimo, a cui rivolgersi quando si è in difficoltà.
Il mio riferimento per le cose di Unix è Max M.
Alto 1 e 95, silenzioso e accurato, conosce a fondo il mondo degli script unix. Ed è anche dotato di notevole ironia.
Quando sono in difficoltà, gli lancio una richiesta di aiuto via whatsapp. La risposta può essere di tre tipi:

  • poniamo che gli stia chiedendo di darmi una mano, perché non so come modificare delle stringhe con awk; mi risponderà, molto probabilmente, con il comando Unix “man awk“; tradotto: lo trovi nel manuale, leggilo, non posso passare il tempo a spiegarti la rava e la fava
  • il problema che gli pongo non è proprio così elementare, allora mi arrivano a stretto giro di posta un paio di vie alternative tra cui scegliere;
  • per chissà quale ragione, il problema stimola la sua vena minimalista e perfezionista allo stesso tempo; la risposta che arriva è un gioiello compatto e perfetto, ma non capirò mai come funziona.

E adesso Ruby

Da qualche tempo sono passato a Ruby.
Prima sul pc Windows 10, poi, con l’acquisto del MAC, ho installato l’ambiente Ruby anche su MacOS.

Sul PC Windows 10 è stato tutto molto semplice, forse anche perché sono stato utente Windows per molto, troppo tempo. Su MacOS l’installazione è stata più laboriosa, ma, alla fine, ce l’ho. Qui il riferimento per installare Ruby sui vari sistemi operativi.

Cosa dà Ruby?
Ruby è un linguaggio a oggetti, dice Wikipedia. La cosa più semplice per capirne le potenzialità è partire da un buon tutorial e da un ambiente di programmazione on line. Propongo Tutorialspoint.com, per entrambe le cose.

mezzo secolo di linguaggi e programmazione: Ruby
Mezzo secolo di linguaggi e programmazione: Ruby.

Sulla sinistra ho inserito le linee di codice del programma, sulla destra l’output ottenuto con un click su Execute.

La logica del programma è semplice: [1,2,3,4] è un array di quattro elementi, .permutation è un metodo per generare le possibili permutazioni dell’array. Il ciclo  do … end lavora su ogni singola permutazione (.each), stampandola e contandola.

La forza di Ruby sta proprio nell’estrema ricchezza di metodi che consentono di costruire un codice molto snello, pulito e facilmente comprensibile (se lo si scrive bene).


Whats next?

Non è detto che non mi faccia sedurre da un nuovo linguaggio. Il divertimento sta in fondo più nella strada percorsa per raggiungere un obiettivo che nel raggiungimento stesso. Un nuovo linguaggio potrebbe portarmi a rivisitare algoritmi già utilizzati, per sfruttare al meglio le potenzialità del nuovo linguaggio, magari rendendo il codice più human readable. O magari a risolvere problemi con cui non l’ho ancora spuntata finora.

Immagine di apertura di Wilson Nantes da Pixabay.

Scritto da:

Pasquale

Mi chiamo Pasquale Petrosino, radici campane, da alcuni anni sulle rive del lago di Lecco, dopo aver lungamente vissuto a Ivrea.
Ho attraversato 40 anni di tecnologia informatica, da quando progettavo hardware maneggiando i primi microprocessori, la memoria si misurava in kByte, e Ethernet era una novità fresca fresca, fino alla comparsa ed esplosione di Internet.
Tre passioni: la Tecnologia, la Matematica per diletto e le mie tre donne: la piccola Luna, Orsella e Valentina.
Potete contattarmi scrivendo a: p.petrosino@inchiostrovirtuale.it