Differenze tra le versioni di "Chiusura (informatica)"

m
r2.5.2) (Bot: Modifico: en:Closure (computer programming); modifiche estetiche
m (typo)
m (r2.5.2) (Bot: Modifico: en:Closure (computer programming); modifiche estetiche)
Le chiusure si rivelano utili quando una funzione ha bisogno di "ricordare" informazioni: ad esempio un parametro specifico per un'operazione di confronto, oppure il riferimento ad un [[widget]] in un [[callback]] di un'interfaccia grafica.
 
== Teoria e implementazione ==
Le chiusure, tipicamente, sono implementate con una speciale [[struttura dati]] che contiene un puntatore al codice della funzione ed una rappresentazione dell'ambiente lessicale della stessa al momento della sua creazione (per esempio l'insieme delle variabili disponibili e dei relativi valori).
 
Il concetto di chiusura può essere collegato a quello di ''attori'' del ''[[modello ad attori]]'' nella [[Concorrenza (informatica)|computazione concorrente]], dove i valori delle variabili nell'ambiente lessicale della funzione sono chiamati ''conoscenti'' dell'''attore''. Un'importante questione sulle chiusure nei linguaggi a [[Programmazione concorrente|paradigma concorrente]] è se le variabili di una chiusura possono essere aggiornate e, in tal caso, come possono essere sincronizzati questi cambiamenti. Gli ''attori'' sono una soluzione a questo problema (Will Clinger [[1981]]).
 
== Chiusure e funzioni ==
Le chiusure sono presenti in quei linguaggi che trattano le [[Funzione (informatica)|funzioni]] come ''oggetti di prima classe'' (''first-class object''), cioè consentono di passarle come parametri ad altre funzioni, restituirle come valori da altre funzioni, assegnarle a variabili, ecc., come si fa con i tipi più semplici, quali ([[Stringa (informatica)|stringhe]], [[Numero intero|interi]], ecc.).
 
La chiusura <tt>f</tt> viene creata nell'ambiente più esterno, e fa quindi riferimento alla <tt>y</tt> con valore 1 e per questo, il risultato che si ottiene è 4, non 5.
 
== Utilizzi delle chiusure ==
Le chiusure hanno molti utilizzi:
* Possono essere usate per aumentare l'astrazione e la versatilità di alcune funzioni. Per esempio, una funzione per l'[[Algoritmo di ordinamento|ordinamento]] di una lista di valori può accettare una chiusura come parametro, la quale confronta due valori da ordinare secondo un criterio definito dall'utente.
Nota: a volte vengono definite ''chiusure'' anche le strutture dati che combinano un ambiente lessicale con entità che non sono funzioni, ma comunque il termine solitamente si riferisce specificamente alle funzioni.
 
== Linguaggi di programmazione con le chiusure ==
Lo [[Scheme]] è stato il primo linguaggio di programmazione ad avere delle chiusure pienamente generali e con scoping lessicale. Virtualmente, tutti i [[Programmazione funzionale|linguaggi di programmazione funzionali]] e tutti i linguaggi di programmazione orientati agli oggetti derivati dallo [[Smalltalk]] supportano qualche forma di chiusura. Alcuni tra i maggiori linguaggi di programmazione a supportare le chiusure sono:
* [[ActionScript]]
* [[PHP]] dalla versione 5.3
 
== Simulare le chiusure ==
In [[C (linguaggio)|C]] è possibile usare la [[Parola chiave (informatica)|parola chiave]] "static" prima della dichiarazione di una variabile locale. Una variabile static conserva il suo valore attraverso le varie chiamate alla funzione.
Questo vale anche per il [[C++]].
 
* In [[C++]] e [[D (linguaggio di programmazione)|D]], i programmatori possono definire classi che fanno l'[[Overloading|overload]] dell'operatore <tt>()</tt> (operatore di applicazione della funzione). Questo genere di classi sono chiamate [[Oggetto funzione|oggetti funzione]] o, occasionalmente, ''funtori'' (anche se quest'ultimo termine è ambiguo, dato che in altri linguaggi ha un significato molto diverso). Questi oggetti funzione si comportano in modo simile alle funzioni nei linguaggi di programmazione funzionali, ma sono diversi dalle chiusure nel fatto che le variabili del loro ambiente non vengono "catturate". Per simulare una vera chiusura, si può immaginare di mettere tutte le variabili globali in una singola struttura (<tt>struct</tt>) e di passarne una copia ad un oggetto funzione.
* Il [[C_sharpC sharp|C#]] permette ad un ''delegato'' (<tt>delegate</tt>) di memorizzare un riferimento ad un metodo di un'istanza di una classe (cioè un oggetto); quando verrà chiamato questo delegato, il metodo verrà invocato per quella particolare istanza. Per simulare una vera chiusura, si può creare un'istanza di una classe (cioè un oggetto) con gli attributi necessari. Un altro modo per simulare le chiusure è stato introdotto dalla versione 2.0 del linguaggio, con l'utilizzo dei '''metodi anonimi'''.
 
== Voci correlate ==
* [[Ambiente (programmazione)|Ambiente]]
* [[Funzione (informatica)|Funzione]]
* [[Continuazione]]
 
== Bibliografia ==
* Will Clinger. ''[https://dspace.mit.edu/handle/1721.1/6935 Foundations of Actor Semantics]''. MIT Mathematics Doctoral Dissertation. June 1981.
 
[[Categoria:Teorie della programmazione]]
[[de:Closure]]
[[el:Κλείσιμο (επιστήμη υπολογιστών)]]
[[en:Closure (computer scienceprogramming)]]
[[es:Clausura (informática)]]
[[et:Sulund (informaatika)]]
372 733

contributi