Ci sono però alcuni ambiti in cui il software libero non ha raggiunto livelli di utilizzo paragonabili ai programmi che abbiamo elencato in precedenza. Uno di questi ambiti è quello scientifico, dove si fa ricorso predominantemente, almeno per quello che ho potuto constatare io, a programmi proprietari. E dico utilizzo perché in realtà il software c'è ed è di ottima qualità.
Questo fatto è dovuto a una molteplicità di fattori, alcuni dei quali sono comuni al software libero in generale, mentre altri sono caratteristici di questo particolare tipo di programmi:
- la, relativamente, bassa diffusione dei sistemi operativi liberi;
- la ancora bassa diffusione dei programmi liberi in ambiente desktop;
- la specificità delle materie a cui i programmi scientifici vanno diretti, che richiede in genere personale specializzato per il loro utilizzo;
- la, in generale, bassa cultura informatica delle persone che li dovrebbero utilizzare.
L'ultimo punto potrebbe sembrare un paradosso. Tutto sommato, scienziati e ingegneri hanno a che fare con materie complesse, per cui ci si aspetterebbe una certa competenza nell'utilizzo di sistemi operativi e software adeguati al trattamento di queste problematiche. Nella mia esperienza, però, questa affermazione non corrisponde al vero: ho potuto constatare come anche all'interno di enti di ricerca predominino in genere sistemi operativi e software proprietari.
Non voglio dilungarmi su queste questioni, che tra l'altro tutti sicuramente conosciamo, ciascuno nel proprio ambito d'interesse. Questo articolo intende dare una panoramica delle possibilità che si hanno con il software libero di taglio scientifico, e in più si illustrerà qualche altra cosa. L'utilizzo di questi programmi non presuppone alcun tipo di conoscenze approfondite (anche se sono strumenti ottimi per chi le ha, docenti e professionisti), e può risultare proficuo a partire dagli studenti degli ultimi anni della scuola secondaria o dei primi anni di università.
L'articolo si divide in tre parti. Nella Parte I si fa una discussione sulle caratteristiche generali del software scientifico e le aree di utilizzo più importanti. La Parte II illustrerà alcuni software particolarmente interessanti tramite l'utilizzo di alcuni esempi, in modo da mostrare le loro potenzialità. La Parte III tratterà l'argomento dell'interfacciamento grafico, descrivendo le caratteristiche desiderabili in una buona interfaccia e illustrando una piccola applicazione web che consente l'interfacciamento a uno dei programmi descritti nella Parte II.
Di seguito verranno enumerate le tipologie di software che si hanno a disposizione e il loro relativo campo di utilizzo. All'interno di queste categorie saranno identificati alcuni problemi di media complessità, i quali forniranno un banco di prove per l'utilizzo di alcuni programmi che possiamo considerare rappresentativi delle rispettive categorie, e che saranno brevemente considerati nella Parte II di questo articolo.
Ambiti applicativi del software scientifico.
I problemi matematici possibili sono di una vastità incredibile. Tuttavia è possibile individuare alcuni temi fondamentali che sono i mattoni di base con i quali risolvere problemi più complessi. In genere i software disponibili offrono strumenti all'interno delle seguenti problematiche [1]:
Soluzione di equazioni lineari algebriche Sistemi di equazioni non lineari
Interpolazione e estrapolazione Minimizzazione e massimizzazione di funzioni
Integrazione di funzioni Eigensistemi
Calcolo funzionale Trasformate di Fourier e metodi spettrali
Funzioni speciali Descrizione statistica di dati
Numeri random Modelli di dati
Ordinamento Integrazione di equazioni differenziali ordinarie
Ricerca di radici Equazioni alle derivate parziali
L'ampiezza delle problematiche trattabili con software scientifico rende necessaria una codifica per un'identificazione univoca degli algoritmi. Una codifica molto usata è quella elaborata dal GAMS (Guide to Available Mathematical Software, http://gams.nist.gov), che è un sistema incrociato di indicizzazione e un repository virtuale di componenti software utilizzabili nelle scienze della computazione e in ingegneria. La codifica GAMS prevede le seguenti categorie, ciascuna identificata da un codice anlfanumerico:
A Aritmetica, analisi di errori K Approssimazione
B Teoria di numeri L Statistica, probabilità
C Funzioni elementari e speciali M Simulazione, modelli stocastici
D Algebra lineare N Data handling
E Interpolazione O Computazione simbolica
F Soluzione di equazioni non lineari P Geometria computazionale
G Ottimizzazione Q Grafica
H Integrazione, differenziazione R Routine di servizio
I Equazioni differenziali e integrali S Tool di sviluppo software
J Trasformate integrali Z Altro
Ognuna di queste categorie è articolata a sua volta in una serie di sottocategorie a più livelli, che consentono la codifica e la classificazione univoca di ogni algoritmo.
Classificazione del software utilizzabile in ambito scientifico
Dall'ottica di questo articolo è conveniente realizzare una classificazione sommaria del software disponibile, in modo da delimitare alcuni ambiti applicativi che consentano una maggior chiarezza espositiva. Queste categorie sono arbitrarie e da certi punti di vista sono comuni agli altri tipi di software. Vengono proposte due diverse classificazioni.
Classificazione dal punto di vista architetturale
Dal punto di vista dell'architettura, il software può essere suddiviso in due categorie principali:
- librerie: sono collezioni di codice che può essere riutilizzato in molteplici progetti software. Le librerie consentono di incorporare nei programmi delle funzioni già realizzate e testate, evitando di doverle riscrivere ogni volta. Sono importanti dal punto di vista del programmatore, permettendogli di usare porzioni di codice di programmi già realizzati da lui o da altri. Le librerie possono essere di due tipi:
- statiche: che sono collezioni di uno o più file oggetto che contengono il codice riutilizzabile precompilato. Ogni file oggetto costitutivo è anche chiamato modulo o membro. Le librerie statiche sono immagazzinate in un particolare formato con una tabella o mappa che collega il nome dei simboli ai moduli nei quali quel simbolo è definito. Questo velocizza il processo di "linkaggio" e compilazione. In genere le librerie statiche hanno la estensione .a (derivato dall'inglese archive) e sono "linkate" al programma durante il processo di compilazione;
- dinamiche: a differenza di quelle statiche, le librerie dinamiche sono "linkate" al programma durante il processo di runtime, cioè il caricamento in memoria del programma. La loro caratteristica principale è che consumano molte meno risorse delle librerie statiche, dato che sono caricate in memoria una sola volta per tutti i programmi che le devono utilizzare.
- programmi: alcuni programmi, e questo è particolarmente vero per i programmi di calcolo scientifico, sono composti da librerie che vengono chiamate da un frontend per dare accesso alle funzionalità del software. In genere è possibile usare tali librerie separatamente, linkandole ai propri programmi e richiamando le funzioni con la giusta sintassi.
Benché questa classificazione sia comune a tutti i tipi di software, l'inclusione qui è giustificata dal fatto che le librerie costituiscono una modalità particolarmente importante con cui viene rilasciato il software scientifico. Nella Parte II daremo alcuni esempi di librerie importanti.
Classificazione dal punto di vista applicativo
Dal punto di vista della natura dei problemi da trattare, il software scientifico può essere suddiviso nelle seguenti categorie, ognuna caratterizzante un grande ambito applicativo:
- utilità: sono l'analogo dei programmi di servizio per il sistema operativo, cioè programmi che realizzano delle funzioni specifiche di base. In genere sono di piccole dimensioni e accessibili esclusivamente attraverso la riga di comando. Un programma tipico è units;
- grafica: il software di grafica funzionale, bi e tridimensionale, è fondamentale all'interno delle problematiche legate al calcolo matematico e scientifico. I programmi di una certa complessità, come quelli che vedremo più avanti, hanno in genere dei moduli per la rappresentazione grafica. Un programma tipico è gnuplot;
- calcolo numerico: la categoria più importante. In genere i problemi che coinvolgono operazioni matematiche complesse vengono risolti in maniera numerica. Le possibilità vanno dal semplice calcolo delle radici di un polinomio al calcolo di sistemi di equazioni alle derivate parziali o di integrali multidimensionali. Un programma tipico è octave;
- calcolo simbolico: probabilmente il grande sconosciuto. L'utilizzo di questi programmi avviene in ambiti molto specifici, quando è necessario disporre della forma funzionale delle soluzioni ai problemi che si vogliono risolvere. Un programma tipico è maxima.
Un sistema standard per il calcolo scientifico
Di che cosa ho bisogno se voglio avere una stazione di lavoro autosufficiente per quanto riguarda il calcolo scientifico? Secondo me si devono avere i seguenti tipi di software:
- calcolatore a precisione arbitraria: è necessario disporre di un utility che consenta di realizzare calcoli numerici con un numero arbitrario di decimali, indipendentemente delle caratteristiche dell'hardware disponibile. Un ottimo programma per questo tipo di compiti è bc;
- software di grafica funzionale: per la rappresentazione grafica di funzioni matematiche in due e tre dimensioni, con la possibilità di esportare i grafici in diversi formati;
- software di calcolo numerico: che permetta la realizzazione di operazioni complesse, come calcolo di matrici e soluzioni di sistemi lineari. Un buon programma dovrebbe avere un linguaggio di programmazione interno che permetta l'estensione delle funzionalità di base;
- software per il lavoro in rete: se il sistema forma parte di un insieme di nodi in rete, allora può essere conveniente trattare tutti i nodi come una unità di calcolo a sé stante. In questo modo, dall'esterno della rete l'insieme di nodi viene visto come una unica macchina le cui potenzialità di calcolo sono la somma dei singoli nodi. Un sistema di questo tipo richiede software per il bilanciamento del carico di CPU e/o della memoria dei nodi, in modo da distribuire i job per ottimizzare le risorse a disposizione. Ci sono alcuni software molto potenti per questi compiti. Un esempio su tutti: openmosix.
Se in più si è un programmatore, un buon sistema dovrebbe prevedere:
- compilatori: ci vuole un compilatore C (gcc, http://gcc.gnu.org), ma dato che ancora molto software scientifico è scritto in FORTRAN, è conveniente disporre anche di un compilatore per questo linguaggio (g77, http://www.gnu.org/software/fortran/fortran.html). In alcuni casi ho trovato utile la trasformazione di sorgenti FORTRAN in C con l'utilità f2chttp://www.netlib.org/f2c/); (
- librerie: sono necessarie librerie di funzioni di qualità, soprattutto per non faticare a implementare algoritmi che in realtà sono già disponibili. Alcune di queste librerie sono veri gioielli: gsl, netlib. Ci sono anche delle librerie per la parallelizzazione delle proprie applicazioni (la distribuzioni dei programmi che si eseguono su più nodi simultaneamente), come pvm;
- software di supporto: alcuni software di sistema diventano il modo migliore per l'accesso alle applicazioni o la programmazione di compiti complessi. Programmi come apachehttp://www.apache.org) e il linguaggio perl (http://www.perl.com) possono divenire fondamentali in questi casi.
Se ti è piaciuto l'articolo , iscriviti al feed cliccando sull'immagine sottostante per tenerti sempre aggiornato sui nuovi contenuti del blog: