
#FedericoNicolini
Glenn Fleishman è uno dei più quotati cronisti americani che seguono la tecnologia. In un suo vecchio articolo, aveva indagato su quale fosse il programma più vecchio (di cui si abbia notizia) ancora in funzione e aveva scoperto che era un applicativo scritto in Cobol, il linguaggio di programmazione creato nel 1959 per aiutare le grandi aziende di 60 anni fa a sfruttare la potenza dei primi calcolatori elettronici. Ma un linguaggio di programmazione così “antico” ha ancora senso? Non dovrebbe essere estinto, come i dinosauri? Quel programma è un’isola nel mare del Javascript e del Go, un’eccezione alla norma dei linguaggi più moderni, oppure no?
La risposta è semplice, ma è la domanda a essere sbagliata e tra un attimo vediamo perché. La risposta, intanto, è che il Cobol è tutt’altro che morto, anche se certamente non è più un linguaggio “popolare”, cioè con un’ampia comunità di sviluppatori che lo studia e lo supporta. Sempre negli Stati Uniti se lo sono chiesti quelli di Stack Overflow, uno dei più popolari siti “social” per programmatori, che hanno trovato anche una prima risposta: sarebbe un errore concettuale pensare che il Cobol non sia più utile solo perché datato.
Pensare che i programmatori “moderni” debbano usare solo Javascript e Go (o al limite Rust e Swift) perché più “nuovi” è un errore facile da commettere anche per molti informatici, perché dipende da un modello mentale sbagliato di cosa sono i linguaggi di programmazione, come funzionano e a cosa servono. Ma prima, dobbiamo fare un salto in avanti e capire un paio di cose.
Cosa sono i linguaggi
I linguaggi di programmazione sono lo strumento con il quale i programmatori traducono gli algoritmi in una serie di istruzioni che il computer può eseguire. Ne esistono tantissimi: l’History of Programming Languages (Hopl) ne ha documentati quasi novemila, di cui una cinquantina i più importanti. Ma, come per le lingue umane, sono teoricamente infiniti. Il modello mentale “sbagliato” che però spesso ci portiamo dietro è che i linguaggi di programmazione migliorino con il passare del tempo e delle generazioni. In realtà, le cose non stanno assolutamente così.
“Ci sono due aspetti da capire – dice Matteo Pradella, che insegna linguaggi di programmazione al Politecnico di Milano -. Il primo è capire a che cosa serve un determinato linguaggio. Perché linguaggi diversi fanno cose diverse, anche se ci sono stati vari tentativi nel corso del tempo per creare un linguaggio “definitivo” buono per tutti gli usi: dallo storico PL/I di Ibm [pdf, ndr] all’ambizioso Ada creato dalla Darpa. E tutti però hanno fallito“.
“A cosa serve” un linguaggio vuol dire chiedersi che potenza espressiva ha, cioè la sua comodità e predisposizione a fare meglio una determinata cosa rispetto a un’altra. Tuttavia, i linguaggi di programmazione sono “Turing-completi” e quindi capaci di implementare qualsiasi algoritmo. Solo ad alcuni determinati algoritmi vengono più facili che altri.
Il secondo aspetto è relativo al livello di astrazione a cui il linguaggio si pone, osserva Pradella: “C’è uno spettro di linguaggi, quelli più vicini al modo con il quale lavora la macchina e quelli più vicini a come ci esprimiamo noi: si dice cioè di basso o alto livello. Quelli di basso livello sono più efficienti, perché puoi fare più cose ma vanno conosciuti bene, sono molto verbosi e difficili da programmare perché il livello di astrazione non è molto alto. Invece, man mano che ci avviciniamo a linguaggi più comprensibili, diventa più facile scrivere il codice ma più difficile controllarlo: la distanza dalla macchina è molta e il controllo di conseguenza diventa molto poco”.
Per Pradella ci sono anche altre dimensioni da valutare: linguaggi interpretati e linguaggi compilati, le tecnologie dei compilatori e degli interpreti, gli approcci misti che uniscono le due cose, e infine quelli che si basano su una macchina virtuale, per esempio la Java Virtual Machine. E il Cobol? Quello ha una storia particolare.Algoritmi e programmi
Il Cobol, o meglio il Common business-oriented language, è stato il primo linguaggio di programmazione pensato per il mondo degli affari. Quando è stato progettato, negli anni Cinquanta, i ricercatori universitari non erano interessati al suo sviluppo perché non poneva problemi di natura teorica particolarmente interessanti da risolvere, e quindi è stato sviluppato solo per scopi “applicativi”.
Il suo sviluppo è stato finanziato dal Dipartimento della difesa americana ed è stato fatto partendo dal precedente linguaggio Flow-Matic progettato da Grace Hopper, una delle più importanti figure nella storia dell’informatica mondiale oltre che una delle primissime donne. Il Cobol serviva, e serve tutt’ora, alla gestione dei dati in ambienti di business: l’ultimo aggiornamento risale al 2014 e il suo “potere espressivo” era stato pensato per chi veniva dal mondo dell’industria e non dell’accademia. Un linguaggio pragmatico, utilizzato per scrivere 5 miliardi di nuove righe di codice all’anno usate da banche, assicurazioni, istituti nazionali di statistica, medie e grandi imprese, multinazionali. Si calcola che il 95% delle operazioni di un bancomat venga eseguita tramite software scritto in Cobol e che in totale ci siano 200 miliardi di righe di codice che gestiscono ogni giorno 30 miliardi di transazioni.Turing e la potenza espressiva
Ma cos’è la potenza espressiva di un linguaggio di programmazione? Come abbiamo detto prima, i linguaggi di solito sono Turing-completi, cioè hanno tutto quello che serve per implementare qualsiasi algoritmo (la definizione è di Alan Turing, uno dei numi tutelari dell’informatica), ma lo fanno ciascuno in maniera diversa. L’espressività e la potenza sono legate al tipo di costrutti del linguaggio, al suo livello di astrazione, alla bontà del compilatore e delle librerie (per questo spesso progetti più vecchi sono più maturi ed efficaci). E poi, non sottovalutiamolo, ma ci sono le mode.
“Ci si dimentica spesso – mi dice Pradella – che i linguaggi di programmazione hanno una parte sociale importante. Creano anche degli appassionati che si innamorano di una determinata scelta e poi cercano di trovare a posteriori motivi tecnici per cui quel particolare linguaggio “è meglio” di un altro”.
Insomma, anche gli informatici e gli studiosi delle università si lasciano prendere dai differenti approccio, dalla moda, dal marketing. “È stato il caso di quando Sun Microsystems, oggi assorbita dalla Oracle di Larry Ellison, ha creato Java – dice Pradella – investendo moltissimo nel marketing per “vendere” il suo linguaggio“. Risultato? Tifosi e partigiani di un linguaggio rispetto all’altro. Come per esempio il linguaggio C, creato nel 1972-1973 da Dennis Ritchie, uno dei padri di Unix, per programmare le utility necessarie al funzionamento del sistema operativo che è l’antenato di Linux, è alla base di macOS e fa girare buona parte di internet. Chiedere se è meglio il C o C++ è come parlare di guelfi e ghibellini nella Firenze di Dante Alighieri.
“Invece, secondo me – dice Pradella – un informatico dovrebbe essere uno che non è legato a dei linguaggi in particolare, ma dovrebbe essere abbastanza flessibile da cambiarli senza problemi. Anziché focalizzare sullo studio di uno molto popolare, come Java, al mio corso copro linguaggi accademici o relativamente poco usati, però ottimi rappresentanti del proprio paradigma di programmazione. Il mio obiettivo, più che far imparare questo o quel linguaggio, è far capire i concetti che ciascuno porta avanti”.
Le generazioni come piani di un palazzo
Se i linguaggi sono dei vocabolari e degli insiemi di regole per istruire il computer su come effettuare una specifica attività, li possiamo ordinare a seconda della loro astrazione dal computer: cioè in generazioni. Cinque per la precisione. Che non sono generazioni temporali (dai bisnonni ai pronipoti) ma sono come i piani di un palazzo.
La prima generazione è il livello più vicino alle fondamenta, cioè al modo di ragionare del processore fisico, che parla solo con gli uni e gli zeri. È il codice macchina, che viene eseguito senza bisogno di essere tradotto ma che è particolarmente ostico per un programmatore e vincolato a una determinata architettura di processore. La quinta è la più astratta, composta da linguaggi logici, cioè di tipo dichiarativo che applicano alla programmazione anche tecniche di intelligenza artificiale come i sistemi esperti, le regole di inferenza, il riconoscimento del linguaggio naturale. Tuttavia, non bisogna dimenticare anche un altro aspetto: i linguaggi di programmazione in realtà servono alle persone, non ai computer.La saggezza di Vim (ovvero programmare è un’attività sociale)
Il codice dei programmi è scritto su documenti di testo semplice, senza formattazione (a parte indentature e rientri) usando degli editor di testo. Uno tra gli editor storici è Vi, che dal 1991 è implementato con il progetto open source Vim (Vi Improved) tuttora gestito da Bram Moolenaar, una specie di Linus Torvalds per chi scrive codice.
Vi (il nome sta per Visual editor) è nato nel 1976, all’epoca dei primi terminali a tubo catodico (l’evoluzione delle schede perforate e poi delle telescriventi su carta per le quali si utilizzava Ed, cioè il primo editor di testo a linea) e partiva dal presupposto che gli utenti dovessero cambiare “modo” per scrivere codice oppure per scorrerlo e modificarlo. Lo stesso approccio viene usato anche da Vim.
Nonostante l’interfaccia dei computer sia radicalmente cambiata, Vim ancora oggi è popolare anche perché privilegia il modo “normale” di lettura e manipolazione del codice rispetto al modo “inserimento”, cioè di scrittura. Assieme ad altri tre modi alternativi di manipolazione del testo (“visuale”, dei “comandi” e di “sostituzione”) l’assunto di Vim è che i programmatori passano più tempo a rileggere e manipolare il codice che non a scriverlo. Questo e la potenza molto flessibile, la notevole difficoltà d’uso e l’interfaccia a riga di comando super-minimalista hanno reso oggi Vim l’editor per definizione.
Scrivere software, infatti, non è come scrivere un romanzo. È più simile a una partita a scacchi: si pensa molto e poi si fa velocemente una mossa, per rimettersi a pensare alla successiva (o rivedere le mosse già fatte). Inoltre, scrivere codice non è più uno sport solitario ma si pratica in squadra o in gruppo: il programmatore scrive in un determinato linguaggio con l’obiettivo di farsi leggere da altri programmatori e dal se stesso di domani, quando dovrà cioè rimettere mano al suo stesso codice.
Per questo motivo possiamo dire che i linguaggi di programmazione sono soprattutto strumenti per far comunicazione tra loro le persone. Devono essere letti, capiti, commentati, permettere delle correzioni da parte di altri e del futuro sé. I livelli di astrazione maggiori favoriscono soprattutto la comunicazione tra programmatori diversi e rendono più veloce la gestione dei progetti.
E il computer? Quello “capisce” solo il codice macchina, che è funzione dell’interprete o del compilatore e delle librerie. Ci sono linguaggi più efficienti di altri perché sviluppati meglio e di più (e in rete ci sono vari benchmark sulle implementazioni dei linguaggi) e classifiche (come questa) ma la verità è che alla fine i linguaggi di programmazione sono strumenti imperfetti costruiti con una intenzione predefinita per scopi specifici. Il Cobol è uno di questi, molto efficiente per la gestione di dati soprattutto di natura economica e finanziaria, pensato per analisti che provengono dal mondo del business e non dalle facoltà di matematica o fisica, e destinato a restare con noi ancora per lungo tempo. La metafora dei dinosauri semplicemente non si applica.