Programmazione funzionale: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m deadlink fix: content removed from google cache, found on web archive
m piped link superflui
Riga 13:
 
== Storia ==
Il [[Lambda calcolo]] può essere considerato il primo linguaggio di programmazione funzionale, anche se non fu progettato per essere eseguito su una macchina. Il Lambda calcolo è un modello di computazione progettato da [[Alonzo Church]] negli [[Anni 1930|anni trenta]] che fornisce un modo molto formale di descrivere la valutazione di funzioni. Il primo linguaggio di programmazione funzionale, progettato per un computer, fu l'[[Information Processing Language]] (IPL), sviluppato da Newell, Shaw e Simon alla [[RAND Corporation]] per il computer [[JOHNNIAC]], a metà degli [[Anni 1950|anni cinquanta]]. Un linguaggio funzionale molto migliorato fu il [[Lisp|LISP]], sviluppato da [[John McCarthy]], mentre si trovava al ''[[Massachusetts Institute of Technology]]'', per i computer della serie [[IBM 700/7000]], alla fine degli anni '50. Anche se non era un linguaggio puramente funzionale, il LISP introdusse molte delle caratteristiche oggi trovate nei moderni linguaggi funzionali. Il linguaggio [[Scheme]] fu un successivo tentativo di semplificare e migliorare il LISP. Negli [[Anni 1970|anni settanta]], all'[[Università di Edimburgo]] fu creato il [[ML programming language|linguaggio ML]] e all'[[Università di Kent]] [[David Turner]] creò il [[linguaggio Miranda]]. Il [[Haskell (linguaggio)|linguaggio Haskell]] fu creato e rilasciato alla fine degli [[Anni 1980|anni ottanta]] come tentativo di mettere insieme molte delle idee della ricerca sulla programmazione funzionale.
 
== Confronto con la programmazione imperativa ==
Se paragonata alla programmazione imperativa, può sembrare che la programmazione funzionale manchi di molti costrutti spesso (ma incorrettamente) ritenuti essenziali per un linguaggio imperativo, come il [[C (linguaggio)|C]] o il [[Pascal (linguaggio)|Pascal]]. Per esempio, nella programmazione funzionale rigorosa, non c'è alcuna esplicita allocazione di memoria o assegnazione di variabile, ma, comunque, queste operazioni avvengono automaticamente quando una funzione è invocata: l'allocazione di memoria avviene per creare lo spazio necessario per i parametri e il valore di ritorno e l'assegnazione avviene per copiare i parametri nel nuovo spazio allocato e per copiare il valore di ritorno alla funzione chiamante. Entrambe le operazioni possono avvenire solo alla chiamata di una funzione e al ritorno da essa e quindi gli effetti collaterali sono eliminati. Eliminando gli effetti collaterali dalle funzioni, si ottiene ciò che viene chiamata ''[[trasparenza referenziale]]'', che assicura che il risultato di una funzione sia lo stesso per uno stesso insieme di parametri, indifferentemente da quando e dove questa funzione venga valutata. La trasparenza referenziale rende molto più facile sia la dimostrazione della correttezza del programma sia l'identificazione automatica delle computazioni indipendenti per l'esecuzione parallela.
 
Le [[Iterazione|iterazioni]], un altro costrutto della programmazione imperativa, sono ottenute attraverso il costrutto più generale delle chiamate ricorsive a funzioni. Le [[Funzione ricorsiva|funzioni ricorsive]] invocano se stesse permettendo di eseguire più e più volte una stessa operazione. Può essere dimostrato che un'iterazione è equivalente ad uno speciale tipo di ricorsione chiamata ''[[tail recursion]]''. La ricorsione nella programmazione funzionale può assumere molte forme e, in generale, è una tecnica più potente dell'iterazione. Per questa ragione, quasi tutti i linguaggi imperativi la supportano (con la notevole eccezione del [[Fortran|Fortran 77]] e del [[COBOL|Cobol]], prima del [[2002]]).
 
== Linguaggi di programmazione funzionali ==
Riga 51:
Rimuovendo questa mancanza di informazioni circa il dominio di una funzione, i linguaggi di programmazione funzionali offrono la possibilità di programmi più puliti che sono più facili da progettare e sottoporre a [[debugging]]. Comunque, questi non sono gli unici vantaggi.
 
Molti programmatori abituati ai paradigmi imperativi trovano difficile imparare la programmazione funzionale, la quale richiede un approccio nello scrivere i programmi completamente differente. Questa difficoltà insieme al fatto che gli ambienti dei linguaggi funzionali non hanno la stessa quantità di strumenti e librerie disponibili dei linguaggi tradizionali, sono tra le ragioni principali per cui la programmazione funzionale ha avuto poco utilizzo nell'industria del software. I linguaggi funzionali sono rimasti largamente di dominio accademico e hobbystico e quei linguaggi che hanno avuto un maggiore utilizzo sono linguaggi funzionali 'non puri', come l'[[Erlang (linguaggio)|Erlang]] e il [[Common LISP|Common Lisp]]. Si potrebbe dire che la maggiore influenza dei linguaggi funzionali sull'industria del software sia stata data da quei programmatori, nati in ambito accademico, che hanno usato lo stile di programmazione funzionale 'non puro' con i tradizionali linguaggi di programmazione imperativi.
 
== Funzioni di ordine superiore ==