Visualizza il feed RSS

Titolo provvisorio...

strjoin=: #@[ }. <@[ ;@,.

Valutazione: 3 voti, con una media del 5.00.
di pubblicato il 26-11-2009 alle 09:13 (4984 Visite)
A noi tutti è comune l'esperienza di utilizzare una calcolatrice: personalmente ricordo ancora con nostalgia una delle primissime "portatili" Texas Instruments anni Settanta entrata in casa mia, spessa (e pesante !) come una Garzantina e con una sfilza di display rossi a sette segmenti in miniatura, affamata di energia e sensibilmente lenta (!) nel produrre i risultati. EDIT: per la cronaca, la calcolatrice in questione era questa, una TI SR-10... se non la prima in assoluto sul mercato, era comunque il secondo modello di calcolatrice tascabile messo in commercio.

Poi nella nostra vita da studenti si sono avvicendate le prime calcolatrici scientifiche, i PET, i PC, gli spreadsheet come VisiCalc - Lotus 1-2-3 - Quattro - Multiplan, le prime pionieristiche applicazioni statistiche come Systat e SPSS, magari un esame o due di calcolo numerico con l'ausilio di una delle tante HP basate sulla "cervellotica" bellissima RPN, l'incontro con "i linguaggi del calcolo", da FORTRAN a C++ arricchito con le più varie librerie numeriche.

Oggi esistono ambienti spaventosamente potenti e articolati per il calcolo numerico e perfino simbolico, in grado non solo di aiutare chi fa i conti, ma addirittura di coadiuvare e consentire lo sviluppo di nuova matematica, vista la capacità simbolica e dimostrativa.
Come i miei amici lettori ben sanno aderisco integralmente alla filosofia, partorita da grandissime menti come Wolfram e Chaitin, secondo la quale il futuro della computazione e della matematica costruttiva sarà sempre più strettamente intersecato, fino a fondersi in nuove discipline, nelle quali è il calcolatore stesso che suggerisce e crea nuova matematica interagendo col matematico computazionale che vi siede davanti, aiutando nella comprensione di problemi e modelli non ancora perfettamente focalizzati ma anche producendo vere e proprie dimostrazioni e inferenze.

Tuttavia, nonostante la presenza di ambienti di calcolo così potenti, lo spazio per i due mondi paralleli delle calcolatrici (programmabili, grafiche, RPN, con USB... ma anche meno pretenziose) e dei linguaggi standalone dedicati interamente al calcolo rimane ancora notevole.
Non pensiamo solo alle applicazioni legacy in FORTRAN, un vero highlander come il COBOL: esistono linguaggi "recenti" che sono usatissimi in taluni ambienti.

Quest'oggi voglio proprio parlarvi di una coppia di linguaggi ai quali sono particolarmente affezionato, da moltissimi anni: APL e J, concepiti dal geniale Kenneth Iverson.

Si tratta di due tra i migliori linguaggi mai ideati, esplicitamente inventati per il calcolo, con una notazione sintetica, potentissima e flessibile.

Il principale problema di APL, paradossalmente, consisteva nell'essere eccessivamente in anticipo sui tempi: i suoi operatori erano infatti simboli non convenzionali tratti direttamente dal formalismo matematico, quindi non presenti sulle tastiere e sui device di output (siamo negli anni Sessanta !). Si veda anche questa bella pagina storica, predisposta con l'usuale cura dal buon John Savard.

Oggi invece APL potrebbe rifiorire, sotto forma di applicazione grafica per Windows e X-window, in qualche modo somigliante ad una calcolatrice programmabile con duecentocinquanta "tasti". Personalmente ho avuto la fortuna di utilizzare, a fine anni Ottanta, non solo una tavoletta grafica con maschera APL su cartoncino per una workstation HP Apollo, ma anche una vera e propria tastiera elettromeccanica apposita per APL su una macchina Bull.

Tuttavia, proprio per superare questi inconvenienti come la necessità di un hardware non standard piuttosto costoso (non era ancora il momento dei game cockpit prodotti nel Far East per pochi spiccioli) e le notevoli difficoltà di visualizzazione, all'inizio degli anni Novanta il gruppo di Iverson e Hui ha concepito J, una evoluzione di APL nella quale gli operatori sono costituiti da sequenze di due o più caratteri convenzionali, ovvero una sorta di digrafi e trigrafi.

Quanto sia leggibile il risultato, a prima vista, potete giudicarlo da soli:

codice:
comb=: [:;(,.&.><@:>:@;\.)^:(i.@>:@-~`[`(1:<@i.@{.~<:@-,2:))
codice:
Choleski=: 3 : 0
 n=.#A=.y
 if. 1>:n do.
  assert. (A=|A)>0=A  NB. check for positive definite
  %:A
 else.
  p=.>.n%2 [ q=.<.n%2
  X=.(p,p){.A [ Y=.(p,-q){.A [ Z=.(-q,q){.A
  L0=.Choleski X
  L1=.Choleski Z-(T=.(h Y) mp %.X) mp Y
  L0,(T mp L0),.L1
 end.
)
codice:
bob =: ": , ' bottle' , (1 = ]) }. 's of beer'"_
bobw=: bob , ' on the wall'"_
beer=: bobw , ', ' , bob , '; take one down and pass it around, ' , bobw@<:
Non male, eh ?
La reazione del programmatore quadratico medio è del tipo "Ma quella roba lì è peggio del Perl e del LISP messi insieme...", quindi non allarmatevi.

I tre esempi sono liberamente tratti dal sito di riferimento, ricchissimo di materiale di studio. Nell'ordine, il primo genera tutte le combinazioni di ordine m da un insieme di cardinalità n > m; il secondo applica la ben nota decomposizione di Cholesky ad una matrice (specialità della casa per APL e J); il terzo è quella simpatica goliardata di "99 bottles of beer".

Dal nostro punto di vista, J è un linguaggio per operazioni matriciali di tipo MIMD (Multiple Instruction, Multiple Data). Non si tratta per natura di un linguaggio funzionale, al contrario di Haskell o Miranda: tuttavia supporta alcuni costrutti di programmazione basati sulle funzioni di ordine superiore di Backus (il padre della specifica sintattica BNF, tra l'altro), ovvero funzioni in grado di accettare altre funzioni come parametri, e/o di restituirle come risultati. Il linguaggio J viene per questo definito linguaggio di programmazione "a livello funzionale", praticamente unico nella sua categoria, assieme all'ancor più esotico FP ideato proprio da John Backus ed a linguaggi specializzati come ERLANG.

Una curiosità importante: si tratta di uno dei pochissimi linguaggi che non aderiscono al modello di macchina Von Neumann, e peraltro vi sono almeno un paio di interessantissime (sebbene difficiline per l'informatico quadratico medio) pubblicazioni su possibili modelli di hardware che implementino APL nel modo più efficiente. Il tutto si collega, in maniera forse poco palese ma intuitiva, a modelli semisconosciuti di vector computing fioriti negli scorsi trent'anni.

Tornando agli aspetti più generali, la sintassi e il modello di parsing di J già da soli sono meritevoli del massimo interesse, e fonte di ispirazione per chiunque abbia motivo di scrivere anche un ristretto subset di funzioni per un parser-giocattolo ad uso "scripting numerico".

L'idea fondamentale dietro la creazione di APL e poi di J è la strettissima somiglianza con la normale notazione matematica, che intende semplificare l'approccio a chi possiede buone basi applicative: lo statistico, il matematico attuariale, il tecnico assicurativo o bancario, e in generale tutte le categorie di applicativi che fanno calcolo numerico e statistico su base matriciale, dall'ingegnere al biologo al fisico.

Dal punto di vista della licenza, come ben spiegato sul sito, il linguaggio è oggi di libero utilizzo per tutti gli utenti e tutte le destinazioni d'uso. Tradizionalmente i sorgenti dell'implementazione standard non vengono forniti (J Software è una normale softwarehouse che vende i suoi prodotti), ma uno degli aspetti fondamentali e molto ben curati è la facilità di integrazione di J con prodotti di terze parti, dalle librerie accademiche per il calcolo numerico al framework dotnet.

Similmente al simpatico ICON, anche J propone un completo ambiente per Windows con grafica avanzata, supporto UNICODE, interfacce verso database - framework - applicazioni - DTP, il tutto con la qualità e l'affidabilità di un prodotto commerciale utilizzato attraverso un paio di decenni da grandi istituzioni del settore finanziario e scientifico.

Non perdete l'occasione di dare un'occhiata alla mole enorme di documentazione ed esempi, e di installare l'ambiente J sul vostro SO preferito. Il tempo speso ad apprendere J darà sicuramente i suoi frutti, migliorando nettamente la qualità del vostro modo di pensare non convenzionalmente alle soluzioni software, ma anche il modo di fare quei conti applicativi che spesso servono, con un ambiente del tutto gratuito e di grande funzionalità.

Consiglio di stampare e studiare tutta la documentazione, senza dimenticare "J for C programmers" e di seguire passo dopo passo "Concrete Maths Companion" assieme al testo originale: nel giro di qualche settimana avrete appreso bene non solo una importantissima base di matematica discreta, ma anche i fondamenti del linguaggio J. Agli studenti in particolare suggerisco di alternare lo studio dei soliti Matlab e affini con J, usandolo magari per preparare qualche tesina o lavoro di supporto nell'ambito dei vari corsi di analisi numerica, algebra lineare, geometria computazionale.

Commenti

  1. L'avatar di Brontolo
    Il principale problema di APL, paradossalmente, consisteva nell'essere eccessivamente in anticipo sui tempi: i suoi operatori erano infatti simboli non convenzionali tratti direttamente dal formalismo matematico, quindi non presenti sulle tastiere e sui device di output (siamo negli anni Sessanta !).
    A dire il vero, mi hai fatto tornare in mente che i terminali IBM 3270 avevano talvolta QUESTA favolosa tastiera.