APL

Gabriele Santinelli

8 agosto 2008 Indice

Introduzione2

1 La notazione3 1.1 Breve storia della notazione matematica...... 3 1.2 L’importanza della notazione...... 6 1.3 La notazione Iverson...... 8

2 Il linguaggio APL 12 2.1 La Storia...... 12 2.2 Il linguaggio...... 14 2.2.1 Terminologia e regole...... 15 2.2.2 Qualche esempio...... 18 2.2.3 Le critiche...... 22 2.2.4 Il problema dei caratteri speciali...... 23 2.3 Interpreti contro compilatori...... 24 2.4 Utilizzo di APL...... 26

3 Il dialetto 27

4 Kenneth Iverson, biografia 31 4.1 Vita...... 31 4.2 Riconoscimenti...... 37

Bibliografia 39

1 Introduzione

APL è un linguaggio di programmazione di tipo matematico, sviluppato da IBM, che ebbe una significativa diffusione sui calcolatori mainframe degli anni ’60 e ’80. Oggi di APL rimane poco (un minimo numero di aziende ancora lo utilizza per fini commerciali), se non la comune opinione che si trattasse di un linguaggio inspiegabilmente complicato da imparare e terribilmente difficile da scrivere e - soprattutto- da leggere, come è testimoniato da questi versi in rima che ancora oggi molti utenti Unix e Linux possono leggere attraverso l’applicazione Fortune: ’Tis the dream of each programmer Before his life is done, To write three lines of APL And make the damn thing run. In realtà, mentre a prima vista può sembrare un linguaggio incomprensibile, fu concepito con l’intento diametralmente opposto. APL è stato sviluppato per essere un linguaggio semplice e facile da impare per chiunque abbia delle conoscenze matematiche di base. Caratteristica saliente del linguaggio, come avremo modo di vedere nel corso di questo lavoro, è la sua estrema concisione. L’ideatore di APL, Kenneth Iverson, viene ricordato per il suo desiderio di riassumere e sintetizzare in qualunque ambito, non solo in quello informatico. Amici e colleghi lo ricordano amichevolmente con la regola che ideò per spiegare al suo gruppo di lavoro come ridurre all’osso i documenti tecnici [20]: “Se è un paragrafo, rendilo una frase. Se è una frase, rendila un aggettivo o un avverbio. Se è un aggettivo o un’avverbio, omettilo. Applica questa regola ricorsivamente.” Questo lavoro vuole riassumere le caratteristiche del linguaggio APL e le sue radici storiche. Cominceremo, nel capitolo1, con un cenno all’importanza della notazione mate- matica e alla sua evoluzione. Nel capitolo2 proseguiremo descrivendo la nascita del linguaggio APL e le sue caratteristiche, senza però dimenticare le gravi proble- matiche che da sempre limitarono il suo sviluppo. L’attenzione si sposterà poi, nel capitolo3 sul dialetto J, sulle sue differenze rispetto ad APL e sulle novità introdotte. Infine, il capitolo4 raccoglierà la biografia di Kenneth Iverson, padre del linguaggio, il cui nome è inscindibilmente legato a quello di APL.

2 1 La notazione

1.1 Breve storia della notazione matematica

Nella società odierna siamo soliti imparare i simboli matematici da bambini, come se questi fossero dogmi tramandati a noi su tavole di pietra. In realtà i simbolismi che abbiamo imparato a maneggiare fin dalle scuole elementari hanno una storia e un’evoluzione secolare tutt’altro che scontata. Tale evoluzione è descritta, anche se sinteticamente, in [14].

Le principali notazioni matematiche oggi utilizzate hanno storie diverse. Ad esempio, il simbolo di addizione “+”, il primo che viene insegnato nelle scuole elementari di tutto il globo, è probabilmente un’abbreviazione del latino et, mentre il simbolo di sottrazione “-” si pensa sia un semplice trattino usato dai mercanti per separare le indicazioni della tara (che nell’antichità veniva chiamata minus) dal peso totale della merce. Questi simboli furono usati per la prima volta da Recorde1 nel 1557 nel libro “The Whetstone of Witte”, lo stesso sul quale comparve il simbolo di uguaglianza “=”: due trattini paralleli, che scelse “perchè non esistono due simboli più uguali di quelli”. La sigma “Σ”, invece, venne probabilmente scelta perchè ricorda la somma; mentre la epsilon “∈” è la prima lettera del greco esti (letteralmente “è un”) che suggerisce un’appartenenza. Anche il simbolo di integrale “R ” (una ”S” allungata) e quello di derivata “d”, introdotti da Leibniz, stanno a ricordare la prima lettera dei termini latini summa e differentia. Per indicare l’abbreviazione di una parola, era pratica comune sbarrare la prima o l’ultima lettera. Questo spiega il simbolo ancora oggi usato della Sterlina inglese (“£”, dal latino libra); del Dollaro (“$”, un’abbreviazione di pesos); del centesimo Americano ( ). ¢ Verso la fine del XVII secolo l’uso consapevole del simbolismo nei testi mate- matici era oramai una pratica consolidata, ma non tutti i simboli venivano facilmente accettati negli ambienti scientifici. Nel 1631, quindici anni dopo aver introdotto la croce di Sant’Andrea “×” come simbolo della moltiplicazione e aver esorta-

1Robert Recorde (1510-1558), fisico e matematico britannico. Scrisse diversi libri di aritmetica, geometria e astronomia sotto forma di di dialoghi tra maestro e alunno [1].

3 1.1 Breve storia della notazione matematica 4

Figura 1.1: La prima rappresentazione scritta di una notazione matematica. to la comunità matematica ad utilizzarlo, Oughtred2, nel libro intitolato “Clavis Mathematicae” , scrisse:

“My Treatise being not written in the usuall synthetical manner, nor with verbous expressions, but in the inventive way of Analitice3 and with symboles or notes of things instead of words, seemed unto many very hard; though indeed it was but their owne diffidence, being scared by the newness of the delivery; and not any difficulty in the thing it selfe.

Anche l’introduzione del sistema di numerazione arabo, caldeggiato da Fibo- nacci4 nel 1202, fece molta fatica ad essere accettato: per molte persone era più semplice continuare a sommare e sottrarre col sistema numerico Romano, dal mo- mento che questo era sufficiente per i loro bisogni. Inoltre si pensava, non a torto, che i conti nel nuovo sistema di numerazione potessero essere facilmente falsificati, per esempio cambiando lo 0 in 6 o in 9. I numeri arabi fecero la loro prima comparsa sulle monete italiane con due secoli di ritardo, nel 1424; su quelle inglesi nel 1551.

Ma facciamo un passo indietro, perchè quelle notazioni che in tempi -tutto sommato- moderni hanno impiegato decine di anni per essere comunemente accet- tate, già esistevano in popolazioni antiche, seppure in forma molto più elementare, ed erano utilizzate quotidianamente, in primo luogo negli scambi commerciali o per il pagamento dei tributi. Quella che può essere indicata come la prima traccia di una notazione matematica è stata rinvenuta scolpita su un masso di granito risalente al 3100 a.C., prima ancora dell’invenzione del papiro.

2William Oughtred (1575-1660), matematico inglese. Inventò nel 1622 il regolo calcolatore. Oltre al già citato simbolo della moltiplicazione, introdusse le notazioni “sin” e “cos” per indicare rispettivamente seno e coseno [1]. 3Nonostante questo brano venga spesso citato, non sono riuscito a trovare una spiegazione di chi o cosa sia l”’Analitice“ cui viene fatto riferimento. 4Leonardo Fibonacci (1170-1250), matematico pisano. Oltre al merito di aver introdotto il siste- ma di numerazione arabo, i suoi studi sulla crescita delle popolazioni di conigli lo portarono alla definizione della successione di Fibonacci (serie in cui ogni cifra è la somma delle due precedenti [1]). 1.1 Breve storia della notazione matematica 5

Figura 1.2: I simboli che costituiscono la notazione matematica egizia.

Figura 1.3: Alcuni esempi di numeri scritti in notazione egizia.

Una raffigurazione di questo reperto è illustrata in figura 1.1. Si tratta di un reso- conto del trionfo di Narmer5, per poterlo leggere abbiamo bisogno della figura 1.2 come chiave di lettura. In questo modo riusciamo a capire che Narmer catturò 400 000 buoi, 1 422 000 capre e 120 000 prigionieri. Nella numerazione egizia, infatti, i simboli corrispondono a potenze crescenti di 10, cioè rispettivamente ai valori 1 (un bastoncino), 10 (un bastoncino ripiegato), 100 (una corda arrotolata), 1 000 (un fiore di loto6), 10 000 (un dito), 100 000 (una rana), 1 000 000 (una persona con le braccia al cielo). Gli altri numeri si scrivevano ripetendo questi simboli il numero di volte necessario per arrivare al valore voluto, come mostrato negli esempi di figura 1.3. La base usata è quella decimale e, come nel sistema Romano, è assente la notazione posizionale. Per alcuni studiosi la loro origine porebbe essere legata a questioni fonetiche; per altri i simboli potevano essere direttamente ricollegati a questioni più pratiche, per esempio la corda era uno strumento comunemente usato dagli Egizi per misurare i campi e la principale unità di misura era il khet, pari a 100 cubiti, da qui il simbolo della corda per indicare il numero 100. Essendo la notazione matematica egizia di tipo additivo, il calcolo delle addi- zioni era banale (ed analogo a quello romano): per addizionare due o più valori

5Narmer, Re dell’Egitto che fondò la prima dinastia che univa l’alto e il basso Egitto. 6Loto, pianta acquatica dai grandi fiori bianchi o rosa. 1.2 L’importanza della notazione 6 bastava infatti mettere insieme i simboli di ciascuno degli addendi, ed eventualmente effettuare le opportune semplificazioni sostituendo dieci occorrenze di uno stesso simbolo col simbolo di ordine maggiore. La tecnica per eseguire la moltiplicazione, invece, era basata su raddoppi successivi: del resto eseguire un raddoppio di numeri scritti in geroglifico è cosa piuttosto immediata poichè essenzialmente basta ripetere due volte ogni simbolo del numero da raddoppiare ed eventualmente effettuare le opportune semplificazioni. Questo sistema di calcolo è stato definito “rozzo” , ma per molto tempo nessuna popolazione fu in grado di sviluppare un sistema migliore. D’altra parte i metodi di calcolo degli Egizi non sono del tutto scomparsi neppure oggi: basti pensare che il System/3607, uno dei primi calcolatori in commercio ad integrare un interprete APL, utilizzava un sistema per il calcolo delle moltiplicazioni del tutto simile a quello usato dagli scribi circa 4000 anni or sono. Questa tecnica, detta “dei raddoppi” è descritta in [19]. Per quanto assurdi ci possano sembrare oggi i simboli Egizi, essi racchiudono un messaggio tutto sommato semplice. L’idea di racchiudere in un simbolo un’ope- razione ben nota o facilmente comprensibile è ciò che sta anche alla base di APL, come tra poco vedremo.

1.2 L’importanza della notazione

