Programmazione generica: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Tradotta sezione "Programming language support for genericity" |
m Bot: numeri di pagina nei template citazione |
||
(19 versioni intermedie di 6 utenti non mostrate) | |||
Riga 1:
{{T|inglese|informatica|marzo 2024}}
In [[informatica]], la '''programmazione generica''' è un [[paradigma di programmazione]] in cui gli [[algoritmo|algoritmi]] accettano come parametri le [[tipo di dato|tipologie di dati]] da trattare, oltre ai [[dato|dati]] veri e propri. Questo approccio, introdotto nel [[ML (linguaggio di programmazione)|linguaggio ML]] nel 1973,<ref name="Lee2008">
{{cita libro| autore = Kent D. Lee| titolo = Programming Languages: An Active Learning Approach| url = https://books.google.com/books?id=OuW5dC2O99AC&pg=PA9|data=15 dicembre 2008| editore = Springer Science & Business Media| ISBN = 978-0-387-79422-8| pp = 9-10| lingua = en}}
</ref><ref>
{{cita conferenza|autore = R. Milner|autore2 = L. Morris|autore3 = M. Newey|anno = 1975|titolo = A Logic for Computable Functions with Reflexive and Polymorphic Types|conferenza = Proceedings of the Conference on Proving and Improving Programs|lingua = en}}
</ref>
permette di scrivere codice generico, del quale possono essere auto-generate multiple versioni specializzate che differiscono solo per i tipi di dati trattati, riducendo così la necessità di scrivere codici essenzialmente duplicati.
== Storia ==
La programmazione generica venne introdotta al pubblico generale con la sua implementazione in [[Ada (linguaggio di programmazione)|Ada]] nel 1977. Con l'introduzione dei ''[[template (programmazione)|template]]'' in [[C++]], le tecniche di programmazione generica sono diventate parte del repertorio professionale dei [[architetto (informatica)|progettisti]] di [[libreria (software)|librerie]]. Queste tecniche vennero ulteriormente sviluppate e i "tipi parametrizzati" vennero introdotti nell'influente libro ''[[Design Patterns]]'' del 1994.<ref name="cita GoF 1994">{{cita|GoF 1994}}.</ref>
Riga 30 ⟶ 14:
Nuove tecniche vennero introdotte da [[Andrei Alexandrescu]] nel suo libro ''[[Modern C++ Design: Generic Programming and Design Patterns Applied]]'' del 2001. Successivamente il [[D (linguaggio di programmazione)|linguaggio D]] implementò le stesse idee.
Le funzionalità di programmazione generica sono conosciute come ''generics'' in [[Ada (linguaggio di programmazione)|Ada]], [[C sharp|C#]], [[Delphi]], [[Eiffel (linguaggio di programmazione)|Eiffel]], [[Java (linguaggio di programmazione)|Java]], [[Nim (linguaggio di programmazione)|Nim]], [[Python]], [[Go (linguaggio di programmazione)|Go]], [[Rust (linguaggio di programmazione)|Rust]], [[Swift (linguaggio di programmazione)|Swift]], [[TypeScript]], e [[Visual Basic .NET]]. Sono conosciute come "polimorfismo parametrico" in [[ML (linguaggio di programmazione)|ML]], [[Scala (linguaggio di programmazione)|Scala]], [[Julia (linguaggio di programmazione)|Julia]] e [[Haskell (linguaggio di programazione)|Haskell]].
Il termine "programmazione generica" fu coniato originariamente da [[David Musser]] e [[Alexander Stepanov]]<ref name="cita Musser & Stepanov 1989">{{cita|Musser & Stepanov 1989}}.</ref> in un senso più specifico di quello descritto sopra, per descrivere un paradigma di programmazione in cui i requisiti fondamentali sui tipi sono astratti dagli esempi concreti di algoritmi e [[struttura dati|strutture dati]], e formalizzati come "[[concetti (programmazione)|concetti]]", con [[funzione (programmazione)|funzioni generiche]] implementate in termini di questi concetti, tipicamente utilizzando i meccanismi di generalizzazione dei linguaggi come descritti sopra.
Riga 45 ⟶ 29:
Di seguito verranno presentate le funzionalità di programmazione generica di diversi linguaggi di programmazione. Per uno studio specifico che compari l'adeguatezza di vari meccanismi di programmazione generica consulta il testo in nota.<ref name="cita Garcia 2007">{{cita|Garcia 2007}}.</ref>
=== Nei linguaggi orientati agli oggetti ===
Nel creare [[classe (informatica)|classi]] container nei linguaggi a [[tipizzazione statica]] risulta inconveniente scrivere un'implementazione per ogni tipo di dato che si vuole trattare, specialmente se il codice per ogni tipo è virtualmente identico. Per esempio in [[C++]] questa duplicazione di codice può essere evitata definendo una classe template:
<syntaxhighlight lang="Cpp" rows>
template <typename T>
class List
{
// Class contents.
};
List<Animal> list_of_animals;
List<Car> list_of_cars;
</syntaxhighlight>
Nell'esempio sopra il simbolo <code>T</code> è un ''placeholder''<ref>{{lett|segnaposto|lingua=it}}</ref> per il tipo che viene specificato specificato all'atto di creazione della lista (righe 6-7).
Questi "contenitori di tipo <code>T</code>", comunemente chiamati ''template'', permettono di riutilizzare il codice di una classe variandone i tipi di dato utilizzati all'interno, posto che determinati "[[contratto (programmazione)|contratti]]" come i [[sottoclasse (informatica)|sotto-tipi]] e le [[firma (programmazione)|segnature]] siano mantenuti.
Questo meccanismo di programmazione generica non deve essere confuso con il [[polimorfismo (informatica)|polimorfismo]], che è l'utilizzo [[algoritmo|algoritmico]] di sotto-classi equivalenti: per esempio, una lista di oggetti di tipo <code>MovingObject</code><ref>{{lett|Oggetto in movimento|lingua=it}}</ref> contenente oggetti di tipo <code>Animal</code> e <code>Car</code>. I template possono essere usati anche per realizzare funzioni indipendenti dai tipi come nell'esempio di seguito:
<syntaxhighlight lang="Cpp">
// "T&" denota un riferimento ad un oggetto di tipo T
template <typename T>
void swap(T& a, T& b)
{
T temp = b;
b = a;
a = temp;
}
std::string world = "World!";
std::string hello = "Hello, ";
swap(world, hello);
std::cout << world << hello << ‘\n’;
</syntaxhighlight>
Il costrutto <code>template</code> del C++ utilizzato sopra è largamente citato come il costrutto di programmazione generica che ha popolarizzato la nozione tra programmatori e progettisti di linguaggi, e supporta molti [[idioma|idiomi]] di programmazione generica. Il linguaggio D offre template basati su quelli del C++ ma con una sintassi semplificata.<ref name="dlang templates">{{cita web|url=https://dlang.org/articles/templates-revisited.html|titolo=Templates Revisited|accesso=2024-03-30|lingua=en}}</ref>
Java offre funzionalità di programmazione generica, sintatticamente basate su quelle del C++, a partire da J2SE 5.0.<ref name="JDK8 Generics">{{cita web|url=https://docs.oracle.com/javase/tutorial/java/generics/|titolo=Java Generics|accesso=2024-03-30|lingua=en}}</ref>
[[C sharp|C#]] 2.0, [[Oxygene (linguaggio di programmazione)|Oxygene]] 1.5 e [[Visual Basic .NET]] 2005 hanno costrutti che sfruttano il supporto per i ''generic'' presenti nel [[.NET Framework]] dalla versione 2.0.<ref name=".NET Generics">{{cita web|url=https://learn.microsoft.com/it-it/dotnet/standard/generics/|titolo=Generics in .NET|data=2024-01-27|accesso=2024-03-30}}</ref>
==== Template (C++) ====
{{vedi anche|C++#Template}}
C++ usa i ''template'' per abilitare le tecniche di programmazione generica.<ref>{{cita web|url=https://en.cppreference.com/w/cpp/language/templates|titolo=C++ templates|accesso=2024-03-30|lingua=en}}</ref>
La [[libreria standard C++|libreria standard del C++]] include la ''[[Standard Template Library]]'' (STL) che offre un [[framework]] di ''template'' per strutture dati e algoritmi comuni.<ref>{{cita web|url=https://en.cppreference.com/w/cpp|titolo=C++ Standard Template Library index|accesso=2024-03-30|lingua=en}}</ref>
I ''template'' in C++ possono anche essere usati per la [[metaprogrammazione]], costruendo delle espressioni che vengono valutate durante la [[compilazione]], piuttosto che in fase di [[esecuzione (informatica)|esecuzione]]; Si parla in questo caso di ''[[template metaprogramming]]''. Attraverso l'uso della "specializzazione dei template" i ''template'' del C++ costituiscono un sistema ''[[turing complete]]''.<ref>
{{cita web
|url = https://en.cppreference.com/w/cpp/language/template_metaprogramming
|titolo = Template metaprogramming
|accesso = 2024-03-30
|lingua = en
}}
</ref>
A partire da [[C++11]] il linguaggio supporta i ''template'' variadici, ovvero ''template'' che accettano un numero variabile di parametri.<ref>
{{Cita web|url=http://www.jot.fm/issues/issue_2008_02/article2/|titolo=Variadic Templates for C++0x|autore=Douglas Gregor e Jaakko Järvi|lingua=en}}
</ref>
Questa funzionalità permette di gestire in maniera ''type-safe'' tutte quelle situazioni che classicamente avrebbero richiesto una "semplice" [[funzione variadica]], con tutte le restrizioni e i compromessi del caso.<ref>
{{Cita libro|autore=[[Bjarne Stroustrup]]|titolo=C++ Linguaggio, libreria standard, principi di programmazione|edizione=4|capitolo=28.6 Template Variadici|anno=2015|editore=Pearson Italia|isbn=9788865184486}}
</ref>
== Note ==
Riga 55 ⟶ 98:
; Libri
* {{cita libro|autore = Joseph Albahari|titolo = C# 10 in a Nutshell|editore = O'Reilly|ISBN= 978-1-098-12195-2|edizione = 1|anno = 2022|lingua = en}}
* {{cita libro|autore = Joshua Bloch|titolo = Effective Java: Programming Language Guide|editore = Addison-Wesley|edizione = 3|ISBN = 978-0134685991|anno = 2018|lingua = en}}
* {{cita libro|autore = [[David Musser]]|autore2 = [[Alexander Stepanov]]|titolo = Symbolic and Algebraic Computation: International symposium ISSAC 1988|capitolo = Generic programming|serie = Lecture Notes in Computer Science|volume = 358|pp = 13-25|anno = 1989|lingua = en|doi = 10.1007/3-540-51084-2_2|ISBN = 978-3-540-51084-0|cid = Musser & Stepanov 1989}}
* {{cita libro|autore = Erich Gamma|autore2 = Richard Helm|autore3 = Ralph Johnson|autore4 = John Vlissides|data = 1994|titolo = Design Patterns|editore = Addison-Wesley|lingua = en|ISBN = 0-201-63361-2|url = https://archive.org/details/designpatternsel00gamm|cid = GoF 1994}}
; Conferenze
* {{cita conferenza|autore = [[Bjarne Stroustrup]]|titolo = Evolving a language in and for the real world: C++ 1991-2006|conferenza = ACM HOPL 2007|url = https://www.research.att.com/~bs/hopl-almost-final.pdf|organizzazione = [[Association for Computing Machinery]]|anno = 2007|lingua = en}}
; Pubblicazioni
* {{cita pubblicazione|autore = R. Garcia|autore2 = J. Ja ̈rvi|autore3 = A. Lumsdaine|autore4 = J. Siek|autore5 = J. Willcock|titolo = An extended comparative study of language support for generic programming|rivista = Journal of Functional Programming|volume = 17|numero = 2|editore = Cambridge University Press|data = marzo 2007|lingua = en|doi = 10.1017/S0956796806006198|cid = Garcia 2007}}
== Voci correlate ==
* [[Paradigma di programmazione]]
* [[Polimorfismo (informatica)]]
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC|generic programming|generic programming}}
* {{cita web|url=https://www.generic-programming.org|titolo=Generic programming|editore=The Trustees of Indiana University|lingua=en}}
* {{cita web|url=http://www.stepanovpapers.com/|urlarchivio=https://web.archive.org/web/20240309092114/http://www.stepanovpapers.com/|titolo=Raccolta delle pubblicazioni di Alexander A. Stepanov|lingua=en}}
{{Controllo di autorità}}
{{Portale|informatica}}
[[Categoria:Programmazione generica]]
|