Da LINQ a F#

Il titolo di questo post dovrebbe in effetti vedere invertiti i due linguaggi che ho indicato; considerato però che LINQ è già presente su tutte le nostre macchine che hanno installato Visual Studio 2008 (e in alcuni casi anche la versione 2005), mentre F# si deve scaricare a parte, credo che all'esterno del mondo accademico gli sviluppatori che si avvicinano a F# siano in buona parte attratti dall'interesse di mantenere ed estendere i benefici offerti da LINQ al di fuori degli scenari dove finora lo hanno finora utilizzato.

Chi utilizza o ha anche solo assistito a qualche presentazione su LINQ , avrà percepito infatti i vantaggi di utilizzare un linguaggio funzionale che permette di passare da un tipo di programmazione imperativo ad uno dichiarativo; come dico a volte nei miei seminari, questa è un po' la differenza che passa fra salire su un taxi e dire al guidatore "giri a destra, avanti dritto, poi a sinistra etc" invece che semplicemente "mi porti all'aeroporto"; in teoria, se siete esperti della materia, forse con le vostre indicazioni riuscireste a guadagnare qualche minuto sull'arrivo, ma a costo di uno sforzo molto maggiore e rinunciando ad un risultato che era comunque garantito e mediamente efficiente.

Scopo di questo post non è comunque parlare di LINQ, di cui trovate risorse tecniche in abbondanza -chi è interessato può guardare per esempio le mie presentazioni e relativi laboratori che utilizzo nei seminari in Università- bensì di utilizzare i suoi concetti per comprendere come stanno evolvendo i linguaggi di programmazione -in particolare quelli legati al framework .NET- per coprire nuove esigenze legate all'era dello sviluppo concorrente e dello sviluppo a componenti.

LINQ fornisce infatti un assaggio di questi vantaggi; in particolare, integrato in C# e VB.NET permette manipolazione e trasformazione di dati di vario genere (XML, SQL, Flicker, Active Directory, SharePoint, ...), ma in ogni caso esposti in forma tabellare (riga/colonna, proprietà/valore, campo/record etc.).

F# mantiene ed estende le caratteristiche di LINQ come la combinazione di generics, programmazione funzionale, type inference, creazione di modelli dati a partire da modelli astratti (operazione chiamata in gergo expression reification) ed extension methods, ma in generale può essere utilizzato come linguaggio di sviluppo completo grazie a carattestiche quali efficienza (con prestazioni paragonabili a quelle di C# e C++), strong typing, scripting e piena integrazione con framework .NET e Visual Studio 2008. Diversamente dai linguaggi statici, esso supporta numerose tecniche tipiche dei linguaggi dinamici come reflection e property discovery ma al pari di C# può utilizzare funzioni imperative: non a caso, lo stesso autore lo definisce un linguaggio funzionale-imperativo.

La curva di apprendimento può essere un po' ripida e non troppo breve, ma si identificano poi alcune aree applicative in cui l'accoppiata F# / .NET si esprime al meglio; in particolare, grazie al fatto che F# deriva da CAML -con cui è quasi totalmente compatibile- e in generale dalla famiglia di linguaggi ML (il cui paradigma prevede alla base di tutto la valutazione di funzioni matematiche) e al tempo stesso sfrutta il modello a oggetti delle librerie .NET, risulta estremamente potente per realizzare applicazioni scientifico-matematiche e in generale algoritmi rivolti alla verifica di espressioni, calcolo parallelo, ottimizzazioni, verifiche hardware e software, analisi simboliche:

 vfsi-prototype

 

Vi lascio con un saluto a tema: scaricate e installate il compilatore (è del 19/05/08 la versione 1.9.4.17), create un nuovo progetto vuoto, scrivete queste righe e compilatele:

let () = System.Console.Write "Inserisci il tuo nome: "
let nome = "Ciao " + System.Console.ReadLine()
let () = System.Console.WriteLine nome

 

Mauro

 

Riferimenti: