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
== 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
== 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
== Funzioni di ordine superiore ==
|