Se già nell’antichità il concetto di notazione matematica era ampiamente utilizzato, ci possiamo domandare quali fossero i motivi che hanno spinto generazioni di matematici ad utilizzare e ad innovare in continuazione i simbolismi della loro materia di studio. Ancora una volta ci vengono in aiuto le intuizioni di importanti matematici del passato. Lavoisier8 in una memoria del 1787 mette in evidenza il fatto che la matematica è un linguaggio vero e proprio: “L’algebra è il metodo analitico per eccellenza; è stata inventata per facilitare l’apprendimento, per rendere un ragionamento più conciso e per riassumere in poche righe quello che avrebbe richiesto intere pagine di discussione; infine per portare, in un modo più gradevole e conciso, alla soluzione del più complicato dei problemi. Basta un attimo di riflessione per convincersi che l’algebra è di fatto un linguaggio: come tutti gli altri linguaggi ha i suoi simboli caratteristici, le sue regole e la sua grammatica.” Da queste parole appare evidente che uno dei maggiori benefici introdotti dall’utilizzo di una notazione ricca di simboli è la sua concisione, ma perchè un

7IBM System/360, famiglia di calcolatori mainframe annunciata dall’IBM nel 1964. Fu la prima famiglia di calcolatori a distinguere chiaramente tra architettura e implementazione, permettendo così di progettare una serie di calcolatori compatibili a diverse fasce di prezzo. 8Antoine Laurent Lavoisier (1743-1794), chimico francese ricordato come fondatore della chimica moderna. Isolò i principali componenti dell’aria e confutò la teoria del flogisto scoprendo il ruolo dell’ossigeno nei processi di combustione. Fu giustiziato durante la rivoluzione francese [1]. 1.2 L’importanza della notazione 7 testo breve è da preferirsi ad uno esteso? Nel 1821, nel suo “On the influence of signes in mathematical reasoning”, Babbage9 sostiene che se i diversi passi di cui un ragionamento è costituito sono tra loro molto distanti, il cervello umano fa troppa fatica ad unirli e il risultato del ragionamento perde così in accuratezza.

“La grande quantità di informazioni compresse in un piccolo spazio mediante i simboli è una circostanza che facilita il ragionamento che siamo abituati a portare avanti grazie al loro aiuto. [...] Il potere che ci è dato dalla capacità dei simboli di comprimere in un piccolo spazio i diversi tasselli della catena del ragionamento, se da un lato contri- buisce sostanzialmente ad accorciare il tempo che la nostra ricerca avrebbe altrimenti occupato, in casi complicati influenza l’acuratezza delle nostre conclusioni: per via della grande distanza che talvolta è interposta tra l’inizio e la fine di una catena di ragionamento, sebbene le singole parti siano sufficientemente chiare, l’intero ragionamento risulta spesso oscuro. [...] Più piccole sono le successioni tra due idee che il nostro cervello mette a confronto, purchè queste idee siano percepite chiaramente, più accurato sarà il risultato.”

Ma l’idea che ridurre al minimo il linguaggio matematico fosse di fondamentale importanza, era condivisa anche da molti altri studiosi. Sylvester10, nel 1877, circa il lavoro del matematico, disse:

“L’intento costante del matematico è quello di ridurre tutte le sue espressioni ai minimi termini, per eliminare ogni parola e frase su- perflua, e per condensare il massimo del significato nel minimo del linguaggio.”

Non si possono poi dimenticare le parole di Giuseppe Peano11, definito da Bertrand Russell12 “il grande maestro dell’arte del ragionamento formale, colui che ha ridotto gran parte della matematica ad una precisa forma simbolica nella quale non compare parola alcuna”, tratte da “The importance of symbols in mathematics” del 1915: 9Charles Babbage (1791-1871), matematico e filosofo britannico che per primo ebbe l’idea di un calcolatore programmabile. Inventò un calcolatore meccanico, l’“Analytical Engine” che è considerato il precursore dei moderni calcolatori [1]. 10James Joseph Sylvester (1814-1897), matematico britannico. Noto per i suoi risultati nell’algebra e nella matematica discreta. Diede contributi fondamentali alla teoria delle matrici, alla teoria degli invarianti, alla teoria dei numeri, alla teoria della divisibilità e al calcolo combinatorio. Partecipò inoltre alla creazione del primo giornale matematico in America [1]. 11Giuseppe Peano (1858-1932), matematico e glottoteta piemontese. Fu l’inventore del latino sine flexione, una lingua ausiliaria internazionale derivata dalla semplificazione del latino classico [1]. 12Bertrand Arthur William Russell (1872-1970), matematico, filosofo e scrittore britannico che ebbe grande influenza nello sviluppo della logica matematica e nella filosofia analitica del XX secolo. Vinse il premio Nobel per la letteratura nel 1950 [1]. 1.3 La notazione Iverson 8

“I più antichi dei simboli, che sono anche i più usati oggigiorno, sono le cifre usate in aritmetica, che abbiamo imparato nel 1200 circa dagli Arabi, che a loro volta li avevano imparati dagli Indiani, che li usavano attorno al 400. Il primo vantaggio che si può notare nelle cifre è la loro concisione. [...] L’uso delle cifre non solo rende le nostre espressioni più corte, ma rende anche i calcoli aritmetici fondamentalmente più facili, e quindi rende possibili certi compiti, e permette di ottenere certi risultati, che non potevano essere ottenuti altrimenti. [...] La stessa cosa può essere detta per i simboli dell’algebra. [...] Le equazioni algebriche sono molto più corte rispetto alle stesse espressioni nel linguaggio ordinario, sono più semplici, più chiare, e possono essere usate nei calcoli. Questo perchè i simboli algebrici rappresentano idee e non parole. [...] I simboli algebrici sono molto meno numerosi rispetto alle parole che permettono di rappresentare. [...] L’uso dei simboli algebrici permette agli scolari di risolvere facilmente problemi che in precedenza solo cervelli del calibro di Euclide e Diofanto di Alessandria erano in grado di risolvere.” Anche Leibniz13 riconobbe il grande potenziale della notazione matematica, tanto da voler realizzare una notazione simbolica che permettesse di formalizzare anche i ragionamenti umani. Cercò quindi di creare un “alfabeto del pensiero uma- no” (da lui chiamato mathesis universalis), nel quale rappresentare tutti i concetti fondamentali usando simboli, e combinando questi simboli per formare pensieri più complessi. Questo avrebbe dovuto permettere di riconoscere frasi o ragionamenti errati analogamente a quanto avviene con una dimostrazione matematica (il proce- dimento prendeva il nome di calculus ratiocinator), come Leibniz stesso scrisse in [16]: “Di conseguenza, quando sorgeranno controversie fra due filosofi, non sarà più necessaria una discussione, come non lo è tra due calcolatori. Sarà sufficiente, infatti, che essi prendano in mano le penne, si siedano di fronte agli abachi e (se così piace, su invito di un amico) si dicano l’un l’altro: «Calculemus!»” Questo ambizioso progetto, però, non giunse mai ad una conclusione restando così di fatto un sogno.

1.3 La notazione Iverson

L’idea espressa da Peano secondo la quale i simboli che costituiscono la notazione matematica non sono semplicemente la traduzione di alcune parole, bensì costitui- scono qualcosa di più importante, che permette di compiere ragionamenti raffinati,

13Gottfried Wilhelm von Leibniz (1646-1716), filosofo e matematico tedesco. A lui si deve il termine matematico di “funzione”. Assieme ad Isaac Newton diede grande contributo allo sviluppo del calcolo infinitesimale moderno, con particolare accento sul calcolo integrale [1]. 1.3 La notazione Iverson 9 venne in seguito ripresa da Kenneth Iverson nel saggio del 1979 dal titolo “Notation as a tool of thought” [19]. Mentre fino ad allora l’evoluzione della notazione matematica aveva riguardato semplicemente l’introduzione di nuovi simboli o l’aggiornamento di quelli già esistenti (e abbiamo visto con quali difficoltà...), a Iverson va il merito di aver voluto rivedere per intero la notazione matematica correntemente utilizzata. Lui stesso, pur riconoscendone le grandi opportunità che permetteva, in [19] affermò:

“La notazione matematica ha le sue serie lacune. In particolare, man- ca di universalità, e deve essere interpretata in maniera differente a seconda dell’argomento, a seconda dell’autore, e addirittura a seconda del contesto.”

In particolare Iverson notò evidenti inconsistenze nella sintassi che tutt’oggi utilizziamo. A titolo di esempio: la sommatoria ha il suo argomento a destra; il fattoriale a sinistra; il valore assoluto occupa entrambi i lati del suo argomento; l’esponenziale non ha affatto simboli in quanto il suo secondo argomento è sopra- scritto. Considerò inoltre quali altre funzioni potevano essere considerate utili a tal punto da meritare un simbolo grafico. Iverson iniziò così a pensare a una notazione priva di questi problemi, e che po- tesse essere utilizzata con semplicità anche dai suoi studenti. Inizialmente individuò alcune caratteristiche fondamentali per qualsiasi notazione; eccone un riepilogo, per la trattazione estesa si rimanda a [19]:

• Universalità: la notazione deve essere il più generale possibile in modo da non essere vincolata al solo ambito matematico.

• Eseguibilità: deve essere possibile usare il calcolatore per effettuare esperi- menti approfonditi sulle idee espresse nella notazione.

• Possibilità di esprimere costrutti nati dai problemi: deve permettere di espri- mere in maniera chiara non solo le nozioni che nascono direttamente da un problema, ma anche quelle che nascono da una sua successiva analisi, generalizzazione e specializzazione.

• Intuitività: le espressioni che si usano per certi problemi possono essere estese a problemi di tipo diverso.

• Abilità di subordinare i dettagli: la concisione essenziale a qualunque nota- zione di tipo scientifico può essere ottenuta subordinando i dettagli (per farlo individuò tre strade: l’uso degli array; l’assegnare nomi a funzioni e variabili; l’uso degli operatori.

• Economicità: una grande quantità di idee deve essere esprimibile in termini di un vocabolario relativamente piccolo. 1.3 La notazione Iverson 10

• Possibilità di utilizzo per dimostrazioni formali: l’importanza delle dimostra- zioni formali è chiara dal loro ruolo in matematica, la notazione deve poter essere usata per formulare diversi tipi di dimostrazioni formali (prove per induzione, prove esaustive, ecc...).

Iverson stabilì però che la priorità della sua notazione dovesse essere posta sulla semplicità. Teorizzò così che la semplicità notazionale potesse essere raggiunta in quattro modi, tutti ugualmente importanti:

• Uniformità: le regole devono essere poche e semplici.

• Generalità: un piccolo numero di funzioni generali forrnisce, come casi speciali, un numero maggiore di funzioni specializzate.

• Familiarità: quando possibile devono essere utilizzati simboli familiari e di uso comune.

• Concisione: necessaria per ottenere un linguaggio snello.

Dall’analisi delle problematiche sopra evidenziate (e di altre che vedremo in seguito), intorno al 1957 Iverson ideò una nuova notazione, in seguito chiamata “notazione Iverson”, il cui scopo dichiarato era quello di rendere più facile ed efficace l’insegnamento dell’algebra ai propri studenti (da qui l’interesse verso una notazione semplice) e che nel giro di alcuni anni sarebbe diventata il cuore del linguaggio APL. La notazione Iverson fu ampiamente descritta nel 1962 nel libro “A Program- ming Language” [4]; venne inizialmente usata (da Iverson, colleghi e sostenitori) con finalità didattiche o per descrivere in maniera formale formule matematiche o algoritmi da implementare al calcolatore. In [13] Michael Montalbano14, che allora lavorava alla facoltà di Economia di Stanford per conto di IBM, ricorda:

“Per un insieme di problemi di difficoltà crescente, scrivevo la solu- zione usando la notazione del libro “A ”, poi chiedevo allo studente che mi era stato assegnato di scrivere la proce- dura in un linguaggio di programmazione a sua scelta, di eseguirla per un insieme rappresentativo di dati, e infine di consegnarmi i risultati in modo tale che li potessi confrontare con le soluzioni che mi ero precedentemente calcolato. In tutti i casi, cosa che ancora adesso trovo impressionante e sorprendente, quello che era stato programmato era esattamente quello che avevo descritto nelle specifiche.”

14Michael S. Montalbano, dipendente IBM, da sempre grande sostenitore e utilizzatore del linguag- gio APL. A proposito del suo primo incontro con Kenneth Iverson ricorda: “Ero scettico. Ciononostan- te, quando seppi che l’autore di molti di quei testi pieni di lettere greche, sbarrette, cerchietti, riccioli e altri simboli cabalistici sarebbe venuto a San Jose per divulgare le sue idee, decisi che dovevo leggere uno o due dei suoi scritti in preparazione alla conferenza. Da allora, la mia vita non fu più la stessa.”. 1.3 La notazione Iverson 11

Nel Centro di Ricerca IBM la notazione Iverson fu inizialmente usata da Fal- koff15 e Iverson per descrivere l’architettura del System/360 [5]. La descrizione ottenuta era molto più precisa e sintetica di quella esistente e portò alla luce diversi problemi che precedentemente non erano stati notati. Ci volle ancora qualche anno, però, prima che la notazione si trasformasse in un linguaggio di programmazione, arricchendosi quindi di quella caratteristi- ca, l’eseguibilità che già precedentemente Iverson aveva considerato di grande importanza.

15Adin Falkoff, ricercatore IBM fin dai primi anni ’50, lavorò a stretto contatto con Iverson per lo sviluppo di APL, durante i suoi anni in IBM. 2 Il linguaggio APL

2.1 La Storia

Come già menzionato, la notazione Iverson fece la sua prima pubblica apparizione nel 1962, nel libro intitolato “A Programming Language” [4], che esordiva con queste parole:

“La matematica applicata è principalmente interessata alla proget- tazione e all’analisi di procedure esplicite per calcolare l’esatta ap- prossimazione dei valori di varie fuzioni. Queste procedure esplicite sono chiamate algoritmi o programmi. Dal momento che una notazione efficace per la descrizione dei programmi mostra una considerevole struttura sintattica, viene chiamata un linguaggio di programamzione. Gran parte della matematica applicata, in particolar modo quella degli ambiti legati ai recenti calcolatori che superano le vecchie discipline, soffre della mancanza di un’adeguato linguaggio di programmazione. La tesi centrale di questo libro è che il potere analitico e descrittivo di un adeguato linguaggio di programmazione ripaga ampiamente lo sforzo richiesto per la sua padronanza.”

Ci vollero però alcuni anni prima che un sottoinsieme della notazione descritta nel libro venisse implementata da IBM Research Division come linguaggio di programmazione. Il primo linguaggio sviluppato fu PAT (Personalized Array Translator) e con- sisteva in un sistema interpretativo in grado di eseguire un insieme limitato di operazioni su array. PAT rese evidente che un sistema del genere poteva funzionare con successo e motivò lo sviluppo delle macchine da scrivere della serie IBM Selectra1. IVSYS (IVerson SYStem), invece, fu il primo tentativo di portare la notazione Iverson su un calcolatore mainframe (l’IBM 7090): non fu però commercializzato e restò un prototipo ad uso interno.

1IBM Selectra, serie di macchine da scrivere adatte a scrivere in notazione Iverson. I caratteri speciali non presenti direttamente sulla tastiera potevano essere ottenuti con combinazioni di altri caratteri esistenti.

12 2.1 La Storia 13

Figura 2.1: Il gruppo di lavoro dell’IBM\360.

Come lo stesso Iverson notò in [11], il fatto che passarono svariati anni prima che un’implementazione dell’interprete APL fosse resa pubblica ebbe anche risvolti positivi:

“La mancanza di una realizzazione commerciale del linguaggio duran- te i primi sette o otto anni del suo sviluppo permise ai progettisti di fare cambiamenti radicali, una libertà di cui normalmente non possono godere i progettisti se un grande numero di persone lavora già col linguaggio.”

APL fece la sua prima comparsa pubblica nel 1967 sull’IBM 11302 (con il nome di APL\1130) [12], anche se l’implementazione più nota è quella realizzata per l’IBM System/360 (APL\360): questa fu la prima versione “completa”, nel senso che implementava l’intera notazione. Il nome APL, scelto da , voleva essere un richiamo al nome del libro di Iverson del 1962, “A Programming Language” [4]. La cosa interessante è che APL venne usato anche come strumento di progettazione: il programma supervisore, ad esempio, fu modellato in APL e, mano a mano che il codice dell’interprete veniva sviluppato, il modello veniva eseguito su di esso come validazione.

2IBM 1130, fu commercializzato per la prima volta nel 1965; all’epoca era il calcolatore meno costoso di casa IBM. 2.2 Il linguaggio 14

Una prima variante di APL\360 fu CMS/APL, prodotta del Centro Scientifico IBM di Cambridge. L’innovazione principale fu l’introduzione di uno spazio di lavoro (workspace) a dimensione variabile (in precedenza era fissato a 32 Kbytes). Una grande lacuna di APL\360 era l’impossibilità di importare o esportare informazioni se non tramite macchina da scrivere. Nel 1973 tale aspetto venne risolto con l’uscita di APLSV, che introduceva le variabili condivise per accedere a risorse esterne ad APL (quale ad esempio il filesystem); la scelta delle variabili condivise fu dovuta al fatto che questo approccio non avrebbe compromesso l’integrità e la generalità del linguaggio, in quanto permetteva di evitare l’introduzione di funzioni speciali per manipolare i files. Tra gli anni ’60 e gli anni ’70 nacquero molti marchi che vendevano servizi APL usando versioni modificate dell’interprete IBM APL\360. Tra queste le più note furono I.P. Sharp Associates, Scientific Time Sharing Corporation e The Computer Company. A cominciare dai primi anni ’80, IBM sotto la guida di Jim Brown3 implementò una nuova versione del linguaggio APL, nota con il nome di APL2. Tale versione si basava sul precedente APLSV e introduceva svariate migliorie, tra le quali: l’uso degli array annidati, dove un array poteva a sua volta contenere altri array; l’intro- duzione dei numeri complessi; la possibilità da parte degli operatori di accettare funzioni come operandi. Ken Iverson, però, non partecipò allo sviluppo del linguag- gio, dal momento che era ormai passato a lavorare per la I.P. Sharp Associates. Nei primi anni ’90 l’uscita di APL2 Workstation Edition rese disponibile l’interprete APL anche sulle piattaforme Windows, OS/2, AIX, Linux e Solaris. Moltissimi produttori di calcolatori svilupparono i loro interpreti APL, tra questi Burroughs, CDC, Data General, DEC, Harris, Hewlett-Packard, Siemens, Xerox... Uno degli interpreti più noti fu Sharp APL; si trattava di una implementazione migliorata di APL comprendente molte estensioni al linguaggio, come i packages4, l’accesso al filesystem, gli array annidati e le variabili condivise. Iverson, dopo il suo periodo in IBM, diresse lo sviluppo di Sharp APL, con l’intento di renderlo più aderente alla sua visione. Nonostante questa miriade di versioni differenti disponibili, APL2 di IBM rimase -ed è tutt’ora- lo standard de facto. Ancora oggi la maggioranza dei produttori di interpreti APL citano la compatibilità dei loro prodotti con APL2.

2.2 Il linguaggio

La notazione sviluppata da Kenneth Iverson, permette al linguaggio APL di essere estremamente conciso, ma allo stesso tempo espressivo e potente, in un vasto insieme di campi (matematica, scienze, ingegneria, progettazione di calcolatori, robotica, visualizzazione di dati...).

3James A. Brown, manager del gruppo IBM, più tardi fondatore della società Smart Arrays 4I packages permettevano di inserire uno o più oggetti in una singola variabile. 2.2 Il linguaggio 15

APL è semplice da imparare, anche per una persona senza precedenti esperienze di programmazione; tuttavia, vista l’estrema concisione del linguaggio e la grande quantità di simboli speciali utilizzati, certi programmi possono richiedere parecchio tempo per essere capiti, in modo particolare per chi ci si avvicina per la prima volta. APL non è un linguaggio strutturato come il C o il Fortran: questo significa che in APL il flusso non è controllato da costrutti quali i cicli WHILE e FOR o l’IF-THEN-ELSE, tipici dei linguaggi strutturati5. APL è piuttosto un linguaggio ad array, nel senso che le sue grandi potenzialità si basano sulla sua capacità di gestire gli array e le operazioni su di essi; l’assenza dei costrutti WHILE, FOR, IF-THEN-ELSE, infatti, non costituisce un limite del linguaggio, in quanto l’uso delle operazioni su array rende tali costrutti non necessari6. In APL una variabile viene legata al suo tipo a tempo di esecuzione (binding dinamico dei tipi). Questo permette di non dover dichiarare le variabili e rende possibile cambiarne il tipo durante l’esecuzione. Il codice è strutturato come una catena di funzioni monadiche o diadiche e di operatori che agiscono su array. Dal momento che APL ha molte primitive (funzioni o operatori indicati da un unico simbolo), non esistono regole di precedenza tra di esse. Dal punto di vista della velocità di calcolo, APL era generalmente meno per- formante dei linguaggi di programmazione strutturati, ma permetteva di ottenere risultati straordinari quando usato per il calcolo di complesse operazioni tra matrici. Una moltiplicazione tra matrici di grandi dimensioni impiegava solo alcuni secondi su dei calcolatori che erano molto meno potenti di quelli odierni7.

2.2.1 Terminologia e regole Passiamo ora ad esaminare alcuni aspetti pratici legati all’utilizzo di APL.

L’insieme dei caratteri In APL l’unità di informazione è il carattere. L’insieme dei caratteri utilizzati è riportato in figura 2.2; si suddividono in vari gruppi: (a) i caratteri alfabetici, (b) i caratteri alfabetici sottolineati, (c) i caratteri numerici, (d) i caratteri speciali e (e) i caratteri speciali composti. Per quanto riguarda i caratteri alfabetici, si scelse la scrittura maiuscola perchè maggiormente comprensibile, inoltre la formattazione in corsivo fu adottata per permettere di distinguere tra loro alcuni caratteri come il numero zero “0” dalla

5Pressochè tutte le implementazioni recenti di APL hanno introdotto i costrutti del tipo WHILE, FOR, IF-THEN-ELSE. Benchè questi possano tornare utili in particolari situazioni, di fatto ne è sconsigliato l’utilizzo, non solo per motivi di semplicità del codice, ma anche perchè la loro esecuzione è poco performante. 6Ad esempio, la funzione iota, utilizzata per produrre un vettore da 1 a N, può essere usata per rimpiazzare i cicli dei linguaggi strutturati. 7Per un confronto tra la velocità di APL e quella di altri linguaggi si veda http://www. chilton.com/~jimw/bnchmrks.html 2.2 Il linguaggio 16

Figura 2.2: L’insieme di caratteri di APL. lettera “O” maiuscola o la “L” maiuscola dalla funzione di minimo “b”. I caratteri alfabetici sottolineati, invece, furono eliminati o deprecati in molte implementazioni recenti di APL.

Funzioni e operatori APL distingue chiaramente tra funzioni e operatori. Le funzioni prendono valori (siano essi costanti, variabili o espressioni) come argomenti e ritornano valori come risultati. Gli operatori (anche detti funzioni di ordine superiore), invece, accettano funzioni come argomenti e restituiscono funzioni diverse come risultato. La valenza di una funzione è il numero di argomenti che essa accetta. Le primitive di APL hanno tutte valenza 1 (in tal caso si parla di funzioni monadiche) o 2 (funzioni diadiche), mentre -come di consueto- le funzioni create dagli utenti posso avere anche valenza 0. Le primitive sono costituite da funzioni e operatori predefiniti nel linguaggio, a ognuna è associato un simbolo. La forma di ogni primitiva segue 2.2 Il linguaggio 17 il modello aritmetico tradizionale: il simbolo di una primitiva diadica compare in mezzo ai suoi argomenti (come nel caso dell’addizione “2+3”), mentre quello di una primitiva monadica compare prima dell’argomento (come nel caso della negazione aritmetica “-4”). Le primitive sono in tutto una quarantina (il loro numero varia a seconda della versione di APL considerata). C’è da osservare che lo stesso simbolo spesso rappresenta funzioni diverse, a seconda che siano monadiche o diadiche. Il simbolo “-”, ad esempio, quando prende due argomenti è associato alla funzione sottrazione, mentre quando prende un unico argomento viene interpretato come negazione aritmetica. Tale scelta fu fatta per limitare il numero di simboli utilizzati, dal momento che una tastiera tradizionale non poteva contenere più di 88 caratteri diversi. Ogni primitiva su scalari funziona anche su array con lo stesso principio: per esempio la funzione somma può essere utilizzata per sommare uno scalare a tutti gli elementi di un array V, per esempio con “3+V”, cosa non ammessa nell’algebra convenzionale. Ci si chiederà come sia possibile in APL costruire funzioni che accettino un numero di argomenti maggiore di due, come ad esempio la funzione f(a,b,c,d). La risposta è semplice: si utilizza una funzione monadica e la si applica al vettore di elementi a,b,c,d8. Per rendere la notazione familiare a chiunque conosca i fondamenti dell’algebra elementare, si decise di conservare tutti i simboli tradizionali (come ad esempio: +, -, ×, ÷) con l’eccezione di quelli che costituiscono anomalie (vedi sezione 1.3), ad esempio il fattoriale di N si ottiene con “!N”, mentre il valore assoluto con “|N”. Tornando agli operatori, invece, in APL sono cinque: la riduzione, la scansione, il prodotto interno, il prodotto esterno e l’operatore di asse. A titolo di esempio esaminiamo l’operatore di riduzione, il cui uso è molto frequente specialmente per ottenere le funzioni matematiche di sommatoria e di produttoria. Esso è rappresenta- to dal simbolo “/”, prende come argomento sinistro una funzione e come argomento destro un vettore. La scrittura “+/V”, ad esempio, equivale alla sommatoria di tutti gli elementi presenti nel vettore V e restituisce come risultato uno scalare. Analoga- mente per ottenere il valore massimo di un vettore V applicheremo l’operatore di riduzione alla funzione di massimo “d”, ottenendo: “d /V”.

Lo spazio di lavoro L’ambiente di APL è chiamato spazio di lavoro (workspace). Nello spazio di lavoro l’utente può definire i programmi e i dati, può inoltre manipolare i dati senza bisogno di dover definire un programma. Ad ogni pressione del tasto invio l’espressione digitata viene interpretata e il risultato, se non è stato assegnato a nessuna variabile, viene mostrato nella riga successiva dello spazio di lavoro in posizione rientrata; in

8Nell’implementazione di APL\360 gli elementi a,b,c,d dovevano essere dello stesso tipo, ma un’implementazione più generale degli array, introdotta assieme al concetto di array annidati, conferì maggiore flessibilità al linguaggio. 2.2 Il linguaggio 18 caso di errori questi compaiono al posto del risultato. L’utente può salvare lo spazio di lavoro con tutte le sue variabili, i programmi, e il loro stato di esecuzione per un successivo utilizzo. APL ammette alcuni comandi di sistema che, tra le altre cose, permettono la gestione dello spazio di lavoro. Tali comandi sono preceduti dal simbolo di parentesi chiusa “)”: ad esempio “)SAVE” serve a salvare lo spazio di lavoro attivo in memoria, “)LOAD” serve a ricaricarlo, mentre “)VARS” stampa il valore di tutte le variabili globali attive.

Regole di precedenza In APL ogni primitiva dipende unicamente dagli argomenti immediatamente vicini; allo stesso modo l’interpretazione di ogni espressione è indipendente dalle altre espressioni del programma. Questo aumenta significativamente la leggibilità e la facilità di implementazione del linguaggio. La maggior parte dei linguaggi di programmazone strutturati sfrutta regole di precedenza (ovvero, operazioni di moltiplicazione e divisione hanno la precedenza su quelle di somma e sottrazione). Questa regola fu scelta perchè rende le parentesi non necessarie nello scrivere espressioni polinomiali. In APL, però, le primitive sono una quarantina circa; cercare di stabilire delle regole di precedenza su un tale numero di operazioni sarebbe risultata una complicazione inutile per il programmatore che avrebbe dovuto ricordarle tutte. In fase di progettazione si decise quindi di non stabilire nessuna regola di precedenza: l’esecuzione del codice avviene sempre da destra a sinistra; per cambiare questa regola è sufficiente utilizzare le parentesi9 nella maniera usuale. Questa decisione ha alcuni vantaggi pratici per l’utente: in primo luogo un’e- spressione senza parentesi è facile da leggere da sinistra a destra, perchè la prima funzione incontrata è quella principale, la successiva è la funzione principale nel- l’argomento destro della precedente, e così via... In secondo luogo un’espressione priva di parentesi è anche facile da leggere da destra a sinistra, perchè -come già affermato- questo è l’ordine di esecuzione.

2.2.2 Qualche esempio E’ opinione abbastanza diffusa che “APL non si insegna ma si impara, e si impara utilizzandolo”, vediamo quindi qualche esempio di utilizzo di APL al calcolatore.

Semplici espressioni V←4 5 6 7 9Proprio sull’uso delle parentesi, in un saggio del 1866 Sylvester afferma: “La forza delle parentesi si spiega da sola. Questo meraviglioso simbolo ha il potere di estendersi senza ambiguità a ogni possibile sviluppo del linguaggio matematico.” 2.2 Il linguaggio 19

In questo caso il simbolo di assegnazione “←” è usato per assegnare alla variabile V il vettore di valori 4 5 6 7.

V+4 8 9 10 11

Questa espressione mostra il funzionamento delle funzioni elementari su array. La funzione somma “+” aggiunge, in questo caso, il valore 4 a tutti gli elementi del vettore V, restituendo un nuovo vettore contenente i valori 8 9 10 11. Dal momento che non è stata fatta alcuna assegnazione, si ottiene la stampa a video del vettore risultante.

+/V 22

Utilizza l’operatore monadico di riduzione “/” applicato alla funzione diadica di somma per stampare a video la sommatoria di tutti i valori contenuti in V, in questo caso 22.

M←3 4ρ1 2 3 4 5 6 7 8 9 10 11 12

In quest’altro esempio abbiamo utilizzato la funzione diadica di ristrutturazione “ρ” per creare una nuova matrice M; tale funzione accetta un argomento sinistro contenente le dimensioni della matrice (nel nostro caso una 3×4), e un argomento destro contenente i valori in forma vettoriale che la matrice dovrà contenere (1 2 3 4 5 6 7 8 9 10 11 12).

M 1 2 3 4 5 6 7 8 9 10 11 12

Così abbiamo stampato la matrice ottenuta.

+/[1]M 15 18 21 24

La sommatoria, già utilizzata in precedenza, viene adesso usata assieme all’ope- ratore di asse “[1]” per ottenere la sommatoria di tutte le colonne della matrice M (se avessimo usato “[2]” avremmo ottenuto la sommatoria sul secondo asse, ovvero sulle righe della matrice), ottenendo come risultato il vettore 15 18 21 24. 2.2 Il linguaggio 20

Figura 2.3: Un esempio di prodotto esterno.

Il gioco della vita Abbiamo visto come sia facile eseguire semplici operazioni su vettori e matrici in APL, ma che dire della seguente espressione?

Si tratta di un programma decisamente complesso: è un’implementazione APL del gioco della vita10 [2]. Come si può vedere l’intera applicazione consta di un’uni- ca riga di codice! In APL pressochè qualunque funzione può essere condensata in una sola riga di codice: questa ovviamente non è una buona pratica, ma permette di capire le potenzialità del linguaggio.

Il calcolo dei numeri primi Analizziamo ora passo dopo passo un programma che trova tutti i numeri primi fino a un dato intero R [8]. Eccolo:

(~R∈R◦.×R)/R←1↓ιR

Per chi si avvicina per la prima volta ad un linguaggio così essenziale come APL può essere d’aiuto vedere qualche parentesi in più, perlomeno per capire quali sono gli argomenti delle primitive (altrimenti è facile confondere funzioni diadiche con funzioni monadiche e viceversa). Ecco quindi come apparirebbe la stessa espressione abbondando in parentesi:

(~(R∈(R◦.×R)))/(R←(1↓(ιR)))

Incominciamo quindi ad analizzare il programma. La lettura, come si è già avuto modo di dire, si effettua da destra a sinistra:

10Gioco della vita, automa cellulare sviluppato dal matematico inglese John Conway sul finire degli anni ’60. Il suo scopo è quello di mostrare come comportamenti simili alla vita possano emergere da regole semplici e interazioni a molti corpi, principio che è alla base dell’ecobiologia. 2.2 Il linguaggio 21

1. (~R∈R◦.×R)/R←1↓ιR La funzione monadica generatore di indici “ι” prende come unico parametro destro una variabile (per semplicità ammettiamo che R contenga il valore 6), e ritorna un array contenente i primi R numeri interi; nel nostro esempio ritorna: 1 2 3 4 5 6.

2. (~R∈R◦.×R)/R←1↓ιR La funzione diadica lasciare “↓” elimina dall’argomento destro ogni occor- renza dell’argomento sinistro. Nel nostro caso viene eliminato il valore 1 dal vettore ottenuto al passo precedente; il risultato sarà quindi: 2 3 4 5 6.

3. (~R∈R◦.×R)/R←1↓ιR Il risultato ottenuto ai passi precedenti viene quindi assegnato, tramite il simbolo di assegnazione “←”, alla variabile R, che d’ora in poi conterrà il vettore: 2 3 4 5 6.

4. (~R∈R◦.×R)/R←1↓ιR A questo punto, se l’espressione non contenesse parentesi, il flusso del pro- gramma proseguirebbe normalmente verso sinistra valutando la funzione di compressione “/” (il suo argomento sinistro sarebbe quindi R, mentre quello destro sarebbe il vettore che abbiamo ottenuto ai passi precedenti). La presenza delle parentesi, invece, ci obbliga a valutare il loro contenuto prima di applicare la funzione di compressione; si procede come di consueto partendo da destra. Valutiamo quindi il prodotto esterno di R per R, indicato dal simbolo “◦.×”, il cui risultato è la matrice mostrata in figura 2.3.

5. (~R∈R◦.×R)/R←1↓ιR La funzione diadica di appartenenza “∈” restituisce un vettore binario con- tenente “1” per ogni elemento dell’argomento di sinistra contenuto anche nell’argomento di destra, “0” altrimenti. Nel nostro caso l’argomento di sini- stra è il vettore R (2 3 4 5 6), mentre l’argomento di destra è il risultato del passo precedente. Gli unici elementi comuni sono “4” e “6” (sottolineati in figura 2.3); il risultato sarà quindi il vettore: 0 0 1 0 1.

6. (~R∈R◦.×R)/R←1↓ιR A questo punto viene applicato al risultato dei passi precedenti la funzione monadica di negazione logica “~” , che restituisce il vettore: 1 1 0 1 0.

7. (~R∈R◦.×R)/R←1↓ιR Eccoci infine a valutare il risultato della funzione diadica di compressione “/” (da non confondersi con l’operatore di riduzione che invece è monadico), il cui argomento sinistro è il vettore binario calcolato al passo precedente, mentre l’argomento destro è il risultato ottenuto al punto 3. La funzione di compressione conserva tutti gli elementi dell’argomento destro a cui sono associati degli “1” nell’argomento sinistro; nel nostro caso il risultato è: 2 3 5. Abbiamo quindi ottenuto un vettore contenente i numeri primi fino al 6. 2.2 Il linguaggio 22

2.2.3 Le critiche Vista la novità rappresentata da APL nel mondo dei linguaggi di programmazione, APL è stato soggetto di numerose critiche, come ampiamente descritto in [3]. Dall’e- sempio del gioco della vita appare chiaro perchè APL sia stato spesso ironicamente definito un “linguaggio a sola scrittura”: scrivere un programma in maniera con- cisa può essere semplice, ma leggerlo e capirlo -specie quando l’autore è un’altra persona- può risultare tanto complicato quanto la traduzione dei geroglifici. D’altra parte, come affermano i sostenitori, l’uso di caratteri speciali conferisce ad APL un’eleganza e una concisione non ottenibile in altri linguaggi, anche grazie all’uso di simboli che graficamente ricordano la funzione che rappresentano. Queste ca- ratteristiche furono riassunte nella seguente definizione di sicuro impatto: “APL, il linguaggio col quale si può simulare il mescolamento di un mazzo di carte e la loro distribuzione a un gruppo di diversi giocatori in soli quattro caratteri, nessuno dei quali si trova su una normale tastiera.”11. Nonostante le (molte) critiche espresse dai detrattori, l’uso dei simboli per rap- presentare concetti più complessi è ben affermato nella nostra società: nei cartelli stradali, sui pulsanti degli elettrodomestici, nei cartelli informativi di grandi magaz- zini e ospedali... Tutto questo suggerisce che la nostra sia una cultura orientata ai simboli e che le persone si abituino rapidamente ad utilizzarli. La notazione usata da APL nasce anche in seguito a queste premesse: un numero considerevole di simboli viene già insegnato nella scuola dell’obbligo nei programmi di aritmetica e algebra; i simboli aggiuntivi utilizzati da APL non sono più di una quarantina, sono facili da imparare (come già accennato ogni simbolo ha un legame con la funzione che rappresenta) e non è assolutamente necessario impararli tutti per cominciare a lavorare col linguaggio (piuttosto è buona regola impararli mano a mano che si rendono necessari nelle proprie applicazioni). L’utilizzo dei simboli al posto dei nomi delle funzioni permette anche di rendere il linguaggio il più universale possibile: il simbolo esprime lo stesso significato a qualunque latitudine lo si osservi, mentre i nomi utilizzati dai linguaggi strutturati sono immediatamente comprensibili solo a chi conosce la lingua nella quale sono stati scritti. Infine, vale la pena ricordare che l’utilizzo dei simboli in APL, assieme alla possibilità di definirsi le proprie funzioni, permette all’utente di scegliere il livello di verbosità che più preferisce, mentre negli altri linguaggi questo è in genere fissato: ad esempio l’utente può definire una funzione chiamata “SOMMA” che svolge lo stesso calcolo che normalmente viene svolto dall’operatore “+”. E ciò era tanto più vero quando APL vide la luce, come affermato in [6]:

“APL può essere verboso quanto COBOL, ma COBOL non può diven-

11Questa definizione è attribuita allo sviluppatore David Given. E’ interessante notare come questa frase (che comparve nel 1998 su un gruppo di discussione) era da intendersi come una semplice battuta, ma alcune persone si scervellarono nel tentativo di trovare una soluzione che corrispondesse all’affermazione di Given. Per la cronaca la soluzione più completa (sebbene ce ne siano altre più sintetiche, ma meno aderenti all’affermazione) consiste di undici caratteri, due soli dei quali speciali. 2.2 Il linguaggio 23

tare conciso come APL perchè manca dell’insieme dei simboli e delle funzioni.”

Molte delle critiche sulla difficoltà di comprensione del codice APL è proba- bile siano derivate dalla tendenza di molti programmatori a scrivere del codice esageratamente stringato. La possibilità di scrivere algoritmi, anche complessi, in pochi caratteri12 era un tale vanto per gli sviluppatori APL che la stessa rivista QuoteQuad13 in ogni suo numero invitava sotto forma di gioco i lettori a risolvere determinati problemi nel minor numero di caratteri possibile [8]. Nei primi tempi l’usanza di condensare tutto l’algoritmo in un’unica riga era motivata dal fatto che su alcuni calcolatori (come L’IBM 1130) l’esecuzione di una nuova riga di codice richiedeva una lettura da disco, e questo allungava notevolmente i tempi di esecuzio- ne del programma. Sui calcolatori più recenti questo inconveniente scomparve, ma lo stile di programmazione eccessivamente conciso spesso rimase. Si osservi, però, che una sintesi eccessiva rende il codice oscuro e difficilmente comprensibile, ed è quindi una cattiva pratica in qualunque linguaggio di programmazione. D’altra parte in APL i programmi possono essere scritti molto velocemente, e questo dovrebbe concedere allo sviluppatore il tempo necessario a commentare e a documentare adeguatamente il codice prodotto.

2.2.4 Il problema dei caratteri speciali Il problema che ha sempre costituito un grande limite alla diffusione di APL è quello dell’insieme di caratteri usato (vedi sezione 2.2.1). Le primitive di APL sono in genere costituite da un’unico simbolo (si veda l’elenco dei simboli usati in figura 2.2) e questo è, il più delle volte, un carattere spe- ciale non presente nello standard ASCII. Come è facile immaginare ciò rappresenta un ostacolo perchè tali caratteri non solo non sono presenti sulle tastiere tradizionali, ma spesso nemmeno i calcolatori e le stampanti dell’epoca possedevano il font per rappresentarli14. Con l’avvento dello standard Unicode15 gran parte di questi problemi sono scomparsi, ma è rimasto quello relativo all’inserimento di caratteri da tastiera. Inizialmente i terminali scriventi in grado di riprodurre l’insieme di caratteri usato da APL erano molto pochi, i più popolari utilizzavano il metodo ideato per

12Si noti la differenza coi linguaggi tradizionali, dove in genere un algoritmo sintetico consta di poche righe e non caratteri. 13QuoteQuad, periodico divulgativo su APL e J gestito da SIGAPL (Special Interest Group on the APL and J languages). Il nome della rivista si rifà al simbolo usato da APL per la funzione di stampa. 14In realtà ci sono alcuni metodi per scrivere codice usando solo caratteri ASCII, ma nella pratica sono stati usati di rado. Si veda: http://www.math.uwaterloo.ca/apl_archives/apl/ translit.schemes 15Passando dai 256 caratteri definiti dallo standard ASCII ai 65536 di Unicode, fu possibile definire non solo i caratteri di alcune lingue non anglo-europee (tra cui Kanji, Mandarino, Tailandese, Ebraico, Cirillico) ma anche i simboli specifici di APL. Ovviamente la possibilità di visualizzare i caratteri Unicode dipende anche dalla presenza di un font compatibile sulla macchina. 2.3 Interpreti contro compilatori 24

Figura 2.4: Uno schema delle tastiere APL Union le macchine da scrivere IBM della linea Selectric che permetteva di comporre i caratteri speciali non presenti sulla tastiera come sovrapposizione di due caratteri tradizionali16. Questa tecnica, però, richiedeva una procedura speciale per eliminare i caratteri precedentemente inseriti, e questo rendeva la modifica dei programmi esistenti particolarmente faticosa. In seguito i calcolatori dedicati adottarono una tastiera su misura, chiamata tastiera Union o Unified, che (sebbene fossero presenti minime variazioni da produt- tore a produttore) generalmente mirava ad associare mnemonicamente ogni singolo carattere APL ad una lettera17. Un esempio di tastiera APL è rappresentato in figu- ra 2.4. Gli utenti sprovvisti di queste tastiere spesso ricorrevano alle decalcomanie da incollare sui tasti della propria tastiera tradizionale. Ancora oggi questi problemi non sono del tutto risolti, ma l’utilizzo di program- mi di videoscrittura che si avvalgono delle moderne interfacce grafiche, permette allo sviluppatore di inserire i caratteri speciali con un click del mouse. Il problema dei caratteri speciali rappresentò il vero grande limite di APL, tanto che lo stesso Iverson (ormai in pensione) cercò di porvi rimedio nell’implementa- zione di J, un dialetto di APL.

2.3 Interpreti contro compilatori

Prima di poter eseguire del codice in un qualsiasi linguaggio di programmazione è necessario tradurlo in codice macchina, per renderlo comprensibile all’elaboratore. Per fare ciò si può scegliere la strada del compilatore o quella dell’interprete.

16Ad esempio, la lettera greca φ si poteva ottenere digitando “o” seguito dal tasto di ritorno “backspace” e infine “/”. Questa caratteristica, nota col nome di “fedeltà visiva”, era utilizzabile per tutto l’insieme di caratteri APL. 17L’associazione mnemonica era però in gran parte ristretta agli utenti anglofoni. Ad esempio, il punto interrogativo (question mark) era posizionato sopra alla lettera Q, la potenza (power) sulla P, la ro (rho) sulla R, il modulo (modulus) sulla M, e così via... Il simbolo APL si otteneva premendo il tasto SHIFT assieme alla lettera corrispondente. 2.3 Interpreti contro compilatori 25

Interpreti Per il desiderio iniziale del suo autore di farne principalmente un linguaggio didat- tico, APL venne in primo luogo interpretato. A dire il vero gli interpreti esistenti sono tantissimi, molti dei quali sviluppati negli anni ’70 e ’80 dagli stessi produttori di calcolatori per rendere più appetibili le loro macchine. Tra i principali interpreti troviamo IBM APL2 (di fatto lo standard), APL Now (prima noto come APL2000), Dyalog APL (che ha esteso il linguaggio fornendolo di costrutti Object Oriented e di un’integrazione con la piattaforma .Net), MicroAPL APLX (pienamente a 64bit), Solition Associates SAX (l’attuale proseguimento del- l’interprete prodotto da I.P. Sharp Associates). Quest’ultimo ha qualche differenza implementativa, poichè il suo sviluppo fu guidato da Kenneth Iverson, mentre i restanti interpreti hanno tutti seguito la strada di aperta da APL2.

Compilatori I programmi APL solo raramente vengono compilati. La compilazione di programmi APL è stata spesso oggetto di discussione in conferenze e, nonostante alcuni degli ultimi sviluppi (tra cui l’utilizzo di array annidati) abbiano reso il linguaggio sempre più difficile da compilare, l’idea di rendere APL compilabile è ancora oggi in continuo sviluppo. Esistono diversi prototipi di compilatori per APL, sebbene nessuno di questi costituisca oggi un prodotto completo e pienamente utilizzabile; la maggior parte dei compilatori traducono il sorgente APL in un linguaggio di basso livello come ad esempio il C, il quale a sua volta può essere compilato con un compilatore tradizionale, come ampiamente descritto in [10]. Il primo compilatore commerciale fu rilasciato verso la metà del 1980 da STSC come aggiunta per VSAPL18. La particolarità del compilatore era che il codice compilato poteva essere eseguito solo all’interno dell’ambiente dell’interprete. Il compilatore poteva tradurre in codice macchina molte operazioni vettoriali e scalari, ma le funzioni più complesse erano demandate all’interprete. Si dice comunque che garantisse un notevole miglioramento nell’esecuzione. Nel 1982 la società Unisys sviluppò il compilatore APLB, il primo a usare una compilazione incrementale dinamica per produrre il codice per una macchina virtuale: effettuava una ricompilazione al volo mano a mano che gli identificatori cambiavano il loro significato funzionale. Un altro esempio di compilatore19 che non ha mai raggiunto una completa maturazione è APEX, un compilatore di ricerca prodotto da Snake Island Research Inc. che era in grado di tradurre un sorgente APL minimale in codice SAC20. Discorso a parte va fatto per VisualAPL (prodotto da APL Next), che si allontana

18VSAPL, interprete APL creato da IBM sulla base della versione CMS/APL. 19Un elenco di tutti i compilatori APL esistenti è disponibile qui: http://www.apl2c.de/ home/Links/links.html 20SAC, linguaggio di programmazione funzionale ad array. 2.4 Utilizzo di APL 26 da un sistema APL tradizionale, nel senso che è un linguaggio .Net a tutti gli effetti: la sua compilazione avviene con il compilatore JIT di Microsoft Visual Studio e genera un codice CLR21. Il linguaggio inoltre è stato esteso in modo da supportare costrutti Object Oriented.

2.4 Utilizzo di APL

APL ha avuto per molto tempo una piccola ma agguerrita base di utenti. Tra la metà degli anni ’60 e i primi anni ’80 fu largamente utilizzato, soprattutto in applicazioni matematiche e in ambiti finanziari e assicurativi. La sua snellezza e di conseguenza la velocità con la quale si poteva scrivere un programma funzionante lo resero il linguaggio ideale per prove di fattibilità o per prototipi di programmi che poi sarebbero stati sviluppati usando linguaggi di programmazione tradizionali. In questi anni APL fu anche utilizzato nei corsi universitari di certe facoltà nordamericane e in alcuni casi anche nelle scuole superiori22, a dimostrazione del fatto che per utilizzare il linguaggio non erano necessari studi particolari. Purtroppo, però, la diffusione del linguaggio nelle scuole restò molto limitata, anche per l’elevato costo delle licenze. Negli anni ’80 l’interesse verso APL è progressivamente diminuito, in parte per le difficoltà incontrate dagli sviluppatori nel migrare le proprie applicazioni dai calcolatori mainframe ai nascenti personal computer e in parte per la nascita di avanzati strumenti di produttività destinati agli utenti finali quali Microsoft Excel o Microsoft Access. Parte del declino è stata anche dovuta al crescente interesse verso altri linguaggi ad array, quali Matlab, GNU Octave e Scilab. Questi strumenti di calcolo per ambienti scientifici avevano caratteristiche del tutto simili ad APL, ma utilizzavano un insieme di caratteri ASCII e assomigliavano di più ai linguaggi di programmazione convenzionali. Nonostante questo oggi APL non si può definire un linguaggio morto: sono svariate le aziende sparse per il mondo che ancora trovano in APL uno strumento utile e redditizio per il loro lavoro quotidiano, o gli ambienti di ricerca che utilizzano APL come strumento di analisi.

21CLR, Common Language Runtime è il motore d’esecuzione della piattaforma .NET esegue cioè codice IL (Intermediate Language) compilato con compilatori che possono avere come target il CLR. Tale componente si occupa di compilare al volo (Just-In-Time) il codice IL in nel linguaggio macchina. 22In [6] si afferma che APL fosse utilizzato nelle scuole pubbliche di Atlanta, in Georgia. 3 Il dialetto J

Nel 1989, ormai in pensione, Iverson iniziò a pensare a un nuovo linguaggio che potesse risolvere i problemi che avevano afflitto APL, come ricordato in [18]:

“La motivazione iniziale che spinse lo sviluppo di APL era quella di fornire uno strumento per scrivere e insegnare. Nonostante APL sia stato utilizzato soprattutto in applicazioni commerciali, continuo a credere che il suo utilizzo più importante debba ancora essere scoper- to: si tratta di una notazione semplice, precisa ed eseguibile, adatta all’insegnamento di un ampio numero di materie. Quando andai in pensione rifocalizzai la mia attenzione su questo problema e giunsi alla conclusione che lo strumento richiesto era un dialetto di APL che: • fosse disponibile con una licenza di tipo ‘shareware’, e che fosse abbastanza economico da poter essere acquistato dagli studenti così come dalle scuole. • potesse essere stampato su stampanti tradizionali. • girasse su una larga varietà di calcolatori. • garantisse la semplicità e la generalità delle più recenti versioni di APL.”

Iniziò quindi la collaborazione con per lo sviluppo di questo dialetto che vide la luce nel 1985 con il nome di J.

Si può tranquillamente affermare che oggi J soddisfi pienamente i propositi che Iverson si era prefissato una ventina di anni fa. In primo luogo, per quanto riguarda l’economicità del nuovo linguaggio, J va addirittura oltre le intenzioni del suo creatore: l’interprete è infatti disponibile gratuitamente. L’altro grande problema di APL, quello legato ai caratteri speciali (vedi sezione 2.2.4), fu risolto adottando al loro posto dei digrammi1 costituiti da caratteri ASCII. Lo sviluppo di J è stato in parte influenzato dal linguaggio di programmazio- ne funzionale FP di John Backus2 (a sua volta largamente influenzato da APL),

1Digramma, gruppo di due lettere successive il cui valore fonetico è un singolo suono. 2John Warner Backus (1924-2007), fu responsabile di un gruppo di ricerca dell’IBM che, alla fine degli anni cinquanta, sviluppò il linguaggio compilato FORTRAN. Il suo nome è associato alla “Backus-Naur form”(BNF) [1].

27 28

Figura 3.1: Un esempio del cambiamento nella terminologia. tanto che in J è possibile (ma non indispensabile) programmare seguendo lo stile funzionale attraverso l’uso della programmazione tacita (vedi sezione3).

Le novità J nasce come dialetto di APL: ciononostante, per apportare alcuni miglioramenti altrimenti impossibili (come l’aggiunta della funzione di rango), fu scelto di non preservare la compatibilità con APL3. Quando possibile i simboli delle primitive rimasero gli stessi utilizzati in APL, si veda ad esempio la funzione somma “+”; vennero però aggiunti i suffissi “.” e “:” che, nell’esempio della somma, permettono di ottenere rispettivamente il complesso coniugato “+.” e l’elevamento al quadrato “+:”del numero. Quei simboli che invece erano identificati da caratteri speciali non presenti nella codifica ASCII vennero ridefiniti, il simbolo della funzione di divisione “÷”, per esempio, fu sostituito col simbolo “%” che in qualche modo lo ricordava, mentre l’assegnamento di una variabile “←” fu sostituito da “=.” (nel caso di assegnamento di una variabile globale fu introdotta la primitiva “=:”). Per inserire i commenti fu introdotta la (poco pratica) stringa “NB.”, visto che il simbolo “%” precedentemente adoperato per i commenti era stato adibito ad altro utilizzo. Furono inoltre estese diverse famiglie di funzioni (le primitive sono circa una settantina), tra le quali quelle relative a: calcolo differenziale e integrale (derivate, integrali, serie di Taylor...); algebra lineare (radici di polinomiali, determinante...); calcolo combinatorio (rappresentazioni atomiche e cicliche delle permutazioni...); numeri (numeri primi, fattori primi, interi estesi4...).

La terminologia Per marcare l’analogia con un linguaggio reale (e in questo modo semplificare l’approccio ai i principianti) il vocabolario di J venne descritto utilizzando termini grammaticali al posto della classica terminologia informatico-matematica. Le fun- zioni di APL, quindi, diventarono i verbi del linguaggio J, le costanti diventarono i

3Un’elenco delle principali differenze tra APL e J è disponibile a questo indirizzo: http:// lists.canonical.org/pipermail/kragen-tol/2000-April/000557.html . 4Interi estesi, implementazione dei numeri interi che permette di ottenere una precisione arbitraria. 29 nomi, le variabili diventarono pronomi, gli operatori monadici diventarono avverbi, mentre quelli diadici diventarono congiunzioni, infine le parentesi costituirono la punteggiatura del linguaggio. E ancora, gli scalari vennero chiamati atomi , i vettori diventarono liste, mentre gli array bidimensionali vennero chiamati tabelle. Un esempio di tale terminologia è definito in figura 3.1.

Gli script J ha un modo di archiviare e gestire i programmi radicalmente diverso da APL. Al posto dello spazio di lavoro J utilizza gli script, semplici file di testo modificabili con qualsiasi editor. Per eseguire un’applicazione è necessario leggere il relativo file di script ed eseguirne la funzione principale. Con sessione, invece, si indicano le finestre di J che rappresentano la sessione di esecuzione e la sessione degli script. La prima è usata per fare sperimentazioni, si possono scrivere espressioni e ottenere istantaneamente il risultato; la seconda serve per sviluppare il codice, è l’analogo dell’editor di APL. L’introduzione degli script permette a J di uniformarsi alla mag- gior parte dei linguaggi di programmazione, che utilizzano file di testo per salvare i sorgenti dei programmi. Inoltre il file di script elimina molti dei problemi associati allo spazio di lavoro, come per esempio l’impossibilità di importare variabili di uno spazio di lavoro in un altro spazio di lavoro.

La programmazione tacita In J la programmazione tacita permette di definire nuove funzioni senza mai no- minare esplicitamente gli argomenti della funzione stessa: in pratica si utilizza la composizione di funzioni anzichè le variabili. Questo concetto, ispirato alla logica combinatoria, è spesso chiamato point free style nei linguaggi di programmazione funzionali. Eccone un esempio:

mean=.+/%#

La successione delle tre primitive “+/%#” (ma potrebbero essere di più) in J è chiamata treno, e costituisce il corpo della funzione “mean”:

1. mean=.+/%# “#” è il verbo monadico che restituisce il numero di elementi di una lista.

2. mean=.+/%# “+/” , come in APL, rappresenta la sommatoria su una lista.

3. mean=.+/%# “%” è il verbo diadico che calcola la divisione.

A questo punto la funzione “mean” così definita, può essere richiamata su un vettore di numeri x: 30

mean x

Il risultato che otterremo è lo stesso che avremmo ottenuto nominando esplicita- mente la variabile x:

(+/x)%(#x)

Abbiamo fatto un esempio con un treno costituito da tre primitive (che è chia- mato gancio), ma J è in grado di gestire anche treni di quattro primitive (chiamati forche) o più (viene risolto come una sequenza di ganci e forche). Si noti che, dal momento che la frase “+/” produce la funzione sommatoria (vedi sezione 2.2.1), il cuore della programmazione tacita era già presente nelle prima implementazione di APL, ma i limiti della funzione di assegnamento “←” impedi- vano di assegnare un nome alla definizione di sommatoria, rendendo impossibile -di fatto- la programmazione tacita. 4 Kenneth Iverson, biografia

4.1 Vita

Data l’importanza del personaggio, il suo indissolubile legame col linguaggio qui descritto e la sua recente scomparsa, sembrava doveroso dedicare un paragrafo al padre di APL. Qui di seguito riporto la biografia di Kenneth Iverson, in gran parte raccontata con le sue stesse parole, tratte dalla breve autobiografia in [21].

Gli studi Kenneth Eugene Iverson nasce il 17 dicembre 1920 a Camrose in Canada, nello stato di Alberta, da una famiglia di contadini di origine Norvegese. Il piccolo Iverson ottiene fin da subito ottimi risultati scolastici e viene più volte promosso anticipatamente all’anno scolastico successivo, entrando alle scuole superiori all’età di 12 anni. Si tratta però del suo ultimo anno di scuola: nello stesso anno Iverson decide di abbandonare gli studi per lavorare nella fattoria dei genitori.

“Sebbene la scuola mi piacesse, scelsi di lasciarla alla fine dell’anno per lavorare a casa nella fattoria. In questi anni della Grande Depres- sione la mia scelta fu probabilmente un sollievo per la mia famiglia. Ma i motivi che mi spinsero verso tale scelta erano più semplici: per quanto ne sapevo, l’unico motivo per proseguire gli studi era quello di diventare un’insegnante, e io non volevo insegnare. Non sapevo assolutamente niente del mondo delle università e della preparazione che fornivano per professioni in gran parte a me sconosciute.”

Nonostante l’abbandono degli studi, Iverson continua a coltivare un grande interesse verso le materie scientifiche e i loro risvolti pratici. Nel 1938, all’età di 17 anni, si iscrive assieme al fratello maggiore Elmer a un corso di elettronica per corrispondenza; come lui stesso ricorda, la parte più interessante era quella di analizzare la vecchia radio del padre:

“Cominciammo a sezionarla, disegnando con attenzione il circuito man mano che lo analizzavamo. Trovo particolarmente interessante ricordare le difficoltà che incontrammo nell’identificare i componenti

31 4.1 Vita 32

(come i “condensatori”), avendoli sempre studiati in astratto, ma senza averne mai visto uno dal vivo.” Finito il corso, Iverson trova in un libro di Calcolo1 il suo naturale proseguimen- to, ed è così che nasce il suo interesse verso la matematica. “Le lunghe e fredde giornate invernali in Alberta a volte rendevano il lavoro all’aperto impossibile, ma mi concedevano del tempo per studia- re il libro. Il mio ricordo più intenso è quello della gioia nello scoprire come le bellissime funzioni circolari potessero essere finalmente unite in una singola famiglia sotto l’esponenziale.” Durante la Seconda Guerra Mondiale, nel 1942, viene chiamato alle armi e l’anno successivo entra nell’Areonautica Militare Canadese; in questo periodo segue altri otto corsi per corrispondenza. A guerra conclusa inizia gli studi presso l’Università di Queen, nella città di Kingston, laureandosi nel 1950 in Matematica e Fisica2. “Finalmente imparai cosa fosse l’università dai miei compagni del- l’Areonautica Militare, molti dei quali avevano intenzione di ritornare all’università grazie al supporto che il governo dava ai membri del- le forze armate. In particolare uno dei miei amici mi minacciò di spaccarmi la testa se non avessi preso al volo l’opportunità.” Nel 1951 consegue il Master in Matematica presso l’Università di Harvard, per poi spostarsi nel Dipartimento di Ingegneria e Fisica Applicata dove conosce il professor Aiken3. E’ proprio Aiken che, per la sua tesi, lo mette in contatto con l’economista Wassily Leontief4, al lavoro sul modello Input-Output dell’analisi economica, che in seguito gli varrà il Nobel per l’Economia. Il modello lavorava su matrici di grandi dimensioni e il compito di Iverson era quello di sviluppare dei programmi che fossero in grado di maneggiare queste matrici sul calcolatore Harvard Mark IV. Nel 1954 ottiene il Ph.D in Matematica Applicata con una dissertazione basata su questo lavoro.

1Calculus, Herman W. March and Henry C. Wolff, McGraw-Hill, 1917. 2A proposito degli anni all’università di Queen, Iverson ricorda: “Mi risentii abbastanza per l’obbligo di seguire due corsi piuttosto lontani dal mio interesse principale; uno di Inglese e l’altro di Filosofia. Li ho trovati entrambi i più gratificanti, e mi hanno lasciato con la ferma convinzione che sia giusto forzare gli studenti a rivolgersi verso certe aree che pensano non siano di loro interesse.” 3Howard Hathaway Aiken (1900-1973), fisico statunitense pioniere dell’informatica, sviluppò l’IBM Harvard Mark I, uno dei primi calcolatori digitali prodotti su larga scala. Fu il professore che incanalò Iverson nella direzione dei “cervelli giganti” (come allora la stampa chiamava i calcolatori), mondo allora completamente sconosciuto a Iverson. Il suo ruolo fu determinante nella formazione di Iverson; una sua caratteristica, in particolare, ebbe grande influenza sul giovane Iverson: nella costru- zione delle sue macchine, Aiken preferiva dare la precedenza alla semplicità d’utilizzo anzichè alla velocità d’esecuzione. Iverson stesso lo ricorda come una persona estremamente capace e amichevole: “Quando lesse il mio primo abbozzo [della tesi] lo trovai disponibile e gentile, spesso mi chiese se fossi sicuro di aver usato la parola giusta, quando sapeva perfettamente che non lo era.” 4Wassily Wassilyovitch Leontief (1905-1999), premio Nobel per l’Economia nel 1973 grazie ai suoi studi sul modello Input-Output. 4.1 Vita 33

Figura 4.1: Kenneth Iverson da giovane.

L’insegnamento e la notazione Per altri cinque anni Iverson resta all’Università di Harvard in qualità di assistente insegnante, senza però riuscire a ottenere un posto fisso5. All’epoca Aiken pensava che le università dovessero smettere di progettare e costruire calcolatori, e dovessero invece spostare la loro attenzione sulle applicazioni per i calcolatori. Nonostante l’opposizione dell’amministrazione di Harvard, nel 1955 Aiken riuscì a far partire un Master in “Automatic Data Processing”, la prima iniziativa dela genere in campo universitario6. Iverson fu uno dei quattro studenti laureati che presero parte al progetto, e spesso toccava a loro tenere i corsi7. E’ in questo periodo che elabora una notazione matematica, in seguito nota come “notazione Iverson”, con lo scopo di insegnare l’algebra ai suoi studenti in maniera più intuitiva.

“Mi atterrì scoprire che la notazione matematica con la quale ero cresciuto non era sufficiente per il corso a cui ero stato assegnato,

5A tal proposito nella celebrazione post mortem di Kenneth Iverson ricorda: “Gli chiesi perchè non era riuscito ad ottenere una posizione stabile. Mi rispose che il preside di facoltà l’aveva chiamato e gli aveva fatto notare che in cinque anni non aveva pubblicato niente a parte un piccolo libro. Quel piccolo libro in seguito gli valse il premio Turing.” 6Un resoconto dettagliato di questi anni è presente nel libro “Howard Aiken: Portrait of a Computer Pioneer”. 7Iverson ci tiene a far notare come all’epoca, al contrario di quanto avveniva nella scuola dell’ob- bligo, agli insegnanti universitari non fosse impartita nessuna tecnica di insegnamento. Egli ricorda ancora con affetto il compagno Fred Brooks, che gli insegnò i fondamenti dell’arte dell’insegnare: “Fred e io eravamo tanto buoni amici che lui poteva permettersi, e lo faceva, di rinfacciarmi senza mezzi termini le mie cattive tecniche d’insegnamento dopo ogni lezione. Per esempio, una volta mi disse: «E’ stato molto interessante l’argomento che hai sollevato circa questo e quello, peccato che l’hai detto alla lavagna e nessuno, salvo la prima fila, ti abbia potuto sentire!»” 4.1 Vita 34

Figura 4.2: Howard Aiken al lavoro sul Mark I.

e cominciai a lavorare su un’estensione alla notazione che poteva servire. In particolare, adottai l’algebra matriciale usata nella mia tesi, l’uso sistematico di matrici e array di grandi dimensioni imparato in un corso di Analisi Tensoriale che seguii avventatamente al mio terzo anno al Queen, e (finalmente) la nozione di Operatori nel senso introdotto da Heaviside nel suo trattato sulle equazioni di Maxwell.”

La prima prova sul campo della nuova notazione avviene durante una pausa sabbatica dall’insegnamento della durata di sei mesi. Ted Strong, esponente di una società di consulenze, ha bisogno per un suo cliente (una grossa azienda produttrice di zucchero) di un’analisi dettagliata su alcune strategie da intraprendere, tutto questo avrebbe richiesto l’uso di un calcolatore, l’allora quasi nuovo System/650. Strong aveva già avuto contatti con l’Università di Stanford, ma questi erano stati infruttuosi per via di alcune incomprensioni tecniche; le cose cambiano quando Iver- son chiede a Strong di utilizzare la sua notazione per condividere le sue conoscenze e per formulare le richieste.

“La cosa incoraggiante fu che eravamo in grado di conversare ad un livello di dettaglio accurato, Ted non sapeva niente di calcolatori, e io non sapevo niente di zucchero e commercio. [...] In pochi mesi i programmi per il System/650 erano pressochè completi.” 4.1 Vita 35

Figura 4.3: Kenneth Iverson.

Il periodo in IBM e APL La notazione attira l’interesse di IBM Research Division che nel 1960 lo assume e gli permette di concludere il libro a cui da qualche tempo sta lavorando: “A Programming Language” [4]. Qui incontra Adin Falkoff, col quale lavorerà sulla notazione per ben vent’anni. Il linguaggio APL nasce ufficialmente nel 1962; è proprio Falkoff a suggerire il nome (tratto dal titolo del libro di Iverson)8. Il linguaggio viene inizialmente usato dai due (assieme a Ed Sussenguth9) per produrre una descrizione formale del System/360 [5], allora in fase di design. Ora che APL è sufficientemente stabile, Falkoff e Iverson decidono di testarlo in un ambiente didattico: l’idea è quella di prendere un libro di testo usato nel sistema scolastico statale e provare a farlo insegnare da alcuni insegnanti usando il linguaggio APL. Assumono così per l’estate sei insegnanti (due delle quali suore provenienti da una scuola superiore locale) che si mettono subito all’opera: lavorano in maniera consueta alla lavagna, tranne per il fatto che usano un misto di APL e notazione tradizionale; solo quando la soluzione di un dato problema è stata

8Circa il nome del linguaggio, Paul Berry (che si unì al gruppo di lavoro IBM nel 1966) ricorda: “Prima che APL fosse chiamato APL, era chiamato ‘notazione Iverson’. Ken riflettè che doveva essere chiamato semplicemente ‘Notazione’. Dopotutto, non diciamo ‘erba di Dio’, ma semplicemente ‘erba’.” 9Ed Sussenguth, ingegnere elettronico e matematico, lavorò in IBM fino al pensionamento nel 1990. 4.1 Vita 36 individuata viene chiamato un tecnico per usare il terminale e -se il risultato non è quello voluto- si ritorna alla lavagna per le dovute correzioni. Gli insegnanti partecipano allo sviluppo del linguaggio suggerendo anche alcune migliorie, come ad esempio l’introduzione del prodotto esterno di matrici; l’idea all’inizio viene trovata oltraggiosa da Iverson e colleghi, ma viene successivamente accettata quando gli insegnanti fanno notare che tale concetto è facilmente com- prensibile dagli studenti dal momento che hanno già familiarità con le tabelline di addizione e moltiplicazione. E’ poi la volta di Rudy Amann, insegnante di matematica della scuola superiore della figlia di Iverson che in estate si unisce al gruppo APL per studiare il linguaggio, anche se per due sole settimane.

“Gli diedi un ufficio con un terminale (e il libro di Calcolo in APL che avevo scritto dopo i nostri primi esperimenti con gli insegnanti delle scuole superiori), e lo invitai a venire da me o da qualsiasi altro del gruppo se avesse avuto domande. Dal momento che non mise mai piede fuori dal suo ufficio, iniziai a perdere la speranza, ma alla fine delle due settimane annunciò che gli sarebbe piaciuto continuare il progetto.”

Il periodo in I.P. Sharp Nel 1980 Iverson abbandona IBM per farsi assumere alla I. P. Sharp Associates, dove -tra le altre cose- partecipa agli ulteriori sviluppi del linguaggio di programmazione APL.

“Avendo a tutti gli effetti perso il controllo di APL al Centro Scientifico di Palo Alto, lasciai IBM e entrai in Sharp. Fu stimolante lavorare per una compagnia seriamente affezionata ad APL. Inoltre, i sette anni prima del mio pensionamento videro molti miglioramenti al sistema APL, soprattutto sotto la direzione di mio figlio Eric. Il suo gruppo di lavoro era in gran parte costituito da giovani che erano venuti in Canada dagli Stati Uniti per sfuggire al servizio militare in Vietnam. Le loro barbe ma anche il loro aspetto trasandato fece esclamare a un uomo d’affari: «Questo posto è uno zoo!». Invece che risentirsi di fronte a questo implicito insulto, il gruppo adottò orgogliosamente il nome e da allora si fecero chiamare «Lo Zoo».”

La pensione e J Nel 1987 va in pensione, ma continua la sua attività di ricercatore nel campo dei linguaggi di programmazione. In particolare, nonostante APL sia principalmente sfruttato in applicazioni commerciali, è convinto della sua utilità come strumento di insegnamento nelle materie più disparate. 4.2 Riconoscimenti 37

Dal desiderio di avere un linguaggio economico (e quindi facilmente utilizzabile da scuole e studenti), portabile e semplice da imparare e usare nasce J, dialetto di APL, il ci rilascio ufficiale viene fatto risalire al 1989, anno in cui -assieme a Roger Hui10 e Arthur Whitney11- sviluppa il prototipo dell’interprete. Per i successivi 15 anni continua la sua collaborazione con Roger Hui e la JSoftware Inc. per lo sviluppo del linguaggio J, con l’intento di introdurre migliorie e di risolvere i problemi che avevano afflitto APL. Muore di infarto il 19 ottobre 2004. L’annuncio della sua morte viene dato alla comunità informatica due giorni dopo dal figlio Eric sul forum di J.

“Ken Iverson è deceduto Martedì sera, 19 Ottobre, all’età di 83 anni. Ken stava lavorando al suo calcolatore Sabato pomeriggio su un nuovo progetto legato a J quando ha avuto un infarto. Tre giorni dopo è deceduto silenziosamente con la moglie Jean accanto a sè, assieme ad altri membri della famiglia. Ken ha avuto una vita meravigliosa e memorabile. L’ha vissuta appieno e ha liberamente condiviso la sua gioia con molti altri. Molte persone hanno contribuito alla nascita, alla crescita e all’evo- luzone di J. Ma il ruolo di Ken è stato centrale e ispiratore. J esiste grazie a Ken e lo ricorderemo sempre. [...] Nei suoi ultimi giorni Ken ha espresso fiducia sul fatto che i semi di J che lui stesso ha piantato abbiano messo radici e si è detto soddisfatto che la sua crescita forte e prospera possa continuare. [...] Eric Iverson”

4.2 Riconoscimenti

Kenneth Iverson ha ricevuto diversi riconoscimenti, per l’importanza del lavoro da lui svolto.

Nel 1970 diventò IBM Fellow12, cinque anni dopo fu la volta dell’Harry H. Goode Memorial Award13. Il riconoscimento più importante fu sicuramente il

10Roger Hui (1953), cinese, trasferito in Canada nel 1966 segue un corso di Probabilità e Statistica dell’Università di Alberta in cui è richiesto l’uso di APL. Lavora dapprima alla I. P. Sharp Associates, poi per l’università. Infine nel 1989 inizia la collaborazione con Iverson per lo viluppo del linguaggio J[1]. 11Arthur Whitney, informatico. Scrisse in una giornata il primissimo prototipo dell’interprete di J, che in seguito venne usato da Roger Hui come punto di partenza. E’ principalmente noto per essere l’autore di A+ e , due dialetti di APL 12IBM Fellow, riconoscimento aziendale, considerato il più alto onore che un tecnico IBM può conseguire. Generalmente ogni anno vengono assegnati quattro o cinque di questi riconoscimenti. 13Harry H. Goode Memorial Award, premio istituito dalla IEEE Computer Society per quelle persone che hanno contribuito straordinariamente allo sviluppo informatico. 4.2 Riconoscimenti 38

Turing Award14, spesso definito “il premio Nobel per l’informatica”, che gli venne consegnato nel 1979 con la motivazione: “per il suo impegno pionieristico nei linguaggi di programmazione e nella notazione matematica che sfociò in quello che oggi conosciamo come APL, per i suoi contributi all’implementazione di sistemi interattivi per l’utilizzo didattico di APL, e per l’impegno teorico e pratico nei linguaggi di programmazione”. Nel 1982 è la volta del Computer Pioneer Award15. Infine, nel 1998, riceve il dottorato onorario dalla York University di Toronto. Dal 1983 in onore di Iverson è stato istituito il Kenneth E. for Outstanding Contribution to APL, in breve Iverson Award, un riconoscimento del SIGAPL16 consegnato annualmente alla persona che ha dato un contributo significativo al linguaggio o alla comunità APL.

14A. M. Turing Award, riconoscimento consegnato annualmente dalla “Association for Compu- ting Machinery”a persone che si sono distinte per i loro contributi di natura tecnica alla comunità informatica. 15Computer Pioneer Award, istituito dalla IEEE Computer Society per riconoscere e omaggiare quelle persone i cui sforzi sono risultati nella creazione e nel successivo sviluppo dell’industria dei calcolatori. 16SIGAPL, Special Interest Group on APL and J. Bibliografia

[1]W IKIPEDIA, http://it.wikipedia.org/

[2]W IKIPEDIA, APL (Programming Language), http://en.wikipedia.org/wiki/APL_(programming_ language)

[3]W IKIPEDIA, Criticism of the APL programming language, http://en.wikipedia.org/wiki/Criticism_of_the_APL_ programming_language

[4] K. E. Iverson, A PROGRAMMING LANGUAGE, Wiley, 1962.

[5] A. D. Falkoff, K. E. Iverson, E. H. Sussenguth, AFORMAL DESCRIPTIONOF SYSTEM/360, Wiley, 1964. http://www.research.ibm.com/journal/sj/032/falkoff. pdf

[6]S PECIAL INTEREST GROUPONTHE APL AND J LANGUAGES, Why APL?, http://www.sigapl.org/whyapl.htm

[7] COMP.LANG.APL, APL Frequently Asked Questions, ftp://rtfm.mit.edu/pub/usenet-by-group/comp.lang. apl/APL_language_FAQ

[8]A BOUT APL, A Programming Language, http://www.users.cloud9.net/~bradmcc/APL.html

[9] C. Camerata, INTRODUZIONEALL’APL EALLESUEAPPLICAZIONI, Franco Angeli Editore, 1980.

[10] T. A. Budd, AN APLCOMPILER, 1983.

[11] A. D. Falkoff, K. E. Iverson, THE DESIGNOF APL, IBM Journal of Research and Development, Volume 17, Issue 4, pp. 324-334 (1973). http://www.research.ibm.com/journal/rd/174/ ibmrd1704F.pdf

39 Bibliografia 40

[12] L. Breed, HOW WE GOT TO APL\1130, agosto 2006. http://www.vector.org.uk/archive/v223/APL_1130.htm

[13] M. S. Montalbano, A PERSONAL HISTORY OF APL, ottobre 1982. http://ed-thelen.org/comp-hist/APL-hist.html

[14] D. B. McIntyre, LANGUAGEASANINTELLECTUALTOOL:FROMHIERO- GLYPHICS TO APL, IBM Systems Journal, Vol.30, No.4, 1991, pp. 554-581. http://www.research.ibm.com/journal/sj/304/ ibmsj3004N.pdf

[15] QUANDOL’UOMO IMPARÒ A CONTARE, Numeri e conteggi con i geroglifci degli antichi Egizi. http://web.math.unifi.it/archimede/archimede/ laboratori/appunti/egizi.pdf

[16] J. M. Bochenski,´ La logica formale - La logica matematica, Giulio Einaudi editore, Torino, 1972

[17] A. D. Falkoff, THE IBM FAMILY OF APL SYSTEMS, IBM Syestems Journal, Vol.30, No.4, 1991, pp. 416-432. http://www.research.ibm.com/journal/sj/304/ ibmsj3004C.pdf

[18] K. E. Iverson, A PERSONALVIEWOF APL, IBM Syestems Journal, Vol.30, No.4, 1991, pp. 582-593. http://www.research.ibm.com/journal/sj/304/ ibmsj3004O.pdf

[19] K. E. Iverson, NOTATION AS A TOOLOF THOUGHT, IACM ’79 Lecture, 1979. http://elliscave.com/APL_J/tool.pdf

[20] ATRIBUTETO KEN IVERSON, Vector - The Journal of the British APL Association, Vol.22, No.3, agosto 2006, http://www.vector.org.uk/archive/v223/index.htm

[21]JS OFTWARE WIKI, Essays/Kenneth E. Iverson, http://www.jsoftware.com/jwiki/Essays/Kenneth_E. _Iverson

[22] Dick Pountain, The Joy Of J, http://www.byte.com/art/9509/sec12/art2.htm