Programmazione generica: differenze tra le versioni

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
Contenuto cancellato Contenuto aggiunto
m sistemazione fonti e fix vari
Riga 2: Riga 2:


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">
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}}
{{cita libro
| autore = Kent D. Lee
| titolo = Programming Languages: An Active Learning Approach
| url = https://books.google.com/books?id=OuW5dC2O99AC&pg=PA9
| data = 2008-12-15
| editore = Springer Science & Business Media
| ISBN = 978-0-387-79422-8
| pp = 9–10
| lingua = en
}}
</ref><ref>
</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|titolo-libro = Proceedings of the Conference on Proving and Improving Programs|lingua = en}}
{{cita conferenza
|autore = R. Milner
|autore2 = L. Morris
|autore3 = M. Newey
|anno = 1975
|titolo = A Logic for Computable Functions with Reflexive and Polymorphic Types
|titolo-libro = Proceedings of the Conference on Proving and Improving Programs
|lingua = en
}}
</ref>
</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.
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.
Riga 29: Riga 12:
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.
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]].
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.
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 89: Riga 72:


A partire da [[C++11]] il linguaggio supporta i ''template'' variadici, ovvero ''template'' che accettano un numero variabile di parametri.<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}}
{{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>
</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>
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}}
{{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>
</ref>


Riga 115: Riga 85:
; Libri
; 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
* {{cita libro|autore = Joshua Bloch|titolo = Effective Java: Programming Language Guide|editore = Addison-Wesley|edizione = 3|ISBN = 978-0134685991|anno = 2018|lingua = en}}
|autore = Joseph Albahari
* {{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}}
|titolo = C# 10 in a Nutshell
* {{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}}
|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
; 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}}
* {{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
; 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}}
* {{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 ==
== Voci correlate ==
Riga 203: Riga 109:
* {{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}}
* {{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}}


{{Portale|Informatica}}
{{Portale|informatica}}


[[Categoria:Programmazione generica]]
[[Categoria:Programmazione generica]]

Versione delle 15:53, 28 mar 2024

In informatica, la programmazione generica è un paradigma di programmazione in cui gli algoritmi accettano come parametri le tipologie di dati da trattare, oltre ai dati veri e propri. Questo approccio, introdotto nel linguaggio ML nel 1973,[1][2] 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.

La programmazione generica venne introdotta al pubblico generale con la sua implementazione in Ada nel 1977. Con l'introduzione dei template in C++, le tecniche di programmazione generica sono diventate parte del repertorio professionale dei progettisti di librerie. Queste tecniche vennero ulteriormente sviluppate e i "tipi parametrizzati" vennero introdotti nell'influente libro Design Patterns del 1994.[3]

Nuove tecniche vennero introdotte da Andrei Alexandrescu nel suo libro Modern C++ Design: Generic Programming and Design Patterns Applied del 2001. Successivamente il linguaggio D implementò le stesse idee.

Le funzionalità di programmazione generica sono conosciute come generics in Ada, C#, Delphi, Eiffel, Java, Nim, Python, Go, Rust, Swift, TypeScript, e Visual Basic .NET. Sono conosciute come "polimorfismo parametrico" in ML, Scala, Julia e Haskell.

Il termine "programmazione generica" fu coniato originariamente da David Musser e Alexander Stepanov[4] 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 strutture dati, e formalizzati come "concetti", con funzioni generiche implementate in termini di questi concetti, tipicamente utilizzando i meccanismi di generalizzazione dei linguaggi come descritti sopra.

Supporto nei linguaggi di programmazione

Le funzionalità di programmazione generica sono presenti nei linguaggi di programmazione ad alto livello almeno dagli anni '70, in linguaggi come ML, CLU e Ada, e sono stati successivamente adottate da molti linguaggi orientati agli oggetti, come BETA, C++, D, Eiffel, Java e Trellis/Owl.

La genericità è implementata e supportata differentemente nei vari linguaggi di programmazione; il termine "generico" è anche stato usato in modo diverso in vari contesti di programmazione. Per esempio, in Forth il compilatore può eseguire codice durante la compilazione e il programmatore può definire nuove keyword e implementazioni per queste sul momento. Esso ha poche "parole" che espongono il comportamento del compilatore e quindi offre naturalmente capacità di "generalizzazione" che, altrimenti, non sono presentate come tali in molti testi di riferimento. Similmente, i linguaggi a tipizzazione dinamica, e specialmente quelli interpretati, solitamente lavorano in logica generica per default: in questi infatti sia le operazioni di passaggio dei valori alle funzioni che le assegnazioni sono indifferenti al tipo dei dati. Questo comportamento è spesso sfruttato per costruire astrazioni e scrivere codice conciso, ma non è tipicamente inteso come meccanismo di programmazione generica poiché è una diretta conseguenza della natura del sistema dei tipi utilizzata dal linguaggio.[senza fonte] Il termine è stato usato nella programmazione funzionale, specificatamente in linguaggi tipo Haskell, che usano un sistema dei tipi strutturale dove i tipi sono sempre parametrici e il codice che li utilizza è generico.

I vettori e le strutture possono essere visti come tipi generici predefiniti. Ogni utilizzo di un tipo vettore o struttura istanzia un nuovo tipo concreto, oppure riutilizza un tipo precedentemente istanziato. I tipi elemento-vettore o elemento-struttura sono tipi parametrizzati, che sono usati per istanziare i corrispondenti tipi generici. Tutto ciò è generalmente integrato nel compilatore e la sintassi differisce da altri costrutti generici. Alcuni linguaggi di programmazione estensibili provano ad unificare i tipi generici integrati e quelli definiti dal programmatore.

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.[5]

Nei linguaggi orientati agli oggetti

Nel creare 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:

template <typename T>
class List
{
  // Class contents.
};

List<Animal> list_of_animals;
List<Car> list_of_cars;

Nell'esempio sopra il simbolo T è un placeholder[6] per il tipo che viene specificato specificato all'atto di creazione della lista (righe 6-7). Questi "contenitori di tipo T", comunemente chiamati template, permettono di riutilizzare il codice di una classe variandone i tipi di dato utilizzati all'interno, posto che determinati "contratti" come i sotto-tipi e le segnature siano mantenuti. Questo meccanismo di programmazione generica non deve essere confuso con il polimorfismo, che è l'utilizzo algoritmico di sotto-classi equivalenti: per esempio, una lista di oggetti di tipo MovingObject[7] contenente oggetti di tipo Animal e Car. I template possono essere usati anche per realizzare funzioni indipendenti dai tipi come nell'esempio di seguito:

// "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;

Il costrutto template 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 idiomi di programmazione generica. Il linguaggio D offre template basati su quelli del C++ ma con una sintassi semplificata. Java offre funzionalità di programmazione generica, sintatticamente basate su quelle del C++, a partire da J2SE 5.0.

C# 2.0, 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.

Template (C++)

Lo stesso argomento in dettaglio: C++ § Template.

C++ usa i template per abilitare le tecniche di programmazione generica. La libreria standard del C++ include la Standard Template Library (STL) che offre un framework di template per strutture dati e algoritmi comuni. 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. Attraverso l'uso della "specializzazione dei template" i template del C++ costituiscono un sistema turing complete.

A partire da C++11 il linguaggio supporta i template variadici, ovvero template che accettano un numero variabile di parametri.[8] 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.[9]

Note

  1. ^ (EN) Kent D. Lee, Programming Languages: An Active Learning Approach, Springer Science & Business Media, 15 dicembre 2008, pp. 9–10, ISBN 978-0-387-79422-8.
  2. ^ (EN) R. Milner, L. Morris e M. Newey, A Logic for Computable Functions with Reflexive and Polymorphic Types, 1975.
  3. ^ GoF 1994.
  4. ^ Musser & Stepanov 1989.
  5. ^ Garcia 2007.
  6. ^ lett. "segnaposto" in italiano
  7. ^ lett. "Oggetto in movimento" in italiano
  8. ^ (EN) Douglas Gregor e Jaakko Järvi, Variadic Templates for C++0x, su jot.fm.
  9. ^ Bjarne Stroustrup, 28.6 Template Variadici, in C++ Linguaggio, libreria standard, principi di programmazione, 4ª ed., Pearson Italia, 2015, ISBN 9788865184486.

Bibliografia

Libri
Conferenze
Pubblicazioni

Voci correlate

Collegamenti esterni

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica